From 9273f3d5c6cb12c13c4da5b40f715b4c14da0291 Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:41:47 -0600 Subject: [PATCH 01/15] ND2 ->Brock Code->Baxter Made a ton of changes! --- Analysis/CellAnalysis/Plot_Fluorescence.m | 2 + BF_Functions/CytNucWaterShed.m | 21 ++ BF_Functions/Cytosol.m | 27 +++ BF_Functions/Gal8.m | 26 +++ BF_Functions/NuclearStain.m | 34 +++ BF_Functions/Rhoda.m | 25 +++ BF_Functions/m_2021_12_30.m | 256 ++++++++++++++++++++++ BF_Gal8_Settings.csv | 84 +++++++ Files/Settings/Brock/Settings.csv | 84 +++++++ 9 files changed, 559 insertions(+) create mode 100644 BF_Functions/CytNucWaterShed.m create mode 100644 BF_Functions/Cytosol.m create mode 100644 BF_Functions/Gal8.m create mode 100644 BF_Functions/NuclearStain.m create mode 100644 BF_Functions/Rhoda.m create mode 100644 BF_Functions/m_2021_12_30.m create mode 100644 BF_Gal8_Settings.csv create mode 100644 Files/Settings/Brock/Settings.csv diff --git a/Analysis/CellAnalysis/Plot_Fluorescence.m b/Analysis/CellAnalysis/Plot_Fluorescence.m index 52cdc70..5e4a1c0 100644 --- a/Analysis/CellAnalysis/Plot_Fluorescence.m +++ b/Analysis/CellAnalysis/Plot_Fluorescence.m @@ -66,6 +66,8 @@ function Plot_Fluorescence(aCells, aAxes, aChannel, varargin) fluor = c.regionProps.(['FluorMax' aChannel]); case 'avg' fluor = c.regionProps.(['FluorAvg' aChannel]); + case 'test' + fluor = c.regionProps.(['FluorAvg' aChannel]); case 'tot' fluor = c.regionProps.(['FluorTot' aChannel]); if strcmpi(aYUnit, 'microns') diff --git a/BF_Functions/CytNucWaterShed.m b/BF_Functions/CytNucWaterShed.m new file mode 100644 index 0000000..ff0c048 --- /dev/null +++ b/BF_Functions/CytNucWaterShed.m @@ -0,0 +1,21 @@ +function [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4) +%UNTITLED4 Summary of this function goes here +% Detailed explanation goes here +cytsize=size(cyt); + border = ones(cytsize); + border(2:end-1,2:end-1) = 0; + n_maxs=imerode(Nuc_bw4,strel('disk',1)); + n_maxs=bwareaopen(n_maxs,100); + h=imhmin(CytTopHat,1); + h_c=imcomplement(h); + h_c_min=imimposemin(h_c, n_maxs); + L_n = watershed(h_c_min); + L_n(~cyt_bw4) = 0; + borderInverse=~border; + L_n(~borderInverse) = 0; + howdy=L_n; + Cyt_WS=imfill((howdy),4,'holes'); + Cyt_WS_perim = imdilate(bwperim(Cyt_WS),strel('disk',1)); + +end + diff --git a/BF_Functions/Cytosol.m b/BF_Functions/Cytosol.m new file mode 100644 index 0000000..029f0ea --- /dev/null +++ b/BF_Functions/Cytosol.m @@ -0,0 +1,27 @@ +function [CytBright,CytArea,CytCytOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here + CytTopHat=imtophat(cyt,CytTophatDisk); % Clean image with tophat filter for thresholding + CytOpen=imerode(CytTopHat,CytOpenDisk); + CytOpen=imreconstruct(CytOpen,CytTopHat); + cyt_eq =imadjust(CytTopHat,[0 0.25],[]); %Make it easy to see + + CytMaxValue= CytMax*intmax(class(cyt)); + CytOverbright=CytOpen>CytMaxValue; + CytBright=CytOpen; + CytBright(CytOverbright)=0; + CytMT1=multithresh(CytBright,20); %Calculate 20 brightness thresholds for image + CytQuant1=imquantize(CytBright,CytMT1); %Divide Image into the 20 brightness baskets + CytBrightEnough=CytQuant1>CytLow; + + CytPos=CytBright; + CytPos(~CytBrightEnough)=0; + cyt_bw2=imerode(CytPos,CytErodeDisk); + cyt_bw3 = bwareaopen(cyt_bw2, 2000); %%Be sure to check this threshold + cyt_bw4 = imclose(cyt_bw3, CytCloseDisk); + CytPos(~cyt_bw4)=0; + cyt_bw4_perim = imdilate(bwperim(cyt_bw4),strel('disk',3)); + CytArea = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); + CytCytOverlay = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); +end + diff --git a/BF_Functions/Gal8.m b/BF_Functions/Gal8.m new file mode 100644 index 0000000..02ec903 --- /dev/null +++ b/BF_Functions/Gal8.m @@ -0,0 +1,26 @@ +function [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here +Gal8=wiener2(cyt); +Gal8TH=imtophat(Gal8,Gal8TophatDisk); +Gal8Open=imopen(Gal8TH,Gal8OpenDisk); + +Gal8MinValue= Gal8MinThreshold*intmax(class(cyt)); +Gal8Quant2=Gal8Open-Gal8MinValue; +Gal8Quant2(Gal8Quant2<=0)=0; +Gal8Quant3=bwareaopen(Gal8Quant2,4); +Gal8Quant3(~Cyt_WS)=0; +Gal8Quant3(~CytPos)=0; +Gal8Quant3=imdilate(Gal8Quant3,Gal8DilateDisk); +Gal8Quant4=imdilate(Gal8Quant3,Gal8OutlineDisk); +Gal8Quant5=imbinarize(Gal8Quant4-Gal8Quant3); +GalPals=cyt; +GalPals(~Gal8Quant3)=0; + +Puncta=regionprops(Gal8Quant3,cyt,'Area','Centroid','MeanIntensity'); +Ring=regionprops(Gal8Quant5,cyt,'Area','Centroid','MeanIntensity'); %need to figure out way to subtract out surrounding brightness for each individual Point +RingMeanInt=2; %need to figure out way to subtract out surrounding brightness for each individual Point +Gal8Signal=sum((vertcat(Puncta.MeanIntensity).*vertcat(Puncta.Area))); +% Gal8Signal=Gal8Signal'; +end + diff --git a/BF_Functions/NuclearStain.m b/BF_Functions/NuclearStain.m new file mode 100644 index 0000000..ae8496c --- /dev/null +++ b/BF_Functions/NuclearStain.m @@ -0,0 +1,34 @@ +function [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here + NucWeiner=wiener2(Nuc); + NucTopHat=imtophat(NucWeiner,NucTophatDisk); % Clean image with tophat filter for thresholding +% NucOpen=imerode(NucTopHat,NucOpenDisk); +% NucOpen=imreconstruct(NucOpen,NucTopHat); + Nuc_eq =imadjust(NucTopHat); %Make it easy to see + NucOpen=imopen(NucTopHat,NucOpenDisk); + NucMaxValue= NucMax*intmax(class(Nuc)); + NucOverbright=NucTopHat>NucMaxValue; + + NucOpen(NucOverbright)=0; +% NucMT1=multithresh(NucOpen,20); %Calculate 20 brightness thresholds for image +% NucQuant1=imquantize(NucOpen,NucMT1); %Divide Image into the 20 brightness baskets + NucMT1=1; + NucQuant1=1; +% NucBrightEnough=NucQuant1>NucLow; + NucBrightEnough=NucOpen>NucLow; + NucPos=NucOpen; + NucPos(~NucBrightEnough)=0; +% NucPos=imadjust(NucPos); + Nuc_bw2=imerode(NucPos,NucErodeDisk); + Nuc_bw3 = bwareaopen(Nuc_bw2, 250); %%Be sure to check this threshold + Nuc_bw4 = imclose(Nuc_bw3, NucCloseDisk); + Nuc_bw4 = imfill(Nuc_bw4,'holes'); + Nuc_bw4_perim = imdilate(bwperim(Nuc_bw4),strel('disk',3)); + + NucConn=bwconncomp(Nuc_bw4); + NucLabel = labelmatrix(NucConn); + NucArea = imoverlay(Nuc_eq, Nuc_bw4_perim, [.3 1 .3]); + +end + diff --git a/BF_Functions/Rhoda.m b/BF_Functions/Rhoda.m new file mode 100644 index 0000000..fde251b --- /dev/null +++ b/BF_Functions/Rhoda.m @@ -0,0 +1,25 @@ + %%Rhodamine Code + +function [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4) + + rhod_eq =imadjust(drug,[0 0.4],[]); + + Rhoda_threshold = Rhoda_threshold *intmax(class(drug)); + + rhodaweiner=wiener2(drug); + RhodMask=rhodaweiner>Rhoda_threshold; + areaRhod = sum(RhodMask,'all'); + + rhoda_in_cell = drug(cyt_bw4); + rhoda_out_cell = drug(cyt_bw4 == 0); + + cell_area = sum(sum(cyt_bw4)); + not_cell_area = size(cyt_bw4,1) * size(cyt_bw4, 2) - cell_area; + + Rhodsum = sum(rhod_eq(RhodMask)); + RhodBright=drug; + RhodBright(~RhodMask)=0; + RhodAvgInCell = sum(rhoda_in_cell) / cell_area; + RhodAvgOutCell = sum(rhoda_out_cell) / not_cell_area; + + \ No newline at end of file diff --git a/BF_Functions/m_2021_12_30.m b/BF_Functions/m_2021_12_30.m new file mode 100644 index 0000000..f1f2159 --- /dev/null +++ b/BF_Functions/m_2021_12_30.m @@ -0,0 +1,256 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; + +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint'; +filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +readeromeMeta=reader.getMetadataStore(); + +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=150;%Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Cytosol + CytMax= 1; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=0:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + + Nuc = bitConvert*bfGetPlane(reader,iplane+1); + + cyt = bitConvert*bfGetPlane(reader,iplane+2); + + drug = bitConvert*bfGetPlane(reader,iplane+3); + + %% Analyze Images + %%Nuclear Stain Code + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + + %%Cytosol Code + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + + %WaterShed Segmentation of Individual Cells + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); + %Gal8 Puncta Segmentation + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); + + %Rhodamine Code + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); + rhodPerim=bwperim(RhodMask); + + %All Data Images + RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); + WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); + ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); + ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); + ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement + areacell=bwarea(Nuc_bw4(:)); + CellSum=sum(Nuc(Nuc_bw4)); + areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + %% Write Images to File + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) + + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + + + fulldestination = strcat(exportbase,'.png'); %name file relative to that directory + imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + ImageName=fullfile(BaxWellFolder,BaxterName); + imwrite(Nuc, strcat(ImageName,'c01','.tif'),'tif'); + imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); + imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); + imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); + imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); + + + SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); + imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); + + + SegNameCell=fullfile(BaxSegFolderCell,BaxterName); + imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); + + + end +end +%% Write Analysis Data to File + +D=[Categories;C]; +WritingHere=strcat(exportdir,'\','Gal8','_',run); + writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/BF_Gal8_Settings.csv b/BF_Gal8_Settings.csv new file mode 100644 index 0000000..c20bdcc --- /dev/null +++ b/BF_Gal8_Settings.csv @@ -0,0 +1,84 @@ +setting,A20,F08 +numZ,1,1 +bits,16,16 +minWellR,NaN,NaN +maxWellR,NaN,NaN +channelNames,Dapi:Gal8:RNA:TD,Dapi:Gal8:RNA +channelTags,c1:c2:c3:c4,c1:c2:c3 +channelColors,0 0 1:0 1 0:1 0.5 0:1 1 1,0 0 1:0 1 0:1 0.5 0:1 1 1 +channelMin,0:0:0:0,0:0:0:0 +channelMax,0.32022:0.58192:0.69413:1,0.32022:0.58192:0.69413:1 +use,1,1 +sequenceLength,, +SegOldVersion,none,none +SegSave,1,1 +SegAlgorithm,Segment_bandpass,Segment_bandpass +SegChannel,Gal8,Gal8 +SegLightCorrect,none,none +SegBgSubAlgorithm,none,none +SegTopHatRadius,Inf,Inf +SegFillHoles,1,1 +SegMinHoleArea,Inf,Inf +SegMinArea,1000,1000 +SegMaxArea,Inf,Inf +SegMinSumIntensity,0,0 +SegClipping,1,1 +SegClippingBelow,0,0 +SegSmooth,2,2 +SegMedFilt,1,1 +SegWatershed,intermediate,intermediate +SegWSmooth,5,5 +SegWHMax,6,6 +SegWThresh,-Inf,-Inf +SegWatershed2,darkness,darkness +SegWLocMaxCentroids,0,0 +SegCellMorphOp,none,none +BPSegHighStd,5,5 +BPSegLowStd,2,2 +BPSegBgFactor,1,1 +BPSegThreshold,1e-06,1e-06 +BPSegDarkOrBright,bright,bright +TrackXSpeedStd,12,12 +countClassifier,none,none +splitClassifier,none,none +deathClassifier,none,none +migClassifier,none,none +pCnt0,0.2,0.2 +pCnt1,0.7,0.7 +pCnt2,0.1,0.1 +pCntExtrap,0.25,0.25 +pSplit,0.01,0.01 +pDeath,0.01,0.01 +TrackPAppear,0,0 +TrackPDisappear,0,0 +TrackMotionModel,none,none +TrackMigLogLikeList,MigLogLikeList_uniformClutter,MigLogLikeList_uniformClutter +TrackDeathShift,2e-05,2e-05 +TrackMaxDeathProb,1,1 +TrackMaxMigScore,0,0 +TrackMigInOut,1,1 +TrackNumNeighbours,3,3 +TrackSingleIdleState,0,0 +TrackBipartiteMatch,1,1 +TrackFalsePos,1,1 +TrackSaveFPAsCells,0,0 +TrackCentroidOffset,0,0 +TrackMergeWatersheds,1,1 +TrackMergeOverlapMaxIter,0,0 +TrackMergeBrokenMaxArea,0,0 +TrackMergeBrokenRatio,0.75,0.75 +foiErosion,0,0 +TrackSaveIterations,0,0 +TrackSavePTC,0,0 +TrackSaveCTC,0,0 +TrackEvaluateCTC,0,0 +TrackSelectFromGT,0,0 +condition,Unspecified,Unspecified +pixelSize,1,1 +magnification,1,1 +dT,1,1 +startT,0,0 +authorStr,, +SegWSmooth2,7,7 +SegWHMax2,0.1,0.1 +SegWThresh2,-Inf,-Inf diff --git a/Files/Settings/Brock/Settings.csv b/Files/Settings/Brock/Settings.csv new file mode 100644 index 0000000..c20bdcc --- /dev/null +++ b/Files/Settings/Brock/Settings.csv @@ -0,0 +1,84 @@ +setting,A20,F08 +numZ,1,1 +bits,16,16 +minWellR,NaN,NaN +maxWellR,NaN,NaN +channelNames,Dapi:Gal8:RNA:TD,Dapi:Gal8:RNA +channelTags,c1:c2:c3:c4,c1:c2:c3 +channelColors,0 0 1:0 1 0:1 0.5 0:1 1 1,0 0 1:0 1 0:1 0.5 0:1 1 1 +channelMin,0:0:0:0,0:0:0:0 +channelMax,0.32022:0.58192:0.69413:1,0.32022:0.58192:0.69413:1 +use,1,1 +sequenceLength,, +SegOldVersion,none,none +SegSave,1,1 +SegAlgorithm,Segment_bandpass,Segment_bandpass +SegChannel,Gal8,Gal8 +SegLightCorrect,none,none +SegBgSubAlgorithm,none,none +SegTopHatRadius,Inf,Inf +SegFillHoles,1,1 +SegMinHoleArea,Inf,Inf +SegMinArea,1000,1000 +SegMaxArea,Inf,Inf +SegMinSumIntensity,0,0 +SegClipping,1,1 +SegClippingBelow,0,0 +SegSmooth,2,2 +SegMedFilt,1,1 +SegWatershed,intermediate,intermediate +SegWSmooth,5,5 +SegWHMax,6,6 +SegWThresh,-Inf,-Inf +SegWatershed2,darkness,darkness +SegWLocMaxCentroids,0,0 +SegCellMorphOp,none,none +BPSegHighStd,5,5 +BPSegLowStd,2,2 +BPSegBgFactor,1,1 +BPSegThreshold,1e-06,1e-06 +BPSegDarkOrBright,bright,bright +TrackXSpeedStd,12,12 +countClassifier,none,none +splitClassifier,none,none +deathClassifier,none,none +migClassifier,none,none +pCnt0,0.2,0.2 +pCnt1,0.7,0.7 +pCnt2,0.1,0.1 +pCntExtrap,0.25,0.25 +pSplit,0.01,0.01 +pDeath,0.01,0.01 +TrackPAppear,0,0 +TrackPDisappear,0,0 +TrackMotionModel,none,none +TrackMigLogLikeList,MigLogLikeList_uniformClutter,MigLogLikeList_uniformClutter +TrackDeathShift,2e-05,2e-05 +TrackMaxDeathProb,1,1 +TrackMaxMigScore,0,0 +TrackMigInOut,1,1 +TrackNumNeighbours,3,3 +TrackSingleIdleState,0,0 +TrackBipartiteMatch,1,1 +TrackFalsePos,1,1 +TrackSaveFPAsCells,0,0 +TrackCentroidOffset,0,0 +TrackMergeWatersheds,1,1 +TrackMergeOverlapMaxIter,0,0 +TrackMergeBrokenMaxArea,0,0 +TrackMergeBrokenRatio,0.75,0.75 +foiErosion,0,0 +TrackSaveIterations,0,0 +TrackSavePTC,0,0 +TrackSaveCTC,0,0 +TrackEvaluateCTC,0,0 +TrackSelectFromGT,0,0 +condition,Unspecified,Unspecified +pixelSize,1,1 +magnification,1,1 +dT,1,1 +startT,0,0 +authorStr,, +SegWSmooth2,7,7 +SegWHMax2,0.1,0.1 +SegWThresh2,-Inf,-Inf From 280a168c0d84387cc47da95ee258260d212f971b Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Sun, 2 Jan 2022 10:13:47 -0600 Subject: [PATCH 02/15] 3D Flow-Cytometry Like Plot Run PlotTest.m to make 3D flow-cytometry style plot. Needs a lot of work. --- Analysis/CellAnalysis/Plot_Fluorescence3D.m | 150 ++++++++++++++++++++ Analysis/Plotting/PlotWithNan3D.m | 59 ++++++++ PlotTest.m | 14 ++ 3 files changed, 223 insertions(+) create mode 100644 Analysis/CellAnalysis/Plot_Fluorescence3D.m create mode 100644 Analysis/Plotting/PlotWithNan3D.m create mode 100644 PlotTest.m diff --git a/Analysis/CellAnalysis/Plot_Fluorescence3D.m b/Analysis/CellAnalysis/Plot_Fluorescence3D.m new file mode 100644 index 0000000..06972ac --- /dev/null +++ b/Analysis/CellAnalysis/Plot_Fluorescence3D.m @@ -0,0 +1,150 @@ +function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) +% Plots the fluorescence intensity of cells over time. +% +% The function can be used to plot the maximum intensity, the average +% intensity or the integrated intensity. The function only works for cells +% that come from the same image sequence. The function can only be used on +% tracking results where there is a fluorescent channel. The function is +% meant to be called by CellAnalysisPlayer. The function will only show up +% in the CellAnalysisPlayer GUI if the dataset has one or more +% fluorescence channels. The function PrintStyle is called to make the +% plotting style consistent with other plots. +% +% Inputs: +% aCells - Cells for which the fluorescence will be plotted. +% aAxes - Axes object to plot the data in. +% aChannel - The name of the fluorescence channel to be plotted. +% +% Property/Value inputs: +% XUnit - The time unit used on the x-axis. The options are 'frames' and +% 'hours', and the default is 'hours'. +% YUnit - The length unit used to compute the integrated intensity. The +% options are 'pixels' and 'microns'. For 2D datasets, the +% resulting units on the y-axis are intensity * pixels and +% intensity * square microns respectively. For 3D datasets, the +% units are intensity * voxels or intensity * cubic microns. The +% default is 'microns'. Note that this input has an effect only if +% Metric is 'tot'. +% Metric - What parameter of the fluorescence to plot. The options are +% 'max', 'avg', and 'tot', and they correspond to the maximum, +% average, and the integrated fluorescence over the cell area. The +% default is 'max'. +% +% See also: +% CellAnalysisPlayer, Plot_AxisRatio, Plot_CellSize, Plot_LinageTree, +% Plot_TotalDistance, PrintStyle + +% Get property/value inputs. +[aXUnit, aYUnit, aMetric] = GetArgs(... + {'XUnit', 'YUnit', 'Metric'},... + {'hours', 'microns', 'max'},... + true, varargin); + +% Clear the previous plot. +% cla(aAxes) +% hold(aAxes, 'off') + +if isempty(aCells) + return +end +imData = aCells(1).imageData; + +for i = 1:length(aCells) + c = aCells(i); + + % Time (x-coordinates of plot). + switch aXUnit + case 'hours' + t = imData.FrameToT(c.firstFrame : c.lastFrame); + case 'frames' + t = c.firstFrame : c.lastFrame; + end + + % Fluorescence (y-coordinates of plot). + switch lower(aMetric) + case 'max' + fluor = c.regionProps.(['FluorMax' aChannel]); + case 'avg' + fluor = c.regionProps.(['FluorAvg' aChannel]); + case 'test' + fluor = c.regionProps.(['FluorAvg' aChannel]); + case 'tot' + fluor = c.regionProps.(['FluorTot' aChannel]); + if strcmpi(aYUnit, 'microns') + if imData.GetDim() == 2 + fluor = imData.Pixel2ToMicroM2(fluor); + else + fluor = imData.VoxelToMicroM3(fluor); + end + end + end + % Fluorescence (z-coordinates of plot). + switch lower(aMetric) + case 'max' + fluor2 = c.regionProps.(['FluorMax' aChannel2]); + case 'avg' + fluor2 = c.regionProps.(['FluorAvg' aChannel2]); + case 'test' + fluor2 = c.regionProps.(['FluorAvg' aChannel2]); + case 'tot' + fluor2 = c.regionProps.(['FluorTot' aChannel2]); + if strcmpi(aYUnit, 'microns') + if imData.GetDim() == 2 + fluor2 = imData.Pixel2ToMicroM2(fluor2); + else + fluor2 = imData.VoxelToMicroM3(fluor2); + end + end + end + % Plot the fluorescence over time for one cell. + PlotWithNan3D(aAxes, t, fluor,fluor2,'color',Color,... + 'LineWidth', 2); +% alpha(.5); + hold(aAxes, 'on') +% testing=Color; +end + +% Set the limits of the plot. +SetYLimits(aAxes) +xlim(aAxes, imData.GetTLim(aXUnit, 'Margins', [0.01 0.01])) + +% x-label. +switch lower(aXUnit) + case 'frames' + xlabel(aAxes, 'Time (frames)') + case 'hours' + xlabel(aAxes, 'Time (hours)') +end + +% y-label and title. +switch lower(aMetric) + case 'max' + title(aAxes, sprintf('Maximum fluorescence (%s)',... + SpecChar(imData.GetSeqDir(), 'matlab'))) + ylabel(aAxes, 'Fluorescence (relative to max)') + case 'avg' + title(aAxes, sprintf('Average fluorescence (%s)',... + SpecChar(imData.GetSeqDir(), 'matlab'))) + ylabel(aAxes, 'Fluorescence (relative to max)') + case 'tot' + title(aAxes, sprintf('Integrated fluorescence (%s)',... + SpecChar(imData.GetSeqDir(), 'matlab'))) + if imData.GetDim() == 2 + switch aYUnit + case 'pixels' + ylabel(aAxes, 'Fluorescence (relative to max) * Area in pixels') + case 'microns' + ylabel(aAxes, 'Fluorescence (relative to max) * Area in \mum^2') + end + else + switch aYUnit + case 'pixels' + ylabel(aAxes, 'Fluorescence (relative to max) * Volume in voxels') + case 'microns' + ylabel(aAxes, 'Fluorescence (relative to max) * Volume in \mum^3') + end + end +end + +PrintStyle(aAxes) +end \ No newline at end of file diff --git a/Analysis/Plotting/PlotWithNan3D.m b/Analysis/Plotting/PlotWithNan3D.m new file mode 100644 index 0000000..d7eb493 --- /dev/null +++ b/Analysis/Plotting/PlotWithNan3D.m @@ -0,0 +1,59 @@ +function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) +% Plots a curve and fills in gaps of NaNs with dotted lines. +% +% The built in plot function in MATLAB will create gaps in the lines in +% places where there are NaN-values. This function will instead connect the +% end-points around the gaps with dotted lines. NaNs in the beginning and +% at the end of an array are not plotted. +% +% Inputs: +% aAxes - Axes object to plot in. +% aX - Array of x-values. +% aY - Array of y-values, that may contain NaN-values. +% varargin - Extra input arguments passed to the built in function plot. + +% Make the function work for both row- and column vectors. +aX = aX(:); +aY = aY(:); +aZ = aZ(:); +if isempty(aX) + return +end + +% Get the original hold-setting. +hSet = ishold(aAxes); + +% Find breakpoints between NaN-values and other values. There will be 1s at +% each start of a new interval and at the first and the last element. +bp = [1; find(abs(diff(isnan(aY))))+1; length(aY)+1]; + +for i = 1:length(bp) - 1 + if isnan(aY(bp(i))) + if i ~= 1 && i ~= length(bp) - 1 + % Plot a dotted line over a NaN-gap. + start = bp(i)-1; + stop = bp(i + 1); + plot3(aAxes,... + [aX(start); aX(stop)],... + [aY(start); aY(stop)],... + [aZ(start); aZ(stop)],... + varargin{:},... + 'LineStyle', ':') + alpha(.1); + hold(aAxes, 'on') + end + else + % Plot a normal line. + start = bp(i); + stop = bp(i + 1) - 1; + plot3(aAxes, aX(start : stop), aY(start : stop),aZ(start : stop), varargin{:}) + alpha(.1); + hold(aAxes, 'on') + end +end + +% Restore the original hold-setting. +if ~hSet + hold(aAxes, 'off') +end +end \ No newline at end of file diff --git a/PlotTest.m b/PlotTest.m new file mode 100644 index 0000000..875d80f --- /dev/null +++ b/PlotTest.m @@ -0,0 +1,14 @@ +figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); +for i=0:2 + seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; + Run=num2str(i) + seqPath=strcat(seqPath,'0000',num2str(i)); + cells = LoadCells (seqPath , '_211231_152842'); + cells2=AreCells(cells); + Plot_Fluorescence3D(cells2,ax1,'Cyt','Gal',rand(1,3)); + EdgeColor='#80B3FF'; +end +% for i = 1:length(cells2) +% c = cells2(i) +% +% end \ No newline at end of file From 7db564ddfbf6d7a740406dda4fc00fd32c9bc01b Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Wed, 5 Jan 2022 10:53:16 -0600 Subject: [PATCH 03/15] Analyze Data Added scrips to analyze data. still needs a lot of work --- Analysis/CellAnalysis/Plot_Fluorescence3D.m | 11 +- Analysis/Plotting/PlotWithNan3D.m | 3 +- Analysis/PopulationAnalysis/OverTime3D.m | 136 +++++++++++ BF_Functions/m_2021_12_30.m | 13 +- BF_Functions/m_Bronk_2022_01_05.m | 255 ++++++++++++++++++++ DataWriteTest.m | 17 ++ PlotTest.m | 7 +- WriteTest.m | 41 ++++ WriteTest2.m | 34 +++ 9 files changed, 501 insertions(+), 16 deletions(-) create mode 100644 Analysis/PopulationAnalysis/OverTime3D.m create mode 100644 BF_Functions/m_Bronk_2022_01_05.m create mode 100644 DataWriteTest.m create mode 100644 WriteTest.m create mode 100644 WriteTest2.m diff --git a/Analysis/CellAnalysis/Plot_Fluorescence3D.m b/Analysis/CellAnalysis/Plot_Fluorescence3D.m index 06972ac..62da66a 100644 --- a/Analysis/CellAnalysis/Plot_Fluorescence3D.m +++ b/Analysis/CellAnalysis/Plot_Fluorescence3D.m @@ -39,7 +39,7 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) {'XUnit', 'YUnit', 'Metric'},... {'hours', 'microns', 'max'},... true, varargin); - +aMetric= 'avg'; % Clear the previous plot. % cla(aAxes) % hold(aAxes, 'off') @@ -48,10 +48,9 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) return end imData = aCells(1).imageData; - +% BronkBox=cell(length(cells2),max([cells2.stopT])); for i = 1:length(aCells) c = aCells(i); - % Time (x-coordinates of plot). switch aXUnit case 'hours' @@ -97,7 +96,11 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) end end % Plot the fluorescence over time for one cell. - PlotWithNan3D(aAxes, t, fluor,fluor2,'color',Color,... + Color=Color; + Color2=Color+0.4*((i-1)/length(aCells)); + Color2(Color2>1)=1; + Color2(Color2<0)=1; + PlotWithNan3D(aAxes, t, fluor,fluor2,'color',Color2,... 'LineWidth', 2); % alpha(.5); hold(aAxes, 'on') diff --git a/Analysis/Plotting/PlotWithNan3D.m b/Analysis/Plotting/PlotWithNan3D.m index d7eb493..0e10272 100644 --- a/Analysis/Plotting/PlotWithNan3D.m +++ b/Analysis/Plotting/PlotWithNan3D.m @@ -46,8 +46,9 @@ function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) % Plot a normal line. start = bp(i); stop = bp(i + 1) - 1; - plot3(aAxes, aX(start : stop), aY(start : stop),aZ(start : stop), varargin{:}) + plot3(aAxes, aX(start : stop), aY(start : stop),aZ(start : stop),varargin{:}) alpha(.1); + grid on hold(aAxes, 'on') end end diff --git a/Analysis/PopulationAnalysis/OverTime3D.m b/Analysis/PopulationAnalysis/OverTime3D.m new file mode 100644 index 0000000..0e27a27 --- /dev/null +++ b/Analysis/PopulationAnalysis/OverTime3D.m @@ -0,0 +1,136 @@ +function OverTime(aAxes, aCellVec, aLabels, aProperty, aTitle, aPropertyLabel, ~, ~) +% Plots time averaged cell properties against appearance times of cells. +% +% The appearance times are binned into intervals of 1 hour, and average +% parameter values for the bins are computed and plotted against time. When +% there are no cells in a bin, the value of that bin is interpolated from +% surrounding values using linear interpolation. Lines that end in +% interpolated points are plotted using a dashed line style. +% +% Inputs: +% aAxes - Axes object to plot in. +% aCellVec - Cell array where each cell contains a group of Cell objects +% that will be plotted in a separate color. +% aLabels - Labels associated with the different cell groups. The groups +% are usually experimental conditions. +% aProperty - The name of the cell property to be plotted. The property +% must be a property of the Cell class. +% aTitle - Title describing the plotted property. The title will be placed +% at the top of the plot. +% aPropertyLabel - The axis label associated with the plotted property. +% +% The function also takes two dummy inputs which make it possible to call +% the function from PlotConditionProperty with the same input arguments as +% Scatter. +% +% See also: +% PlotConditionProperty + +% Colors used for plotting the different groups of cells. If there are more +% groups than colors, the colors are recycled. +colors = {'b', 'r', 'c', 'm', 'k', 'y', 'g'}; + +% Get the maximum property value. +cells = [aCellVec{:}]; +props = ExtractProperty(cells, aProperty); +if all(isnan(props)) + return +end +maxVal = max(props(~isnan(props))); + +numFrames = TimeSpan(cells); +df = 3600/cells(1).dT; % Number of frames in each bin. +% Time points corresponding to the bins. +t = cells(1).imageData.FrameToT(1:df:numFrames); + +propHist = cell(size(aCellVec)); +counts = cell(size(aCellVec)); + +% Put the cells and their properties into the bins. +for i = 1:length(aCellVec) + propHist{i} = zeros(ceil(numFrames / df), 1); + counts{i} = zeros(ceil(numFrames / df), 1); + for cIndex = 1:length(aCellVec{i}) + c = aCellVec{i}(cIndex); + if ~isnan(ExtractProperty(c, aProperty)) + % Bin that the cell belongs to. + bin = floor(c.firstFrame / df) + 1; + if strcmpi(aProperty, 'deltaT') + % For the property deltaT, each sister cell pair has a + % positive and a negative value (or two zeros). To deal + % with this, we take the absolute value of the property. + propHist{i}(bin) = propHist{i}(bin) +... + abs(ExtractProperty(c, aProperty)); + else + propHist{i}(bin) = propHist{i}(bin) +... + ExtractProperty(c, aProperty); + end + counts{i}(bin) = counts{i}(bin) + 1; + end + end +end + +% Compute the average property value in each bin, by dividing the summed +% property values by the number of cells. +propHistNorm = cell(size(propHist)); +for i = 1:length(aCellVec) + propHistNorm{i} = propHist{i} ./ counts{i}; +end + +% Create label strings, and make fake lines at the origin with the +% corresponding line styles, so that the correct lines are drawn in the +% legend. +labelStrings = {}; +for i = 1:length(aCellVec) + if all(isnan(propHistNorm{i})) + continue + end + + colorIndex = mod(i-1,length(colors)) + 1; + + % Solid line. + plot(aAxes, 0, 0, 'LineWidth', 4, 'Color', colors{colorIndex}) + hold(aAxes, 'on') + labelStrings = [labelStrings {num2str(aLabels{i})}]; %#ok + + % Dashed line. + if any(isnan(propHistNorm{i})) + plot(aAxes, 0, 0,... + 'LineWidth', 4,... + 'Color', colors{colorIndex},... + 'LineStyle', '--') + labelStrings = [labelStrings... + {[num2str(aLabels{i}) ' (interpolated)']}]; %#ok + end +end + +% Plot observed values with solid lines and interpolated values with dotted +% lines. The bins that need to be interpolated have NaN-values. +for i = 1:length(aCellVec) + colorIndex = mod(i-1,length(colors)) + 1; + bronkx=t' + bronky=propHistNorm{i}' + PlotWithNan(aAxes, t', propHistNorm{i}',... + 'LineWidth', 4,... + 'Color', colors{colorIndex}) +end + +% Set axis limits for the time axes. +if length(t) == 1 + % Avoids a crash when the plot is empty. + xlim(aAxes, [t t+1]) +else + xlim(aAxes, [t(1) t(end)]) +end + +% Set y-axis limits so that there is a 10 % Margin at the top. +if maxVal > 0 + set(aAxes, 'ylim', [0, maxVal*1.1]) +end + +grid(aAxes, 'on') +xlabel(aAxes, 'Time (hours)') +ylabel(aAxes, aPropertyLabel) +legend(aAxes, labelStrings, 'Location', 'Best') +title(aAxes, aTitle) +end \ No newline at end of file diff --git a/BF_Functions/m_2021_12_30.m b/BF_Functions/m_2021_12_30.m index f1f2159..310e718 100644 --- a/BF_Functions/m_2021_12_30.m +++ b/BF_Functions/m_2021_12_30.m @@ -48,14 +48,13 @@ %Graph Data in Prism. %% Image Folder Location clc, clear; - -exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint'; -filetype='tif'; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +% filetype='tif'; % listing=dir(strcat(workingdir,'*.TIF')); % ds=imageDatastore(workingdir); -reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +%% Directory Code readeromeMeta=reader.getMetadataStore(); - destdirectory1 = fullfile(exportdir,'Overlaid'); BaxtDirectory= fullfile(exportdir,'Baxter'); exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); @@ -127,9 +126,9 @@ bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 %Nuclear Stain NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start - NucLow=150;%Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + NucLow=10;% %Cytosol - CytMax= 1; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytMax= 0.75; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. %Gal8 Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start diff --git a/BF_Functions/m_Bronk_2022_01_05.m b/BF_Functions/m_Bronk_2022_01_05.m new file mode 100644 index 0000000..310e718 --- /dev/null +++ b/BF_Functions/m_Bronk_2022_01_05.m @@ -0,0 +1,255 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=10;% + %Cytosol + CytMax= 0.75; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=0:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + + Nuc = bitConvert*bfGetPlane(reader,iplane+1); + + cyt = bitConvert*bfGetPlane(reader,iplane+2); + + drug = bitConvert*bfGetPlane(reader,iplane+3); + + %% Analyze Images + %%Nuclear Stain Code + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + + %%Cytosol Code + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + + %WaterShed Segmentation of Individual Cells + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); + %Gal8 Puncta Segmentation + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); + + %Rhodamine Code + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); + rhodPerim=bwperim(RhodMask); + + %All Data Images + RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); + WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); + ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); + ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); + ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement + areacell=bwarea(Nuc_bw4(:)); + CellSum=sum(Nuc(Nuc_bw4)); + areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + %% Write Images to File + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) + + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + + + fulldestination = strcat(exportbase,'.png'); %name file relative to that directory + imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + ImageName=fullfile(BaxWellFolder,BaxterName); + imwrite(Nuc, strcat(ImageName,'c01','.tif'),'tif'); + imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); + imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); + imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); + imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); + + + SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); + imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); + + + SegNameCell=fullfile(BaxSegFolderCell,BaxterName); + imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); + + + end +end +%% Write Analysis Data to File + +D=[Categories;C]; +WritingHere=strcat(exportdir,'\','Gal8','_',run); + writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/DataWriteTest.m b/DataWriteTest.m new file mode 100644 index 0000000..382421c --- /dev/null +++ b/DataWriteTest.m @@ -0,0 +1,17 @@ +for i=0:2 + seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; + Run=num2str(i) + seqPath=strcat(seqPath,'0000',num2str(i)); + cells = LoadCells (seqPath , '_211231_152842','AreCells', true, 'Compact', true); +% cells2=AreCells(cells); +properties=cells(1).regionProps.Area(2) +% % [cellVec2, labels2] = PartitionCells(cells, 'firstFrame'); +% Test=a; +fluorProps = {cells.regionProps}; +fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); +fluorProps = unique(cat(1,fluorProps{:}))'; +% fluorProps = regexp(fluorProps, '^Fluor.*', 'match', 'once'); +% fluorProps(cellfun(@isempty, fluorProps)) = []; + + Plot_Fluorescence3D(cells,ax1,'Drug','Gal',rand(1,3)); +end diff --git a/PlotTest.m b/PlotTest.m index 875d80f..d38bb81 100644 --- a/PlotTest.m +++ b/PlotTest.m @@ -3,10 +3,9 @@ seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; Run=num2str(i) seqPath=strcat(seqPath,'0000',num2str(i)); - cells = LoadCells (seqPath , '_211231_152842'); - cells2=AreCells(cells); - Plot_Fluorescence3D(cells2,ax1,'Cyt','Gal',rand(1,3)); - EdgeColor='#80B3FF'; + cells2 = LoadCells (seqPath , '_211231_152842','AreCells', true, 'Compact', true); +% cells2=AreCells(cells); + Plot_Fluorescence3D(cells2,ax1,'Drug','Gal',rand(1,3)); end % for i = 1:length(cells2) % c = cells2(i) diff --git a/WriteTest.m b/WriteTest.m new file mode 100644 index 0000000..b754eff --- /dev/null +++ b/WriteTest.m @@ -0,0 +1,41 @@ +NumWells=3; +figure, ax2 = axes('Position',[0.1 0.1 0.7 0.7]); +for m=0:NumWells-1 + seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; + Run=num2str(m,'%05.f'); + seqPath=strcat(seqPath,Run); + cells = LoadCells (seqPath , '_211231_152842','AreCells', true, 'Compact', true); + fluorProps = {cells.regionProps}; + fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); + fluorProps = unique(cat(1,fluorProps{:}))'; + + Plot_Fluorescence3D(cells,ax2,'Cyt','Drug',rand(1,3)); +% BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); +for k=1:length(fluorProps); + currProp=fluorProps{k}; + Test='MinorAxisLength'; +for j=1:length(cells) + c = cells(j); + t = c.firstFrame : c.lastFrame; + tp=1; + for i=t + BronkBox{j,i,k,(m+1)}=cells(1,j).regionProps.(currProp)(tp); + tp=tp+1; + end +end +end +end +empties=cellfun('isempty',BronkBox); +BronkBox(empties) = {NaN}; +Data=cell2mat(BronkBox); +means=mean(Data(:,:,:,:),'omitnan'); +medians=median(Data(:,:,:,:),'omitnan'); +stds=std(Data(:,:,:,:),'omitnan'); +vars=var(Data(:,:,:,:),'omitnan'); +sums=sum(Data(:,:,:,:),'omitnan'); +CVs=stds./means; +figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); +for n=1:NumWells +PlotWithNan3D(ax1,[1:37],means(:,:,2,n),means(:,:,3,n)); +hold on +end \ No newline at end of file diff --git a/WriteTest2.m b/WriteTest2.m new file mode 100644 index 0000000..b8a1108 --- /dev/null +++ b/WriteTest2.m @@ -0,0 +1,34 @@ +Bigbox=cell(1,3); +NumWells=3; +for m=0:NumWells-1 + seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; + Run=num2str(m,'%05.f'); + seqPath=strcat(seqPath,Run); + cells = LoadCells (seqPath , '_211231_152842','AreCells', true, 'Compact', true); + fluorProps = {cells.regionProps}; + fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); + fluorProps = unique(cat(1,fluorProps{:}))'; + BronkBox=cell(length(cells),max([cells.stopT])); +for k=1:length(fluorProps) +% k=1:length(fluorProps); + currProp=fluorProps{k}; + Test='MinorAxisLength'; +for j=1:length(cells) + c = cells(j); + t = c.firstFrame : c.lastFrame; + tp=1; + for i=t +% BronkBox{j,i}=cells(1,j).regionProps; + BronkBox{j,i}=cells(1,j).regionProps.(currProp)(tp); + tp=tp+1; + LilBox{k,1}=[BronkBox]; + + Bigbox{1,m+1}=[LilBox]; + end +end +end +LilStruct=cell2struct(LilBox,fluorProps,1); +Bigbox{1,m+1}=[LilStruct]; + Count{1,m+1}=char(Run); +end +% BigStruct=cell2struct(Bigbox,{'zero','One','Tree'},2); \ No newline at end of file From 40152056c1b4e0f1cc894bff1905b4322e398b3d Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Wed, 19 Jan 2022 17:20:35 -0600 Subject: [PATCH 04/15] Big Mess of Changes --- Ai9DetermineCutoff.m | 16 + Analysis/CellAnalysis/Plot_Fluorescence3D.m | 26 +- Analysis/CellAnalysis/Plot_Fluorescence3D_2.m | 157 ++++++++++ Analysis/Plotting/PlotWithNan3D.m | 16 +- BF_Functions/m_2021_12_30.m | 20 +- BF_Functions/m_Bronk_2022_01_05.m | 18 +- BF_Functions/m_Bronk_2022_01_05_bigChanges.m | 273 +++++++++++++++++ .../m_Bronk_2022_01_06_for11_15_assay.m | 277 +++++++++++++++++ Copy_of_BF_Functions/CytNucWaterShed.m | 21 ++ Copy_of_BF_Functions/Cytosol.m | 27 ++ Copy_of_BF_Functions/Gal8.m | 25 ++ Copy_of_BF_Functions/NuclearStain.m | 34 +++ Copy_of_BF_Functions/Rhoda.m | 14 + Copy_of_BF_Functions/ThreshSeg.m | 15 + Copy_of_BF_Functions/m_2021_12_30.m | 257 ++++++++++++++++ Copy_of_BF_Functions/m_Bronk_2022_01_05.m | 255 ++++++++++++++++ .../m_Bronk_2022_01_05_bigChanges.m | 279 ++++++++++++++++++ DetermineCutoff.m | 0 Make4DMatrix.m | 46 +++ WriteTest.m | 32 +- WriteTest3.m | 58 ++++ WriteTest4.m | 64 ++++ 22 files changed, 1881 insertions(+), 49 deletions(-) create mode 100644 Ai9DetermineCutoff.m create mode 100644 Analysis/CellAnalysis/Plot_Fluorescence3D_2.m create mode 100644 BF_Functions/m_Bronk_2022_01_05_bigChanges.m create mode 100644 BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m create mode 100644 Copy_of_BF_Functions/CytNucWaterShed.m create mode 100644 Copy_of_BF_Functions/Cytosol.m create mode 100644 Copy_of_BF_Functions/Gal8.m create mode 100644 Copy_of_BF_Functions/NuclearStain.m create mode 100644 Copy_of_BF_Functions/Rhoda.m create mode 100644 Copy_of_BF_Functions/ThreshSeg.m create mode 100644 Copy_of_BF_Functions/m_2021_12_30.m create mode 100644 Copy_of_BF_Functions/m_Bronk_2022_01_05.m create mode 100644 Copy_of_BF_Functions/m_Bronk_2022_01_05_bigChanges.m create mode 100644 DetermineCutoff.m create mode 100644 Make4DMatrix.m create mode 100644 WriteTest3.m create mode 100644 WriteTest4.m diff --git a/Ai9DetermineCutoff.m b/Ai9DetermineCutoff.m new file mode 100644 index 0000000..10cb092 --- /dev/null +++ b/Ai9DetermineCutoff.m @@ -0,0 +1,16 @@ +Area=squeeze(Data(:,:,1,:)); +Tomato=squeeze(Data(:,:,2,:)); +TooLow=~(Tomato>0.1); +Area2=Area; +Tomato2=Tomato; +Area2(TooLow) =[NaN]; +Tomato2(TooLow)=[NaN]; +% +TotArea=sum(Area2,'omitnan'); +AvTomato=(Tomato2); +figure, plot3(1:384,Area2,Tomato2,'o') +grid on +% % Area=sum(squeeze(Data(:,:,1,:)),'omitnan'); +% % AvTomato=mean(squeeze(Data(:,:,2,:)),'omitnan'); +% figure, plot3(1:384,Area,AvTomato,'o') +% grid on \ No newline at end of file diff --git a/Analysis/CellAnalysis/Plot_Fluorescence3D.m b/Analysis/CellAnalysis/Plot_Fluorescence3D.m index 62da66a..fa960fd 100644 --- a/Analysis/CellAnalysis/Plot_Fluorescence3D.m +++ b/Analysis/CellAnalysis/Plot_Fluorescence3D.m @@ -35,11 +35,11 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) % Plot_TotalDistance, PrintStyle % Get property/value inputs. -[aXUnit, aYUnit, aMetric] = GetArgs(... +[aXUnit, aYUnit, aMetric1] = GetArgs(... {'XUnit', 'YUnit', 'Metric'},... {'hours', 'microns', 'max'},... true, varargin); -aMetric= 'avg'; + % Clear the previous plot. % cla(aAxes) % hold(aAxes, 'off') @@ -52,15 +52,16 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) for i = 1:length(aCells) c = aCells(i); % Time (x-coordinates of plot). - switch aXUnit - case 'hours' - t = imData.FrameToT(c.firstFrame : c.lastFrame); - case 'frames' - t = c.firstFrame : c.lastFrame; - end - +% switch aXUnit +% case 'hours' +% t = imData.FrameToT(c.firstFrame : c.lastFrame); +% case 'frames' +% t = c.firstFrame : c.lastFrame; +% end + t=1; % Fluorescence (y-coordinates of plot). - switch lower(aMetric) + aMetric1= 'avg'; + switch lower(aMetric1) case 'max' fluor = c.regionProps.(['FluorMax' aChannel]); case 'avg' @@ -77,8 +78,9 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) end end end + aMetric2= 'tot'; % Fluorescence (z-coordinates of plot). - switch lower(aMetric) + switch lower(aMetric2) case 'max' fluor2 = c.regionProps.(['FluorMax' aChannel2]); case 'avg' @@ -120,7 +122,7 @@ function Plot_Fluorescence(aCells, aAxes, aChannel,aChannel2,Color, varargin) end % y-label and title. -switch lower(aMetric) +switch lower(aMetric1) case 'max' title(aAxes, sprintf('Maximum fluorescence (%s)',... SpecChar(imData.GetSeqDir(), 'matlab'))) diff --git a/Analysis/CellAnalysis/Plot_Fluorescence3D_2.m b/Analysis/CellAnalysis/Plot_Fluorescence3D_2.m new file mode 100644 index 0000000..255d8a8 --- /dev/null +++ b/Analysis/CellAnalysis/Plot_Fluorescence3D_2.m @@ -0,0 +1,157 @@ +function Plot_Fluorescence3D_2(aCells, aAxes, aChannel,aChannel2,Color,x_in, varargin) +% Plots the fluorescence intensity of cells over time. +% +% The function can be used to plot the maximum intensity, the average +% intensity or the integrated intensity. The function only works for cells +% that come from the same image sequence. The function can only be used on +% tracking results where there is a fluorescent channel. The function is +% meant to be called by CellAnalysisPlayer. The function will only show up +% in the CellAnalysisPlayer GUI if the dataset has one or more +% fluorescence channels. The function PrintStyle is called to make the +% plotting style consistent with other plots. +% +% Inputs: +% aCells - Cells for which the fluorescence will be plotted. +% aAxes - Axes object to plot the data in. +% aChannel - The name of the fluorescence channel to be plotted. +% +% Property/Value inputs: +% XUnit - The time unit used on the x-axis. The options are 'frames' and +% 'hours', and the default is 'hours'. +% YUnit - The length unit used to compute the integrated intensity. The +% options are 'pixels' and 'microns'. For 2D datasets, the +% resulting units on the y-axis are intensity * pixels and +% intensity * square microns respectively. For 3D datasets, the +% units are intensity * voxels or intensity * cubic microns. The +% default is 'microns'. Note that this input has an effect only if +% Metric is 'tot'. +% Metric - What parameter of the fluorescence to plot. The options are +% 'max', 'avg', and 'tot', and they correspond to the maximum, +% average, and the integrated fluorescence over the cell area. The +% default is 'max'. +% +% See also: +% CellAnalysisPlayer, Plot_AxisRatio, Plot_CellSize, Plot_LinageTree, +% Plot_TotalDistance, PrintStyle + +% Get property/value inputs. +[aXUnit, aYUnit, aMetric] = GetArgs(... + {'XUnit', 'YUnit', 'Metric'},... + {'hours', 'microns', 'max'},... + true, varargin); + +% Clear the previous plot. +% cla(aAxes) +% hold(aAxes, 'off') + +if isempty(aCells) + return +end +imData = aCells(1).imageData; +% BronkBox=cell(length(cells2),max([cells2.stopT])); +for i = 1:length(aCells) + c = aCells(i); + % Time (x-coordinates of plot). + switch aXUnit + case 'hours' + t = imData.FrameToT(c.firstFrame : c.lastFrame); + case 'frames' + t = c.firstFrame : c.lastFrame; + end + t=x_in; + % Fluorescence (y-coordinates of plot). + aMetric= 'avg'; + switch lower(aMetric) + case 'max' + fluor = c.regionProps.(['FluorMax' aChannel]); + case 'avg' + fluor = c.regionProps.(['FluorAvg' aChannel]); + case 'test' + fluor = c.regionProps.(['FluorAvg' aChannel]); + case 'tot' + fluor = c.regionProps.(['FluorTot' aChannel]); + if strcmpi(aYUnit, 'microns') + if imData.GetDim() == 2 + fluor = imData.Pixel2ToMicroM2(fluor); + else + fluor = imData.VoxelToMicroM3(fluor); + end + end + end + aMetric2= 'tot'; + % Fluorescence (z-coordinates of plot). + switch lower(aMetric2) + case 'max' + fluor2 = c.regionProps.(['FluorMax' aChannel2]); + case 'avg' + fluor2 = c.regionProps.(['FluorAvg' aChannel2]); + case 'test' + fluor2 = c.regionProps.(['FluorAvg' aChannel2]); + case 'tot' + fluor2 = c.regionProps.(['FluorTot' aChannel2]); + if strcmpi(aYUnit, 'microns') + if imData.GetDim() == 2 + fluor2 = imData.Pixel2ToMicroM2(fluor2); + else + fluor2 = imData.VoxelToMicroM3(fluor2); + end + end + end + % Plot the fluorescence over time for one cell. + Color=Color; + Color2=Color+0.4*((i-1)/length(aCells)); + Color2(Color2>1)=1; + Color2(Color2<0)=1; +% PlotWithNan3D(aAxes, t, fluor,fluor2,'color',Color2,... +% 'LineWidth', 2); + PlotWithNan3D(aAxes, t, fluor,fluor2,'color',Color2,... + 'LineWidth', 2); +% alpha(.5); +% hold(aAxes, 'on') +% testing=Color; +end + +% % Set the limits of the plot. +% % SetYLimits(aAxes) +% xlim(aAxes, imData.GetTLim(aXUnit, 'Margins', [0.01 0.01])) +% +% % x-label. +% switch lower(aXUnit) +% case 'frames' +% xlabel(aAxes, 'Time (frames)') +% case 'hours' +% xlabel(aAxes, 'Time (hours)') +% end +% +% % y-label and title. +% switch lower(aMetric1) +% case 'max' +% title(aAxes, sprintf('Maximum fluorescence (%s)',... +% SpecChar(imData.GetSeqDir(), 'matlab'))) +% ylabel(aAxes, 'Fluorescence (relative to max)') +% case 'avg' +% title(aAxes, sprintf('Average fluorescence (%s)',... +% SpecChar(imData.GetSeqDir(), 'matlab'))) +% ylabel(aAxes, 'Fluorescence (relative to max)') +% case 'tot' +% title(aAxes, sprintf('Integrated fluorescence (%s)',... +% SpecChar(imData.GetSeqDir(), 'matlab'))) +% if imData.GetDim() == 2 +% switch aYUnit +% case 'pixels' +% ylabel(aAxes, 'Fluorescence (relative to max) * Area in pixels') +% case 'microns' +% ylabel(aAxes, 'Fluorescence (relative to max) * Area in \mum^2') +% end +% else +% switch aYUnit +% case 'pixels' +% ylabel(aAxes, 'Fluorescence (relative to max) * Volume in voxels') +% case 'microns' +% ylabel(aAxes, 'Fluorescence (relative to max) * Volume in \mum^3') +% end +% end +% end + +% PrintStyle(aAxes) +end \ No newline at end of file diff --git a/Analysis/Plotting/PlotWithNan3D.m b/Analysis/Plotting/PlotWithNan3D.m index 0e10272..f85b494 100644 --- a/Analysis/Plotting/PlotWithNan3D.m +++ b/Analysis/Plotting/PlotWithNan3D.m @@ -1,4 +1,4 @@ -function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) +function PlotWithNan3D(aAxes,aX, aY,aZ, varargin) % Plots a curve and fills in gaps of NaNs with dotted lines. % % The built in plot function in MATLAB will create gaps in the lines in @@ -21,7 +21,7 @@ function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) end % Get the original hold-setting. -hSet = ishold(aAxes); +% hSet = ishold(aAxes); % Find breakpoints between NaN-values and other values. There will be 1s at % each start of a new interval and at the first and the last element. @@ -33,8 +33,7 @@ function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) % Plot a dotted line over a NaN-gap. start = bp(i)-1; stop = bp(i + 1); - plot3(aAxes,... - [aX(start); aX(stop)],... + plot3([aX(start); aX(stop)],... [aY(start); aY(stop)],... [aZ(start); aZ(stop)],... varargin{:},... @@ -46,15 +45,14 @@ function PlotWithNan3D(aAxes, aX, aY,aZ, varargin) % Plot a normal line. start = bp(i); stop = bp(i + 1) - 1; - plot3(aAxes, aX(start : stop), aY(start : stop),aZ(start : stop),varargin{:}) + plot3(aX(start : stop), aY(start : stop),aZ(start : stop),'o',varargin{:}) alpha(.1); grid on - hold(aAxes, 'on') +% hold(aAxes, 'on') end end % Restore the original hold-setting. -if ~hSet - hold(aAxes, 'off') +% if ~hSet +% hold(aAxes, 'off') end -end \ No newline at end of file diff --git a/BF_Functions/m_2021_12_30.m b/BF_Functions/m_2021_12_30.m index 310e718..211e2ba 100644 --- a/BF_Functions/m_2021_12_30.m +++ b/BF_Functions/m_2021_12_30.m @@ -124,11 +124,15 @@ %% Image Thresholding EDIT HERE BASIC %Bit Depth bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + InputPlanes={'Nuc','cyt','drug'}; + %Nuclear Stain NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start - NucLow=10;% + NucLow=100;% %Cytosol - CytMax= 0.75; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. %Gal8 Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start @@ -170,18 +174,16 @@ BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); mkdir(BaxSegFolderCell); - for i=0:T_Value + for i=1:T_Value % T_Value = reader.getSizeT(); Timepoint = num2str(i,'%03.f'); iplane=reader.getIndex(0,0,i); WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) - - Nuc = bitConvert*bfGetPlane(reader,iplane+1); - - cyt = bitConvert*bfGetPlane(reader,iplane+2); - - drug = bitConvert*bfGetPlane(reader,iplane+3); + for n= + ImagePlane(n)= bitConvert*bfGetPlane(reader,iplane+n); + end + %% Analyze Images %%Nuclear Stain Code diff --git a/BF_Functions/m_Bronk_2022_01_05.m b/BF_Functions/m_Bronk_2022_01_05.m index 310e718..c0fa4f0 100644 --- a/BF_Functions/m_Bronk_2022_01_05.m +++ b/BF_Functions/m_Bronk_2022_01_05.m @@ -48,8 +48,8 @@ %Graph Data in Prism. %% Image Folder Location clc, clear; -reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); -exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Ai9Lipo48hrs002.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Analysis'; % filetype='tif'; % listing=dir(strcat(workingdir,'*.TIF')); % ds=imageDatastore(workingdir); @@ -104,7 +104,7 @@ %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size -MiPerPix=0.34; +MiPerPix=1.36; CellSize=1; %Scale as needed for different Cells %Disks NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); @@ -126,14 +126,14 @@ bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 %Nuclear Stain NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start - NucLow=10;% + NucLow=1000;% %Cytosol - CytMax= 0.75; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytMax= 1.1; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. %Gal8 - Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + Gal8MinThreshold=1;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start %Rhodamine - Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold + Rhoda_threshold = 1; %Number 0-1, removes rhodamine signal dimmer than threshold % Rhoda_threshold_Big = 100; %% Analysis Variables bitConvert=(2^16/2^bitdepthin); @@ -177,11 +177,11 @@ iplane=reader.getIndex(0,0,i); WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) - Nuc = bitConvert*bfGetPlane(reader,iplane+1); + Nuc = bitConvert*bfGetPlane(reader,iplane+2); cyt = bitConvert*bfGetPlane(reader,iplane+2); - drug = bitConvert*bfGetPlane(reader,iplane+3); + drug = bitConvert*bfGetPlane(reader,iplane+1); %% Analyze Images %%Nuclear Stain Code diff --git a/BF_Functions/m_Bronk_2022_01_05_bigChanges.m b/BF_Functions/m_Bronk_2022_01_05_bigChanges.m new file mode 100644 index 0000000..8484300 --- /dev/null +++ b/BF_Functions/m_Bronk_2022_01_05_bigChanges.m @@ -0,0 +1,273 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + ImagePlanes=[1,2,3]; + ImageAnalyses={{'nuc'},{'cyt' 'gal'},{'drug'}}; +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=1:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + Img=[]; + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + n + if contains(CurrPlane,'nuc') + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + x='hell0' + end + if contains(CurrPlane,'cyt') + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + if contains(CurrPlane,'gal') + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + end + if contains(CurrPlane,'drug') + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + + +% %% Analyze Images +% %%Nuclear Stain Code +% [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); +% % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + end +% %%Cytosol Code +% +% +% %WaterShed Segmentation of Individual Cells +% [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); +% % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); +% %Gal8 Puncta Segmentation +% [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); +% % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); +% +% %Rhodamine Code +% [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); +% rhodPerim=bwperim(RhodMask); +% +% %All Data Images +% RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); +% WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); +% ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); +% % figure; imshow(ExportImage); +% % +% +% %% Measure Image Data +% +% % measurement +% areacell=bwarea(Nuc_bw4(:)); +% CellSum=sum(Nuc(Nuc_bw4)); +% areaGal8=sum((vertcat(Puncta.Area))); +% % +% % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; +% %% Write Images to File +% %overlaid Image +% BaxterName=strcat('w',Well,'t',Timepoint) +% +% exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); +% +% +% fulldestination = strcat(exportbase,'.png'); %name file relative to that directory +% imwrite(ExportImage, fulldestination); %save the file there directory +% +% %BaxterImages +% ImageName=fullfile(BaxWellFolder,BaxterName); +% imwrite(Nuc, strcat(ImageName,'c01','.tif'),'tif'); +% imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); +% imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); +% imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); +% imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); +% +% +% SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); +% imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); +% +% +% SegNameCell=fullfile(BaxSegFolderCell,BaxterName); +% imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); +% + + end +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m new file mode 100644 index 0000000..119ef14 --- /dev/null +++ b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m @@ -0,0 +1,277 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-11-15-Ai9CMAX PRotein Screen\ProteinScreen.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-11-15-Ai9CMAX PRotein Screen\Analysis'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + ImagePlanes=[1,2]; + ImageAnalyses={{'Bax'},{'Bax'}}; +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries-1% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=0:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); + Img=[]; + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) ; + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + fulldestination = strcat(exportbase,'.png'); + ImageName=fullfile(BaxWellFolder,BaxterName); + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + + if contains(CurrPlane,'Bax') + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + end + if contains(CurrPlane,'nuc') + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + x='hell0' + end + if contains(CurrPlane,'cyt') + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + if contains(CurrPlane,'gal') + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + end + if contains(CurrPlane,'drug') + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + end + %% Test +% %% Analyze Images +% %%Nuclear Stain Code +% [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); +% % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + +% %%Cytosol Code +% +% +% %WaterShed Segmentation of Individual Cells +% [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); +% % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); +% %Gal8 Puncta Segmentation +% [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); +% % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); +% +% %Rhodamine Code +% [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); +% rhodPerim=bwperim(RhodMask); +% +% %All Data Images +% RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); +% WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); +% ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); +% % figure; imshow(ExportImage); +% % +% +% %% Measure Image Data +% +% % measurement +% areacell=bwarea(Nuc_bw4(:)); +% CellSum=sum(Nuc(Nuc_bw4)); +% areaGal8=sum((vertcat(Puncta.Area))); +% % +% % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + %% Write Images to File + %name file relative to that directory +% imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + + +% imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); +% imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); +% imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); +% +% +% SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); +% imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); +% +% +% SegNameCell=fullfile(BaxSegFolderCell,BaxterName); +% imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); +% + + end +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/Copy_of_BF_Functions/CytNucWaterShed.m b/Copy_of_BF_Functions/CytNucWaterShed.m new file mode 100644 index 0000000..ff0c048 --- /dev/null +++ b/Copy_of_BF_Functions/CytNucWaterShed.m @@ -0,0 +1,21 @@ +function [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4) +%UNTITLED4 Summary of this function goes here +% Detailed explanation goes here +cytsize=size(cyt); + border = ones(cytsize); + border(2:end-1,2:end-1) = 0; + n_maxs=imerode(Nuc_bw4,strel('disk',1)); + n_maxs=bwareaopen(n_maxs,100); + h=imhmin(CytTopHat,1); + h_c=imcomplement(h); + h_c_min=imimposemin(h_c, n_maxs); + L_n = watershed(h_c_min); + L_n(~cyt_bw4) = 0; + borderInverse=~border; + L_n(~borderInverse) = 0; + howdy=L_n; + Cyt_WS=imfill((howdy),4,'holes'); + Cyt_WS_perim = imdilate(bwperim(Cyt_WS),strel('disk',1)); + +end + diff --git a/Copy_of_BF_Functions/Cytosol.m b/Copy_of_BF_Functions/Cytosol.m new file mode 100644 index 0000000..029f0ea --- /dev/null +++ b/Copy_of_BF_Functions/Cytosol.m @@ -0,0 +1,27 @@ +function [CytBright,CytArea,CytCytOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here + CytTopHat=imtophat(cyt,CytTophatDisk); % Clean image with tophat filter for thresholding + CytOpen=imerode(CytTopHat,CytOpenDisk); + CytOpen=imreconstruct(CytOpen,CytTopHat); + cyt_eq =imadjust(CytTopHat,[0 0.25],[]); %Make it easy to see + + CytMaxValue= CytMax*intmax(class(cyt)); + CytOverbright=CytOpen>CytMaxValue; + CytBright=CytOpen; + CytBright(CytOverbright)=0; + CytMT1=multithresh(CytBright,20); %Calculate 20 brightness thresholds for image + CytQuant1=imquantize(CytBright,CytMT1); %Divide Image into the 20 brightness baskets + CytBrightEnough=CytQuant1>CytLow; + + CytPos=CytBright; + CytPos(~CytBrightEnough)=0; + cyt_bw2=imerode(CytPos,CytErodeDisk); + cyt_bw3 = bwareaopen(cyt_bw2, 2000); %%Be sure to check this threshold + cyt_bw4 = imclose(cyt_bw3, CytCloseDisk); + CytPos(~cyt_bw4)=0; + cyt_bw4_perim = imdilate(bwperim(cyt_bw4),strel('disk',3)); + CytArea = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); + CytCytOverlay = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); +end + diff --git a/Copy_of_BF_Functions/Gal8.m b/Copy_of_BF_Functions/Gal8.m new file mode 100644 index 0000000..7a57b30 --- /dev/null +++ b/Copy_of_BF_Functions/Gal8.m @@ -0,0 +1,25 @@ +function [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here +Gal8=wiener2(cyt); +Gal8TH=imtophat(Gal8,Gal8TophatDisk); +Gal8Open=imopen(Gal8TH,Gal8OpenDisk); + +Gal8MinValue= Gal8MinThreshold*intmax(class(cyt)); +Gal8Quant2=Gal8Open-Gal8MinValue; +Gal8Quant2(Gal8Quant2<=0)=0; +Gal8Quant3=bwareaopen(Gal8Quant2,4); +Gal8Quant3(~CytPos)=0; +Gal8Quant3=imdilate(Gal8Quant3,Gal8DilateDisk); +Gal8Quant4=imdilate(Gal8Quant3,Gal8OutlineDisk); +Gal8Quant5=imbinarize(Gal8Quant4-Gal8Quant3); +GalPals=cyt; +GalPals(~Gal8Quant3)=0; + +Puncta=regionprops(Gal8Quant3,cyt,'Area','Centroid','MeanIntensity'); +Ring=regionprops(Gal8Quant5,cyt,'Area','Centroid','MeanIntensity'); %need to figure out way to subtract out surrounding brightness for each individual Point +RingMeanInt=2; %need to figure out way to subtract out surrounding brightness for each individual Point +Gal8Signal=sum((vertcat(Puncta.MeanIntensity).*vertcat(Puncta.Area))); +% Gal8Signal=Gal8Signal'; +end + diff --git a/Copy_of_BF_Functions/NuclearStain.m b/Copy_of_BF_Functions/NuclearStain.m new file mode 100644 index 0000000..ae8496c --- /dev/null +++ b/Copy_of_BF_Functions/NuclearStain.m @@ -0,0 +1,34 @@ +function [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk) +%UNTITLED2 Summary of this function goes here +% Detailed explanation goes here + NucWeiner=wiener2(Nuc); + NucTopHat=imtophat(NucWeiner,NucTophatDisk); % Clean image with tophat filter for thresholding +% NucOpen=imerode(NucTopHat,NucOpenDisk); +% NucOpen=imreconstruct(NucOpen,NucTopHat); + Nuc_eq =imadjust(NucTopHat); %Make it easy to see + NucOpen=imopen(NucTopHat,NucOpenDisk); + NucMaxValue= NucMax*intmax(class(Nuc)); + NucOverbright=NucTopHat>NucMaxValue; + + NucOpen(NucOverbright)=0; +% NucMT1=multithresh(NucOpen,20); %Calculate 20 brightness thresholds for image +% NucQuant1=imquantize(NucOpen,NucMT1); %Divide Image into the 20 brightness baskets + NucMT1=1; + NucQuant1=1; +% NucBrightEnough=NucQuant1>NucLow; + NucBrightEnough=NucOpen>NucLow; + NucPos=NucOpen; + NucPos(~NucBrightEnough)=0; +% NucPos=imadjust(NucPos); + Nuc_bw2=imerode(NucPos,NucErodeDisk); + Nuc_bw3 = bwareaopen(Nuc_bw2, 250); %%Be sure to check this threshold + Nuc_bw4 = imclose(Nuc_bw3, NucCloseDisk); + Nuc_bw4 = imfill(Nuc_bw4,'holes'); + Nuc_bw4_perim = imdilate(bwperim(Nuc_bw4),strel('disk',3)); + + NucConn=bwconncomp(Nuc_bw4); + NucLabel = labelmatrix(NucConn); + NucArea = imoverlay(Nuc_eq, Nuc_bw4_perim, [.3 1 .3]); + +end + diff --git a/Copy_of_BF_Functions/Rhoda.m b/Copy_of_BF_Functions/Rhoda.m new file mode 100644 index 0000000..606771e --- /dev/null +++ b/Copy_of_BF_Functions/Rhoda.m @@ -0,0 +1,14 @@ + %%Rhodamine Code + +function [area,Thresh_eq,DrugMask,ThreshHigh] = ThreshSeg(Img, threshold) + + Thresh_eq =imadjust(Img,[0 0.4],[]); + + threshold = threshold *intmax(class(Img)); + + rhodaweiner=wiener2(Img); + DrugMask=rhodaweiner>threshold; + + area = sum(DrugMask,'all'); + + \ No newline at end of file diff --git a/Copy_of_BF_Functions/ThreshSeg.m b/Copy_of_BF_Functions/ThreshSeg.m new file mode 100644 index 0000000..d8aa2d6 --- /dev/null +++ b/Copy_of_BF_Functions/ThreshSeg.m @@ -0,0 +1,15 @@ + %%Rhodamine Code + +function [area,Thresh_eq,DrugMask,ThreshHigh] = ThreshSeg(Img, threshold) + + Thresh_eq =imadjust(Img,[0 0.4],[]); + + threshold = threshold *intmax(class(Img)); + + rhodaweiner=wiener2(Img); + DrugMask=rhodaweiner>threshold; + ThreshHigh=Img; + ThreshHigh(~DrugMask)=0; + area = sum(DrugMask,'all'); + + \ No newline at end of file diff --git a/Copy_of_BF_Functions/m_2021_12_30.m b/Copy_of_BF_Functions/m_2021_12_30.m new file mode 100644 index 0000000..211e2ba --- /dev/null +++ b/Copy_of_BF_Functions/m_2021_12_30.m @@ -0,0 +1,257 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + InputPlanes={'Nuc','cyt','drug'}; + +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=1:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + for n= + ImagePlane(n)= bitConvert*bfGetPlane(reader,iplane+n); + end + + + %% Analyze Images + %%Nuclear Stain Code + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + + %%Cytosol Code + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + + %WaterShed Segmentation of Individual Cells + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); + %Gal8 Puncta Segmentation + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); + + %Rhodamine Code + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); + rhodPerim=bwperim(RhodMask); + + %All Data Images + RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); + WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); + ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); + ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); + ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement + areacell=bwarea(Nuc_bw4(:)); + CellSum=sum(Nuc(Nuc_bw4)); + areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + %% Write Images to File + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) + + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + + + fulldestination = strcat(exportbase,'.png'); %name file relative to that directory + imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + ImageName=fullfile(BaxWellFolder,BaxterName); + imwrite(Nuc, strcat(ImageName,'c01','.tif'),'tif'); + imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); + imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); + imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); + imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); + + + SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); + imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); + + + SegNameCell=fullfile(BaxSegFolderCell,BaxterName); + imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); + + + end +end +%% Write Analysis Data to File + +D=[Categories;C]; +WritingHere=strcat(exportdir,'\','Gal8','_',run); + writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/Copy_of_BF_Functions/m_Bronk_2022_01_05.m b/Copy_of_BF_Functions/m_Bronk_2022_01_05.m new file mode 100644 index 0000000..c0fa4f0 --- /dev/null +++ b/Copy_of_BF_Functions/m_Bronk_2022_01_05.m @@ -0,0 +1,255 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Ai9Lipo48hrs002.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Analysis'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=1.36; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=1000;% + %Cytosol + CytMax= 1.1; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=1;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 1; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=0:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + + Nuc = bitConvert*bfGetPlane(reader,iplane+2); + + cyt = bitConvert*bfGetPlane(reader,iplane+2); + + drug = bitConvert*bfGetPlane(reader,iplane+1); + + %% Analyze Images + %%Nuclear Stain Code + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Nuc,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + % NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + + %%Cytosol Code + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(cyt,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + + %WaterShed Segmentation of Individual Cells + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + % figure; imshow(imoverlay(cyt_eq,Cyt_WS, [.3 .3 1])); + %Gal8 Puncta Segmentation + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk); + % figure; imshow(imoverlay(cyt_eq,Gal8Quant5, [.3 .3 1])); + + %Rhodamine Code + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(drug, Rhoda_threshold, cyt_bw4); + rhodPerim=bwperim(RhodMask); + + %All Data Images + RGBExportImage=cat(3,rhod_eq,cyt_eq,Nuc_eq); + WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); + ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); + ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); + ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement + areacell=bwarea(Nuc_bw4(:)); + CellSum=sum(Nuc(Nuc_bw4)); + areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + %% Write Images to File + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) + + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + + + fulldestination = strcat(exportbase,'.png'); %name file relative to that directory + imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + ImageName=fullfile(BaxWellFolder,BaxterName); + imwrite(Nuc, strcat(ImageName,'c01','.tif'),'tif'); + imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); + imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); + imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); + imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); + + + SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); + imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); + + + SegNameCell=fullfile(BaxSegFolderCell,BaxterName); + imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); + + + end +end +%% Write Analysis Data to File + +D=[Categories;C]; +WritingHere=strcat(exportdir,'\','Gal8','_',run); + writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/Copy_of_BF_Functions/m_Bronk_2022_01_05_bigChanges.m b/Copy_of_BF_Functions/m_Bronk_2022_01_05_bigChanges.m new file mode 100644 index 0000000..65aff67 --- /dev/null +++ b/Copy_of_BF_Functions/m_Bronk_2022_01_05_bigChanges.m @@ -0,0 +1,279 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear; +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\20211002BigProteinScreen001.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2022-01-04_Demo'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + ImagePlanes=[1,2,3]; + FirstAnalyses={{'nuc'},{'cyt'},{'thresh'}}; + SecondAnalyses={{},{'SeededWS' 'gal' },{}}; +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=1; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.08;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + thresh = 0.4; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +for j=0:NumSeries% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=1:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())) + Img=[]; +% Red=zeros(imsize); +% Green=zeros(imsize); +% Blue=zeros(imsize); + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + imsize=size(Img); + CurrPlane=FirstAnalyses{n}; + for c=1:length(CurrPlane) + Analysis=CurrPlane{c} + + if contains(Analysis,'nuc') + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + % x='hell0' + nuc=Img; + Blue=Nuc_eq; + NucStats=regionprops(Nuc_bw4,'Centroid','Area'); + end + if contains(Analysis,'cyt') + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + x='hell0'; + cyt=Img; + Green=cyt_eq; + end + if contains(Analysis,'thresh') + [areaThresh,Thresh_eq,ThreshMask,ThreshHigh] = ThreshSeg(Img, thresh); + drug=Img; + Red=Thresh_eq; + ThreshPerim=bwperim(ThreshMask); + end + + end + + +% ExportImage=cat(3,Red,Green,Blue); +% ExportImage=imoverlay(ExportImage,ThreshPerim, 'y'); + CurrPlane2=SecondAnalyses{n}; + for d=1:length(CurrPlane2) + Analysis2=CurrPlane2{d} + if contains(Analysis2,'SeededWS') + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + + end + if contains(Analysis2,'gal') + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); + + end + + + end + end + ExportImage=cat(3,Red,Green,Blue); + ExportImage = imoverlay(ExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); + ExportImage=imoverlay(ExportImage,Gal8Quant5,'m'); + %% Measure Image Data + + % measurement +% areacell=bwarea(Nuc_bw4(:)); +% CellSum=sum(Nuc(Nuc_bw4)); +% areaGal8=sum((vertcat(Puncta.Area))); +% % % +% % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; +% %% Write Images to File +% %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint); +% + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); +% +% + fulldestination = strcat(exportbase,'.png'); %name file relative to that directory + imwrite(ExportImage, fulldestination); %save the file there directory + + %BaxterImages + ImageName=fullfile(BaxWellFolder,BaxterName); + imwrite(nuc, strcat(ImageName,'c01','.tif'),'tif'); + imwrite(cyt, strcat(ImageName,'c02','.tif'),'tif'); + imwrite(GalPals, strcat(ImageName,'c03','.tif'),'tif'); + imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); + imwrite(ThreshHigh, strcat(ImageName,'c05','.tif'),'tif'); + + + SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); + imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); + + + SegNameCell=fullfile(BaxSegFolderCell,BaxterName); + imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); +% + + end +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file diff --git a/DetermineCutoff.m b/DetermineCutoff.m new file mode 100644 index 0000000..e69de29 diff --git a/Make4DMatrix.m b/Make4DMatrix.m new file mode 100644 index 0000000..520c4ff --- /dev/null +++ b/Make4DMatrix.m @@ -0,0 +1,46 @@ +seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-11-15-Ai9CMAX PRotein Screen\Analysis\Baxter'; +TrackVersion='_220106_115446'; +FilePath=fullfile(seqPath,'Analysis',strcat('CellData',TrackVersion),'Compact'); +a=dir(fullfile(FilePath,'*.mat')); +b={a.name}; +HasCells=[a.bytes]; +blank=~(HasCells>185); +d=b; +d(blank) =[]; + +for m=1:length(b) + Run=b{1,m}; + Run=Run(1:end-4) + if blank(m) + BronkBox{1,1,1,m}={}; + else + cellPath=strcat(seqPath,'\',Run); + cells = LoadCells(cellPath, TrackVersion, 'Compact', true); + fluorProps = {cells.regionProps}; + fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); + fluorProps = unique(cat(1,fluorProps{:}))'; + BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); +for k=1:length(fluorProps) + currProp=fluorProps{k}; + Test='MinorAxisLength'; +for j=1:length(cells) + c = cells(j); + t = c.firstFrame : c.lastFrame; + tp=1; + for i=t + BronkBox{j,i,k,m}=cells(1,j).regionProps.(currProp)(tp); + tp=tp+1; + end +end +end + end +end +empties=cellfun('isempty',BronkBox); +BronkBox(empties) = {NaN}; +Data=cell2mat(BronkBox); +means=mean(Data(:,:,:,:),'omitnan'); +medians=median(Data(:,:,:,:),'omitnan'); +stds=std(Data(:,:,:,:),'omitnan'); +vars=var(Data(:,:,:,:),'omitnan'); +sums=sum(Data(:,:,:,:),'omitnan'); +CVs=stds./means; \ No newline at end of file diff --git a/WriteTest.m b/WriteTest.m index b754eff..ff18a92 100644 --- a/WriteTest.m +++ b/WriteTest.m @@ -1,15 +1,25 @@ -NumWells=3; +seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; +TrackVersion='_211231_152842'; +FilePath=fullfile(seqPath,'Analysis',strcat('CellData',TrackVersion),'Compact'); +a=dir(fullfile(FilePath,'*.mat')); +b={a.name}; +HasCells=[a.bytes]; +c=~(HasCells>185); +d=b; +d(c) =[]; + + figure, ax2 = axes('Position',[0.1 0.1 0.7 0.7]); -for m=0:NumWells-1 - seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-02-BigPRoteinScreen\2021-12-31-TestMultiTimepoint\Baxter\'; - Run=num2str(m,'%05.f'); - seqPath=strcat(seqPath,Run); - cells = LoadCells (seqPath , '_211231_152842','AreCells', true, 'Compact', true); +for m=1:length(d) + Run=d{1,m}; + Run=Run(1:end-4) + cellPath=strcat(seqPath,Run); + cells = LoadCells (cellPath , TrackVersion,'AreCells', true, 'Compact', true); fluorProps = {cells.regionProps}; fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); fluorProps = unique(cat(1,fluorProps{:}))'; - Plot_Fluorescence3D(cells,ax2,'Cyt','Drug',rand(1,3)); + Plot_Fluorescence3D(cells,ax2,'Cyt','Debris',rand(1,3)); % BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); for k=1:length(fluorProps); currProp=fluorProps{k}; @@ -19,7 +29,7 @@ t = c.firstFrame : c.lastFrame; tp=1; for i=t - BronkBox{j,i,k,(m+1)}=cells(1,j).regionProps.(currProp)(tp); + BronkBox{j,i,k,m}=cells(1,j).regionProps.(currProp)(tp); tp=tp+1; end end @@ -35,7 +45,9 @@ sums=sum(Data(:,:,:,:),'omitnan'); CVs=stds./means; figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); -for n=1:NumWells -PlotWithNan3D(ax1,[1:37],means(:,:,2,n),means(:,:,3,n)); +% figure, +for n=1:length(d) +PlotWithNan3D(ax1,1:length(d),means(:,:,1,n),means(:,:,6,n)); +% scatter(means(:,:,1,n),means(:,:,6,n)); hold on end \ No newline at end of file diff --git a/WriteTest3.m b/WriteTest3.m new file mode 100644 index 0000000..f9cd6ef --- /dev/null +++ b/WriteTest3.m @@ -0,0 +1,58 @@ +seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Analysis\Baxter\'; +TrackVersion='_220105_121225'; +FilePath=fullfile(seqPath,'Analysis',strcat('CellData',TrackVersion),'Compact'); +a=dir(fullfile(FilePath,'*.mat')); +b={a.name}; +HasCells=[a.bytes]; +c=~(HasCells>185); +d=b; +d(c) =[]; + + +figure, ax2 = axes('Position',[0.1 0.1 0.7 0.7]); +for m=1:length(d) + Run=d{1,m}; + Run=Run(1:end-4) + cellPath=strcat(seqPath,Run); + cells = LoadCells (cellPath , TrackVersion,'AreCells', true, 'Compact', true); + fluorProps = {cells.regionProps}; + fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); + fluorProps = unique(cat(1,fluorProps{:}))'; + +% Plot_Fluorescence3D(cells,ax2,'Cyt','Debris',rand(1,3)); +% BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); +for k=1:length(fluorProps); + currProp=fluorProps{k}; + Test='MinorAxisLength'; +for j=1:length(cells) + c = cells(j); + t = c.firstFrame : c.lastFrame; + tp=1; + for i=t + BronkBox{j,i,k,m}=cells(1,j).regionProps.(currProp)(tp); + tp=tp+1; + end +end +end +end +empties=cellfun('isempty',BronkBox); +BronkBox(empties) = {NaN}; +Data=cell2mat(BronkBox); +means=mean(Data(:,:,:,:),'omitnan'); +medians=median(Data(:,:,:,:),'omitnan'); +stds=std(Data(:,:,:,:),'omitnan'); +vars=var(Data(:,:,:,:),'omitnan'); +sums=sum(Data(:,:,:,:),'omitnan'); +CVs=stds./means; +figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); +% figure, +xbar=categorical(d); +ybar=[]; +for n=1:length(d) +% PlotWithNan3D(ax1,n*ones(size(Data(:,:,6,n))),Data(:,:,1,n),Data(:,:,6,n)); +% swarmchart(n*ones(size(sums(:,:,6,n))),sums(:,:,1,n)); +ybar=cat(2,ybar,[sums(:,:,1,n)]); + +% scatter(means(:,:,1,n),means(:,:,6,n)); +hold on +end \ No newline at end of file diff --git a/WriteTest4.m b/WriteTest4.m new file mode 100644 index 0000000..c5e3539 --- /dev/null +++ b/WriteTest4.m @@ -0,0 +1,64 @@ +seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-11-15-Ai9CMAX PRotein Screen\Analysis\Baxter'; +TrackVersion='_220106_115446'; +FilePath=fullfile(seqPath,'Analysis',strcat('CellData',TrackVersion),'Compact'); +a=dir(fullfile(FilePath,'*.mat')); +b={a.name}; +HasCells=[a.bytes]; +blank=~(HasCells>185); +d=b; +d(blank) =[]; + + +ax2 = axes; +for m=1:length(b) + Run=b{1,m}; + Run=Run(1:end-4) + if blank(m) + BronkBox{1,1,1,m}={}; + else + + cellPath=strcat(seqPath,'\',Run); + cells = LoadCells(cellPath, TrackVersion, 'Compact', true); + fluorProps = {cells.regionProps}; + fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); + fluorProps = unique(cat(1,fluorProps{:}))'; + x_in=m; +% Plot_Fluorescence3D_2(cells,ax2,'c01','c01',rand(1,3),x_in); + hold on +% BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); +for k=1:length(fluorProps) + currProp=fluorProps{k}; + Test='MinorAxisLength'; +for j=1:length(cells) + c = cells(j); + t = c.firstFrame : c.lastFrame; + tp=1; + for i=t + BronkBox{j,i,k,m}=cells(1,j).regionProps.(currProp)(tp); + tp=tp+1; + end +end +end + end +end +empties=cellfun('isempty',BronkBox); +BronkBox(empties) = {NaN}; +Data=cell2mat(BronkBox); +means=mean(Data(:,:,:,:),'omitnan'); +medians=median(Data(:,:,:,:),'omitnan'); +stds=std(Data(:,:,:,:),'omitnan'); +vars=var(Data(:,:,:,:),'omitnan'); +sums=sum(Data(:,:,:,:),'omitnan'); +CVs=stds./means; +% figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); +% % figure, +% xbar=categorical(d); +% ybar=[]; +% for n=1:length(d) +% % PlotWithNan3D(ax1,n*ones(size(Data(:,:,6,n))),Data(:,:,1,n),Data(:,:,6,n)); +% % swarmchart(n*ones(size(sums(:,:,6,n))),sums(:,:,1,n)); +% % ybar=cat(2,ybar,[sums(:,:,1,n)]); +% +% % scatter(means(:,:,1,n),means(:,:,6,n)); +% hold on +% end \ No newline at end of file From 6415c8cc1c47ea2a2a7bde5c1d3dd0946b9fecdf Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Tue, 25 Jan 2022 14:52:33 -0600 Subject: [PATCH 05/15] Write Test Run Changes --- BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m | 2 +- WriteTest.m | 2 +- WriteTest3.m | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m index 119ef14..c7367a3 100644 --- a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m +++ b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m @@ -157,7 +157,7 @@ % %The next few lines are specific to 2 page TIF images. Edit from here % if you have alternate arrangements. % currfile=strcat(workingdir,listing(j,1).name); - CurrSeries=j + CurrSeries=j; reader.setSeries(CurrSeries); fname = reader.getSeries; Well=num2str(fname,'%05.f'); diff --git a/WriteTest.m b/WriteTest.m index ff18a92..a8fbbd0 100644 --- a/WriteTest.m +++ b/WriteTest.m @@ -14,7 +14,7 @@ Run=d{1,m}; Run=Run(1:end-4) cellPath=strcat(seqPath,Run); - cells = LoadCells (cellPath , TrackVersion,'AreCells', true, 'Compact', true); + cells = LoadCells(cellPath , TrackVersion,'AreCells', true, 'Compact', true); fluorProps = {cells.regionProps}; fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); fluorProps = unique(cat(1,fluorProps{:}))'; diff --git a/WriteTest3.m b/WriteTest3.m index f9cd6ef..e497bba 100644 --- a/WriteTest3.m +++ b/WriteTest3.m @@ -50,7 +50,7 @@ ybar=[]; for n=1:length(d) % PlotWithNan3D(ax1,n*ones(size(Data(:,:,6,n))),Data(:,:,1,n),Data(:,:,6,n)); -% swarmchart(n*ones(size(sums(:,:,6,n))),sums(:,:,1,n)); +swarmchart(n*ones(size(sums(:,:,6,n))),sums(:,:,1,n)); ybar=cat(2,ybar,[sums(:,:,1,n)]); % scatter(means(:,:,1,n),means(:,:,6,n)); From 9426dd24aa07296eaae97b3d82d79d80ee764924 Mon Sep 17 00:00:00 2001 From: Michael Weirich Date: Sun, 30 Jan 2022 15:19:04 -0600 Subject: [PATCH 06/15] Update m_Bronk_2022_01_06_for11_15_assay.m --- BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m | 1 + 1 file changed, 1 insertion(+) diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m index 119ef14..501cb6b 100644 --- a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m +++ b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m @@ -8,6 +8,7 @@ % Kilchrist, Dimobi, ..., Duvall; "Gal8 % Visualization of Endosome Disruption Predicts Carrier-mediated Biologic % Drug Intracellular Bioavailability". +%hello world % University Email: brock.fletcher@vanderbilt.edu % Permanent Email: brockfletch@gmail.com From c1e554047a8962cae6cafd1ca8a96a7c2015188b Mon Sep 17 00:00:00 2001 From: Vasco Singh <88992223+VascoSingh@users.noreply.github.com> Date: Tue, 1 Feb 2022 15:47:10 -0600 Subject: [PATCH 07/15] Add files via upload --- TestApp.mlapp | Bin 0 -> 50023 bytes WriteTest3.m | 33 ++++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 TestApp.mlapp diff --git a/TestApp.mlapp b/TestApp.mlapp new file mode 100644 index 0000000000000000000000000000000000000000..3c508adf39b71aef749199a258a385809dfbb39c GIT binary patch literal 50023 zcmV(vK02lxO0AX-&WMy+{XKrP3FJW+S zO>bmnY%XnKbd0!FP#sJYu1j!tcPBUmcekLy-2=hh-QC>@?ykYzS-86soQ1Ps?R@7y zwXgS7bxrqET|F~5GjETgn7V?PI5`&!8@ZyGI2hXD4Up z_HR1=XP&u-X2!;e#-_%`Pz%JO$mYRc7*hd}p`C%ed?M}SBCK5XCHQ6WVL@07tkA>1 z^X;?FOQkB2uccl~VN|3<`{9O3kl}rxe;>p;W`_-|u8ZIg<3Sv34JYRgQ}-+=2t|64 ze~`+)dChN4gdZuvel>y|?4AleL6fTR!N$ipVK2%Wi?kq>{eXi#7(~Ej@m1+XM)xUW zBM%B3rZh$m4uNO*qDmBGE{uc=)JUAh3%pmvic3*TiN$h5L1t2OQ&gQ%bH$oTPH~G% zVPa-hRKtp6nvOL-A=+angH4=)`vM{NN*ngyVISfCJM5B}~oP2x7$e56V`P)AXI!jJHNIFZCHO_iHFknPd?2E*l!AjpIHn0w@j!WXi18i~hQ# z@251pK$S@7zdZR#H?ImChR^ z69k4D1b^8Nd4W^)jX1lCvzK9G`GW?a9PJW7ckJ<$jHM%KQVhFEmZ<|!!aFs0$@pCH z{td|=80x>cHZNC!gpYM6gWs^LHUGZEib=h1U}bRh2}lx6wrDaJSTre!v;a$VGRcqAfD6g6E8@|doNMCIXX~m>A|nMeVVAR z1+f9uSjGK-5sJPQl;&3@vBIr~9$z8}BH* z>Zt$tAvT&Nbyk6(kshDP_7I}|;v7C#JJcGk7!3s63x137)O`Ig7=C9txEjk1jqkx| z_?3u?0$_UlvELivxGT}IeCLMCw-aU;_Vcsyq!SJO8g6xO&}xmSK~<;6Ow(WG_*p14 z;0Dn*Ys71t$;M2BD`?R+sNHxQVK{g^l;U1#0_*@2fOhv>x1S*|*%>~Ol8m1wJN$>! zN0j1}DL}H_n0tymboB8L{?{sZid_|oUH)W;55(8EWnDEyuO#`+JzI$TqYyxq;D_PB zs+eycpKnG7wFVh+-}7**opbyCYuALd;0X zer!bTy^JCGU=)ddT^Yyo>16O00#(1QTD=SAt(7}!yn-lCinoM+W+NS*^Ezm_O-Xk= z5pSsBUX(*iN_PCW>_ap;p;Be#%W!@4M0s*sdX|jj1j=pk^8XaXd4>O-D`As6 zN*!PLu4r;D+Nl-0ayNu{U?A45Do|d;O)E^h0bWI`>Odxl3#Af4p>Jw5ISwc*9s6A% z&AAZMp*~~dfey$cAO)~y9z8GXyFIF2ZALC(&0%@1vNH#traJHUkFm~BHK9LDh~of& zvo2S3o$Hc^hl1ZmKiAavJ_+B^o*eFSM>@g|E zu`VQ3xd95$?X-1N#L6Q*N#6zsKMG|0!9Ft-j~@-|96wQwhW}1ohjz4#ad$rf`_#UoffRUBo1lJgwYUY?Rl=8hS3=kQd6z zy4=eS^6Qk`p1nuuNO@R5Xpa4GiNT_`aDg4SXpRTdaafo#{zgLHRW>UY%$=nROV1TI z)o)e3GRxil_(UJZc|u{kmUH<(pL`YuY<@We_nzEdpjy}rkpvrwzE8kS-CbD5KF=Jm z;%{Uht`l6+7|y;2DpkZZUl^?Bq`lWPwfCZ!c?c;2TFi|4P8%jqrRP+}&5`=Qi(!pz_CygJ5%r|eilW3qNa4@HZh9C+~z^UPWK!up#xE8_VR{RxHO*aVDV~nVAn0QHUrf=-e<2iy3kcW*>?DcU%8b6i^87`s; z@}be0I{GIqXlm4#Y}Klr)wY?72+Y-PRGj-D|d8Vw&sOcb~>96_@ylEi#+_)&X=*{l=*=i?QwWAX@xo1RE zI>JO;zKt0+dN?O< zF;@sREI@;B<;4j6n9N?ghTSh)-kd0f1*KC(E}8-qsN`43E_9R~!=mV{TLi&Z z=5!EAyD)Kb*ANCh3%iJMs>G}Man@YpgUpJ1;iR1tgLA!xxzAxjW38=3KXa{vIrusE z!NQp(W~Vin*6tt)4Mpe%9PVl;#`01x>+}MQ{+(zrWI@ro?cbG53>abF*j=o$;rJq(sUu;cY8#9w#HL=h*y#$+js&EKKUpmMS@$h8oC zgF-`CBT|!PE9W~G{b*d^QnAH*Oh9v{s;lJP*pFOq2wE67xs<&X_}T-F>COP+_boK# zP$1SMi1E!LG(J%s!g=)K*@xxaE>@)g;C<*TMRW8xPyF<>XjzcaWE=mfL#Zt&`Nxv4 z9jxa1olMvR037Go71Nbw{sCX*sA&e3c$(%~;wp`ojzf_jcwbVNvA!ivRYI$0`g#?X z46LHwf!i!8CG?>NrCJN(R}~HI7ElqP?9pbwM+Z-;h4AiqQ~t&6rXMjl1op=|YdBPR zsSH7!ACfLBl)Yr#VV?OLD)Id(3%`fBZJ&0cJwe;txoWd?ORhR@*+2+W3#wjOgf=|6 zExlSWDC)6Y`%bSEf)#Xt7$)a|!>(0X$)8eQgy}PBKG=AFj zw=~?^y0JtORGen*490CXV@bjO!jQ?V+lo<@bM+1cq7>b!GHcE9vOU(#!9Q$?VY?5H^la z$9QaFxA+<|I9%7GFXC#ZaGW=w>xy}WIblbnC=`ukYVV-Af@~5XflC01VZdmY7xG}{ znm~~pXYL)*mQ}<}0E-d%(XgMD&et7-nz%Z>^~l1W9Vap;C;2%FNb0jrNIFMGu~gS< zwG7oaRuh|@)iljc3Mynb6GMf-WHcA9NZ!RcSGRJBL2lS&s}3M+c#AVy@C6-)vhwS< z=XH2cU+CsfiRWN)6i14GDU7a@BQl*-PC6m&4r8(!ZRH__j0u46Y~4MwuUtV)H&sfD-%>9HRDe2Fp;jRp0Xv?WSt+HzO=_Qbb*J z_uYKVxihyn_RUH0TT&bnc)bT;IC-3-E7>Fg$2y)b5@ z4#sM$RS$Cp*cm|V6)yT9Pk&_q+8zqJzwY37xM99G(wEuLP`HQ#)nB9Gmwwx?+O1 zZWRDT;O8>YowJ)J=AB;dqtb?ph9awHiyyq!1K~UR?6t&IRto=(=^6LQSPl85{L^@M zP{J7kXRE`iddy{UN#|<1I+|#X3Wu1r(d?MIYKXK}h4!Fj!_%C`Lp)(O7hboZ%E{x@ zu$y@U;;Em>QyNKnmLK7Rvis_Zy4KFohCcmJ*XsV9;?Ka&>@lVn9DsrhuJg)ta#_g$ zrA^HBLJ7iiX6P^0hlSiU{OrXWxPiO%mCaXCsm?Q9!2-P8Sp0yAiRi~({JFt|Pmvzq@SO~Um}4XNCQ}fjl4i}bhD^+( zp%e3p&vIPUarenD2gw&ek(0%z;g#=0#zlKptJ+J?^{9UAtphJf1|{e;uLh3_gqK_M z&&SKF$)Ez|D6KGJd@}Q#IER9h7oE5U1J>v3Bwy-zb?T*G+VifpX9ePMr~WA*oT=CU zDehry%Vu>c^gJDGIZQG+QFQ9>*w|m7qD>)SpbFum5re;GHdEuUTVkj0H+e$L+%SQJ`xnZ3NU!w~;PsmX&4Zo#&p(j0r$ zi{hHPEudb}uSo~CThwIFCaf_JTMGo}J>5BNuty{;=9}Fg-jKV0ALUiHK)tycCl+>~ z8@=~ZHnA7^R9hb#JD(;Np0y%QAq&9EPS{QJ^99*Y?;jS-vXh*GEZNc%0%&K(L}LEo z>wh>`5$H5)LPk~&=kmgPy5O4&T>DpHf;cS??CbAQ12pQ_*2o2mKUMw(;Wa9Ao!*QH zFX#2~ykql$M?iJqK%+tJUR1wd|7?A1bzk-5)`_L~l{cd~A;AU4#nb-@iwGTc`A5L$ z{pXk1W1!)Lu<(t>^ga+3n3vbiMxV|r&W_4pk z0TLlZS-o`leJfapLh~;G-en+JZBG#e!0beX`r0iUMP0Rq|E*UbYxvYmMLB=| za#&^Wh!PTmTsOfxc{r3eHXp&4&_pwRmNBbSa(iApM_ zVsG(;VSljf%pOs8oVW)v?6Bt#49`{E;}UA@6xAPJ@zJiLSky_NkdE@kiTjJdg!e{Z zN$gTZ{yxr${Qa0eJm<}7`m2YBy+t?~U$-x-gXSjBvwp^hY$s;RMe$jG>al+6U3BNd z1w|T2@IFyHyryhVHR|sy!2XmX5ZQR`foZmVLpl0qS25PDkFMmgYjy7(xp#LD4%vTh zF9Mm=>~<~DlP%uE(YD(vq%&ib-jO{#*h{G^$vCXkEWE9N6Ss>m#c_)T#Fx2AX8e&5%Fjn%$V}0*X83=MqK(t5SSM11P7c zZVkLbn_KSTPc4rzW~V2qa#PY|@cZuJ54A}56?~{YLph#27t0cR5ZopXFlNUlsV?3A zC3zt2&vV!&wW;2vKqG~Gbch}?&;-{(M7ds=K>K-p8s_>Vy z(H*DGPTc=(QpuI^+vfPp&^DwfxJP_V)fzAF9^6XR%FMY(bWt-jv7cnT?2-xAs+jUz zgtd9V?i+gT;Edm|$sJ)|lHm(~`#PplFtm?vT|q2?l4e%%+ZmZ_`T+lLC9#Cizp&gH z`B6Rocm5>%k{VyQclu}}JB5?2?blh>+tGVVeOV9z8D;=&=x{-V!~uYc;_h@l@r8q( z`cn`$9yx$E>;N=C3TEmXdJ~lC{>}oxs!yLn8n!vQr@Yhc?3V0SVqwLq&zNEyCOZ0- z)tLy?c;lJ;iFn7-sX+57!Lk_Xvaru}P!)`afrnryt*>>fH;e*ZPixQQN#bNPkQ3{$;N zAlQ=vAHRrPdG+#d`sPpVwuaZc84R^t;aya#JnNlO(uR^p(%z1LWv zAB)e;Mh;`IN2ULBl$pq#{{US!JI_xLnX{GhJG<6>z&x%kIHtu)4&=iU5U(m^e4{EP zNRUk0fL2YKk1B_@Mx=o@r<+b%D6kB5UqPBE^B5>t6`@0MZel3w9jN@+z)3CCU+(Qm zM=f-TD2LV;UJ|h@z5r!i$Qeb!DX>1@0zL$;eJ-C`Wdc(5w3N1e5NQv3LyId*!fC4@aIx{+XKs(3S5=uR&5WgVw=}uEu#kbKi4fl zE{OQxt=Ky%fb*jAqsZ=&j`4l>57GQE0an?O?w^$T%xY0wF$+jc_{ihTay8ZQ^DN1(Lc1++y=ESw5MQ_-kW3R~I%G^V zZtm3+oMLeR6ltax>-H^pl)D3#Judb}aZMe~8O?q_z3diVbP1F^j%1&`nJQksS=65Q zCayRI$X>ii$X-P5+8K;NS@^@rXBx2q-|5Zk4*?XlhphW^ZXme-R6>o;&lU|SY+;{3 znO+&WajH`6k}ioq@_)KguhkcZA^jr}5ziLL>W)RyH0iC*+0K%$T}Qjn-hC3XJWl@z z+FW(M&j>X>e?C3W2myo1;W1ljer=Y-wOlQ>MSpy3w815rMYQEz-Ym4`dTfNyWiC=rY7hLlx#hADCX=dT z_xDfs#+e)PdqVoV|K&aG;WqK(^x-!0W6;|Znd@7~D^pPfj-Xa5bciW-&-Dns)%Ia0 z>B;!yBiq>S2Fo4aC^*QErI>l9VlCMo;29Bv9#$eI57j*#MLL z0BJOtHNfwP;>*)eQUHul{$^4D#H&aS6W9!tC4(lkuDm2c);s&4VboF1*90Bxz@H3S zNZHE?g5Hg#-@90t@7aqWOp3bf81vc7M~8Xl#oSuFN2sW$k$q^TUVnU)!t`U7a`$6a z4E7XvK}{<%adUI-FbWEv)|#HF^)}MTPJqfq&zNe{f@iQRZ}mm$JrO zVY%%2J?Aqd$cC@fcwwW1$;=4%p+Wjq4JozS6is@kQMC5hia4x}V_J2Bq2`v5X|4T+ z``F5ITTeQyN@nVX@M5`gmKY#CCGKY@I{(=ETc$g%=(dLYwg$BzkrCa`PQ0l8>fdgl zqI!E3-2JX(F-XBgXzQ(Q9RCa{YQ>#qe#4&nV~6CeC!!el%Tf{DKaLl*@mKEIh{zPkB? z+FKwy`LA8%Gd^YQ-IRqQ;w~UzhLHgzsOX zM*U?6u;M-(EFk*~U2ZSj;L0tMZhvv#{zAR| z#d77lP%9-!M2#54o=tGI?Z9xv!#oNqQ+x0b zQG54<<@u8T*eDag)c7D1FZyPN^DriTmY_ICmP7K<7*;~pmTX`d5catS`_V}9W(IfE zvY4a>!FT2SFl>JoB}D%K{h4oo^wAJ6X}K!lVC(oGUDIb7K-tyyc^P!bic9>%NGs*+ zf>8L2n=$Ji2yPEVw+G6AIz6PenMLRal|TX20$;8ALCD7bxNIV)L9bqLCwLIRm>;eX ztE*6f?_&KQ=tti8-g}Y7aHa-E3H;uBnKEb~rRzsGvc10DU@%QTn07A!>9+5xAB?)b z8q`IdxeGOY19gH10gMQIrHWRhBNMpg!J_yq0j&m21%h$)>i?O{)ATnumIgjAi*QZ`H6#mfZ9-Q8iBz(H*0y3KUGr?HvgiQ znIr(OoRXbLq&B*H3|}PgY4NtzDN)T^s4w;dnZdcBo+96&AMFr;cxMTW6zQVz2j)8L z{}}-ppjN0Uc`C6aoF26a(xD#ALOshrbQl@RY!7W5M`$DU_aJ$1b*VJ@ptF40T#$dJ%1W7QCNyX6QndAp8uMXHexGN;DUtIzeg!){!rbmnyiak zPBkE^t{(60%Fgnqa1`U~!Zi+*L{KCkJ=E8{J${}dO5)FD6Hqe2izuoJbuU%%FO0b!H zeT@C{mnT2 z&1wD3tU;DWR^b0N%$J#Zu~-`TW6G8r+t;;vb(Donh4(98@z}f9{`|S`M?{l6nrTu> z&t70zWMN_$4`GcYgvJ~|dMk>O4TfZJ#v|SPVoJ`w9|kSPvVRghPBQ4h58n69Yq@+d zeG1}RPq}&abD8DY4VcY+at%|4f5Y0f5nsYgoOs(5ivyle9Z+_Wr3(I)reAX0QG0i_6_!d$PW;wC)OQ7 zET8p>lou|N^-7V^Y zz+T?4$3R!)O_0aozUQ~Kr8&RgD9Z4XQSdoLuQC)^t=H&OX`^M-Oa2=evF|FM}1 zrQv<4$rIfrK4r20ATAPIs?&Mt34e!m#Mzu{(y-+NMSx~12<@V5UApQ~CF@rnv*b}0 z{5ET?DF_25ezm&wI$*hlIe6WR8K!-~bbC9ZJRSnt)gi zpYd5Ox+N<-4*b>_v9%{h9rM87^0cyMZ4^%3%7CzoUMc6@Bd$Bwba@`c{Ko>ueP)MN zq9ode^_D=om!-@o<5zoyLCe6o>KtVW;a*gKgIWnutqYanYPX8zWqxS4R#dk?x)I+0 zaLA6x#asnmz;1TtEczmW1wR~H9#qz>n8K-XnTsq8zaP#S@!vTs9xpq7+vfawFnd`5 z{vsH95lp=(5`FGq@+QOaVfH2m){gM6dv_ArCA+?r;RPlAdECB5d>U6fY7Z))^~V7r z->Kj78mPA(KgCWt?F-B7Z!=+%X^I;d0<&{ypH1K%+rQ`1wa@GSMff{mjYm@h%(AnD zzwqINXVep|;3zPv0M>x~?dY@J3^*<0>mw(-Ss#*CuibYFtLmCw<;SEM7r6wo9Yg{R zlBWdHj#~lU?mL7s1`A`Slk9N@&Fem&VXhxwfDzu`SC>408DX;Krm%ev>P3Pf&XcLv zdEt{)ffM;YA#NAl%hGghtqhzDueK&Z-5^1It-xze{N9$@bM+Mkx|Hzs>{!ch^&_VQ zX!pJAGJY5`ehUS70NO(r%Izpw$~3NNbwPr2PsbQpy`tt#&LyGRcR?bi-W?Oy-krZ; z=YI3e`HwZ0LKiv!Vg3~_e+E~jBd~JDDeR+whzNiud-9Mmu{?gncb3`&}55qSMJ-p5AFMtbbGE zv{%Yx?z3+ekT!$uM)-dhkhVd>qBOQ!6InxQQHyvm9CW(qy=qb-8g~~(m18!O0kqD7 z`?9J=WFEDI>Csx!;asVPhT#ieH*l?B9*=q_30>s3%hlcW(SdnvN?e<&bas~h=5xM_ zP>KMZ+*f~jdW4@bGpE{srryantCft`4;*{CP|}yQj@|UVc7{8>!_|+cJJc7EFg`0hPB3Lf6)dr?+zczhH4=ynM<%U^H_nz(?K>jPqDL{pL zWhW4(+S?VpzfqB|Rub77-baE%%3#mWPeThFhp^|ANr$-Ip?AKhgZ<~;!OX}fxtSZ} zi*nCyHwr_@5hUFuUrq5_0Md&XlIhf6q-fk1qWkyc&k*gV9W!w_x+h;t(yQ(;67?Tg`otd1Hp(|$ZBI>{X2EU zXANlbw8%f#>F~Nh=klWdS7N;-Clr48gNfPQ(j-rL#709; zf4Hdvt@>G~ccPVQ_nhlw(#ISBo3)|O9`1lP>*u#NDP}yBarGV@{)0e2go4dTw6&65 zK;l!%-=U2s`_kTz(3WL~<=^ubUTr%07a;%Q`@^T}{M)6+dyH!Vgln77cYbUh7eHyx z7YVRhHE-%K9`#zK{B@<{etf|~&9N)*3}hsud)#s*RO^;={E#8Wv{Mq-p8)rHoD&Vd z{b-h=iF`O<{Wk!xlp4T4*(^)}Aash#utD9sXTvt`fEj{Cmcr*YSquJ+oj2w;eCW@M z_QPezPA4`FS1ix^c*t!x z5&m>C)R$r^S2N#-1X)+xFX003RPY)tr))mECm?rMdGYTu`0ysBxh8;p$aBv_^`X&L z1cv>0X~z|QUY!6PxZz{V^ji>rL4Lu@$G#ti)M`08scYY0RRoRu-TU6SNZYlh{e{0u zT^IOuq@a8mnB0LRBvN&XBUV2v0hn?fph@LfGsB*RS}3tVf9`Pm=!?2@qg{(J%{%}8 zVoND(oG|}Ld&DQVBr`BY(XId0&|=IzR>XFS#$v?Wr*;e%eJMk$u`@chjA{{{l_Z|- z@3`-LN>V9`k<=`KaV-|t<8HTOt>}7YOPm{<t59PyYv=W z50wH)LcFzo+A_swas)f{p>R(g605DXphi$%mHZ2nYo(+}ukG1RjmXof&If=gs%x&a z_)kkxZaquhlMk`S#~&=$pSSkI-c;}ZYViKsa++eor?!cg#PZvam{ylze9_Q1cpj>~ z&;PHDztpkO*3ck?l|trFUVn)OmKPX_D2o^wDF=WFpbYeNJ32ZP zFvvXaI;DKK^sVb?L6;1|+pkJm^8TnXagPWw@Fd?>8fPUJi=Z3BSNC8L5ZLEG4WZ8c zvI8WAfbCA%1^E%#2UM0a%CWKE!iGnNvkx#S74KSsub%_Hty7oj9xL;%QAw z{{UurJ7%o9yB0mY?TvtdB55~&8%E(7@bK$Kl(JerpljB*P6@bd2>$Dzy=DHv?Y2_i zV|`kOR!|4ZD^{{+0V*_O5=PfMs<{T!*X_U52z=g&jOTE$5H=|f7P<5~tiZ(?_;16h z-#|SJYH?i$qMp9@E#Q$Vy_cP0lzAa3A|&mbxczHEJ|9r+e|;949TW|oaCQ5;jYTYB z1#Ek(fbv`SMMyC9feAXk1(VN#d*G99l;b;*Vk04c%U*C>9p7PBsV8ELA=6l%?ZeHT zGm`%`y|9ESrGnXDkpfqrFg9K@`O`kUzlW@Xx~)RXFIVr%+1`+gsOGH2-t+a}bn#w< zx?{k)J^)W^X4Mo=8i?6zQRn(HScimf9>EdoHySmF-6LDIy z7TExuVp$OW*JDN_c%!S{?wBj?0HK1ZcBU67jK�jpLo5|^--6?WQ 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 literal 0 HcmV?d00001 diff --git a/WriteTest3.m b/WriteTest3.m index f9cd6ef..ca2cbb8 100644 --- a/WriteTest3.m +++ b/WriteTest3.m @@ -1,9 +1,13 @@ -seqPath = 'D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Analysis\Baxter\'; -TrackVersion='_220105_121225'; +% Update seqpath with image location +% Leave trailing slash +seqPath = 'C:\Users\Owner\Dropbox (VU Basic Sciences)\LabConfocalOld\Duvall Lab\Isa\2021-10-11-BigProteinFollowUp\Analysis\Baxter\'; +% Update track number here from BaxterAlgorithms.m GUI +TrackVersion='_220105_121225'; FilePath=fullfile(seqPath,'Analysis',strcat('CellData',TrackVersion),'Compact'); a=dir(fullfile(FilePath,'*.mat')); b={a.name}; -HasCells=[a.bytes]; +% Rough way of gating / filtering cells by file size (bytes) +HasCells=[a.bytes]; c=~(HasCells>185); d=b; d(c) =[]; @@ -13,14 +17,14 @@ for m=1:length(d) Run=d{1,m}; Run=Run(1:end-4) - cellPath=strcat(seqPath,Run); + cellPath=strcat(seqPath,Run); % Appends Cell Path cells = LoadCells (cellPath , TrackVersion,'AreCells', true, 'Compact', true); fluorProps = {cells.regionProps}; fluorProps = cellfun(@fieldnames, fluorProps,'UniformOutput', false); fluorProps = unique(cat(1,fluorProps{:}))'; -% Plot_Fluorescence3D(cells,ax2,'Cyt','Debris',rand(1,3)); -% BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); + Plot_Fluorescence3D(cells,ax2,'Cyt','Debris',rand(1,3)); + % BronkBox=cell(length(cells),max([cells.stopT]),length(fluorProps),NumWells); for k=1:length(fluorProps); currProp=fluorProps{k}; Test='MinorAxisLength'; @@ -35,24 +39,31 @@ end end end + +% Replaces all BronkBox 'empty' data with NaN empties=cellfun('isempty',BronkBox); BronkBox(empties) = {NaN}; -Data=cell2mat(BronkBox); + +% Data holds BronkBox in a matrix +% cell2mat converts cell array to one standard array +Data=cell2mat(BronkBox); + means=mean(Data(:,:,:,:),'omitnan'); medians=median(Data(:,:,:,:),'omitnan'); stds=std(Data(:,:,:,:),'omitnan'); vars=var(Data(:,:,:,:),'omitnan'); sums=sum(Data(:,:,:,:),'omitnan'); CVs=stds./means; + figure, ax1 = axes('Position',[0.1 0.1 0.7 0.7]); -% figure, xbar=categorical(d); ybar=[]; for n=1:length(d) -% PlotWithNan3D(ax1,n*ones(size(Data(:,:,6,n))),Data(:,:,1,n),Data(:,:,6,n)); +PlotWithNan3D(ax1,n*ones(size(Data(:,:,5,n))),Data(:,:,1,n),Data(:,:,5,n)); % swarmchart(n*ones(size(sums(:,:,6,n))),sums(:,:,1,n)); -ybar=cat(2,ybar,[sums(:,:,1,n)]); + % ybar=cat(2,ybar,[sums(:,:,1,n)]); +% Plot_Fluorescence3D(cells2,ax1,'Drug','Gal',rand(1,3)); -% scatter(means(:,:,1,n),means(:,:,6,n)); + % scatter(means(:,:,1,n),means(:,:,6,n)); hold on end \ No newline at end of file From 62943aef085bd8819631a5223854630a283032a4 Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Fri, 4 Feb 2022 19:41:55 -0600 Subject: [PATCH 08/15] 2022-02-04 --- BF_Functions/Cytosol.m | 2 +- BF_Functions/Gal8.m | 4 +- .../m_Bronk_2022_01_06_for11_15_assay.m | 2 +- .../m_Bronk_2022_02_04_for2021_06_29_assay.m | 305 ++++++++++++++++++ 4 files changed, 309 insertions(+), 4 deletions(-) create mode 100644 BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m diff --git a/BF_Functions/Cytosol.m b/BF_Functions/Cytosol.m index 029f0ea..4fe5036 100644 --- a/BF_Functions/Cytosol.m +++ b/BF_Functions/Cytosol.m @@ -20,7 +20,7 @@ cyt_bw3 = bwareaopen(cyt_bw2, 2000); %%Be sure to check this threshold cyt_bw4 = imclose(cyt_bw3, CytCloseDisk); CytPos(~cyt_bw4)=0; - cyt_bw4_perim = imdilate(bwperim(cyt_bw4),strel('disk',3)); + cyt_bw4_perim = imdilate(bwperim(cyt_bw4),strel('disk',2)); CytArea = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); CytCytOverlay = imoverlay(cyt_eq, cyt_bw4_perim, [.3 1 .3]); end diff --git a/BF_Functions/Gal8.m b/BF_Functions/Gal8.m index 02ec903..6c20c3f 100644 --- a/BF_Functions/Gal8.m +++ b/BF_Functions/Gal8.m @@ -1,4 +1,4 @@ -function [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,Cyt_WS,CytPos,Gal8OutlineDisk) +function [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here Gal8=wiener2(cyt); @@ -9,7 +9,7 @@ Gal8Quant2=Gal8Open-Gal8MinValue; Gal8Quant2(Gal8Quant2<=0)=0; Gal8Quant3=bwareaopen(Gal8Quant2,4); -Gal8Quant3(~Cyt_WS)=0; +% Gal8Quant3(~Cyt_WS)=0; Gal8Quant3(~CytPos)=0; Gal8Quant3=imdilate(Gal8Quant3,Gal8DilateDisk); Gal8Quant4=imdilate(Gal8Quant3,Gal8OutlineDisk); diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m index 01c6b22..de2fb00 100644 --- a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m +++ b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m @@ -175,7 +175,7 @@ BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); mkdir(BaxSegFolderCell); - for i=0:T_Value + for i=4 % T_Value = reader.getSizeT(); Timepoint = num2str(i,'%03.f'); diff --git a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m new file mode 100644 index 0000000..3a6835c --- /dev/null +++ b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m @@ -0,0 +1,305 @@ +%% Gal8 Recruitment MATLAB Program + +% Written by Brock Fletcher in the Biomedical Engineering Department at +% Vanderbilt University 2017 - 2022 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/). +%Adapted from work by Kameron V Kilchrist, 2015 - 2018 in the course of his PhD studies +% advised by Craig Duvall (https://my.vanderbilt.edu/duvall/), published in +% Kilchrist, Dimobi, ..., Duvall; "Gal8 +% Visualization of Endosome Disruption Predicts Carrier-mediated Biologic +% Drug Intracellular Bioavailability". +%hello world + +% University Email: brock.fletcher@vanderbilt.edu +% Permanent Email: brockfletch@gmail.com + +% This code may be reused at will for non-commercial purposes. +% Licensed under a Creative Commons Attribution 4.0 International License. + +% Derivative code should be published at GitHub or FigShare. Derivative +% scientific works should cite _______________ +%% Usage Guide (TL/DR): + %Steps + %Export your fluorescent microscopy as multipage TIFs + %Grab a few example TIFs to test your parameters and put them + %into a folder. (..\Test) + %Create a Second Folder to output to (..\TestExports) + + %Copy the file paths from file explorer and paste them into the + %"workingdir" and "exportdir" + + %Enter your "Calibration" value + %Enter what programs to run on each Channel ("C1=[]") + %Set your thresholds to a starting value + %Run Program + %Check output Images and Excel File + %Change Threshold Values and Re-Run until results are good enough + %If good analysis cannot be reached, edit advanced Values + %If still not good enough, edit actual bulk of code + %Once ready, change "workingdir" to a folder containing all images + %to be analyzed, and "exportdir" to a new, empty folder + + %Run Program and wait. If too hard on your CPU, change "parfor" to + %"for" + + %Review output images and analyze Data. + %Reccomended Analysis Steps: + %Label Each row of Data using VLOOKUP in Excel. + %Explore Data using JMP's Graphbuilder. + %Graph Data in Prism. +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen003.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04'; +% filetype='tif'; +% listing=dir(strcat(workingdir,'*.TIF')); +% ds=imageDatastore(workingdir); +%% Directory Code +readeromeMeta=reader.getMetadataStore(); +destdirectory1 = fullfile(exportdir,'Overlaid'); +BaxtDirectory= fullfile(exportdir,'Baxter'); +exportbaseBAXTSegNuc=fullfile(BaxtDirectory,'Analysis','Segmentation_Nuc'); +exportbaseBAXTSegCell=fullfile(BaxtDirectory,'Analysis','Segmentation_Cell'); +mkdir(destdirectory1); %create the directory +mkdir(BaxtDirectory); +mkdir(exportbaseBAXTSegNuc); +mkdir(exportbaseBAXTSegCell); +%% +% This will measure the total Gal8 recruited to puncta and count cell +% nuclei or cytosol in each frame. + +% This code assumes you have exported images as multipage TIF files, with +% any of the following stains in each channel: + % nuclear Stain + % Difuse Cytosolic Stain + % Punctate Cytosolic Stain + % Labeled Drug or other exogenous molecule (Cas9, siRNA) + +% Images were exported to 2 page TIF images using Nikon NIS Elements. If +% you use alternate file formats or use separate export files for each +% channel, please edit the code as appropriate. + +% You *must* edit the workingdir and exportdir variables for this code to +% work. +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); +%% Image Thresholding EDIT HERE BASIC +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + +%Input Planes + ImagePlanes=[1,3]; + ImageAnalyses={{'Bax' 'green' 'cytgal'},{},{'Bax' 'red' 'drug'}}; + MakeOverlayImage=1; +%Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables +bitConvert=(2^16/2^bitdepthin); +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + % export file names and in the DataCells array. Note: it is a character + % array / string! +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +NumSeries=reader.getSeriesCount(); +NumColors=reader.getEffectiveSizeC(); +NumTimepoint=(reader.getImageCount())/NumColors; +NumImg=NumSeries*NumTimepoint*NumColors; + +C = cell(NumImg,length(Categories)); +%% Analysis Program +%j=0:NumSeries-1% +for j=4% Number of images in ND2 File + %% Import TIFs + % %The next few lines are specific to 2 page TIF images. Edit from here + % if you have alternate arrangements. +% currfile=strcat(workingdir,listing(j,1).name); + CurrSeries=j; + reader.setSeries(CurrSeries); + fname = reader.getSeries; + Well=num2str(fname,'%05.f'); + + BaxWellFolder=fullfile(BaxtDirectory,Well); + mkdir(BaxWellFolder); + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); + T_Value = reader.getSizeT()-1; + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); + mkdir(BaxSegFolderNuc); + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); + mkdir(BaxSegFolderCell); + + for i=1:T_Value + +% T_Value = reader.getSizeT(); + Timepoint = num2str(i,'%03.f'); + iplane=reader.getIndex(0,0,i); + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); + Img=[]; + %overlaid Image + BaxterName=strcat('w',Well,'t',Timepoint) ; + exportbase=strcat(destdirectory1,'\',run,'_',BaxterName); + fulldestination = strcat(exportbase,'.png'); + ImageName=fullfile(BaxWellFolder,BaxterName); + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); + + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + RGBExportImage=imoverlay(RGBExportImage,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); +% +% + imshow(RGBExportImage) + end + %% Test + + %All Data Images + +% WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); +% ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement +% areacell=bwarea(Nuc_bw4(:)); +% CellSum=sum(Nuc(Nuc_bw4)); +% areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + % Write Images to File +% name file relative to that directory +% imwrite(ExportImage, fulldestination); %save the file there directory +% +% BaxterImages + + + +% imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); +% imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); +% +% +% SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); +% imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); +% +% +% SegNameCell=fullfile(BaxSegFolderCell,BaxterName); +% imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); +% % + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file From 877f1fe966c1d63565a39116b92fd76d63859f14 Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:26:10 -0600 Subject: [PATCH 09/15] Fixed to actually run --- .../m_Bronk_2022_01_06_for11_15_assay.m | 2 +- .../m_Bronk_2022_02_04_for2021_06_29_assay.m | 58 +++++++++++++------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m index de2fb00..f2c7b99 100644 --- a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m +++ b/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m @@ -175,7 +175,7 @@ BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); mkdir(BaxSegFolderCell); - for i=4 + for i=1:T_Value % T_Value = reader.getSizeT(); Timepoint = num2str(i,'%03.f'); diff --git a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m index 3a6835c..20bf048 100644 --- a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m +++ b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m @@ -49,8 +49,9 @@ %Graph Data in Prism. %% Image Folder Location clc, clear all, close all -reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen003.nd2'); -exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04'; +string() +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; % filetype='tif'; % listing=dir(strcat(workingdir,'*.TIF')); % ds=imageDatastore(workingdir); @@ -127,9 +128,14 @@ bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 %Input Planes - ImagePlanes=[1,3]; - ImageAnalyses={{'Bax' 'green' 'cytgal'},{},{'Bax' 'red' 'drug'}}; - MakeOverlayImage=1; + ImagePlanes=[1,2,3]; %Which image Planes to analyze + ImageAnalyses={{'Bax'},{},{'Bax'}}; %Which Image analysis/functions to call. NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=1;%Logical Yes or no to make overlay image + % Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % Add selection for data of interest from each analysis + % %Nuclear Stain NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start NucLow=100;% @@ -146,6 +152,7 @@ run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in % export file names and in the DataCells array. Note: it is a character % array / string! + Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; NumSeries=reader.getSeriesCount(); NumColors=reader.getEffectiveSizeC(); @@ -155,7 +162,8 @@ C = cell(NumImg,length(Categories)); %% Analysis Program %j=0:NumSeries-1% -for j=4% Number of images in ND2 File + +for j=0:NumSeries-1% Number of images in ND2 File %% Import TIFs % %The next few lines are specific to 2 page TIF images. Edit from here % if you have alternate arrangements. @@ -176,9 +184,9 @@ BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); mkdir(BaxSegFolderCell); - - for i=1:T_Value - + + for i=0:T_Value + % T_Value = reader.getSizeT(); Timepoint = num2str(i,'%03.f'); iplane=reader.getIndex(0,0,i); @@ -194,10 +202,11 @@ Img= bitConvert*bfGetPlane(reader,iplane+n); CurrPlane=ImageAnalyses{n}; + %Primary Analyses if any(contains(CurrPlane,'Bax')) my_field = strcat('c',num2str(n,'%02.f')); imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); - + end if any(contains(CurrPlane,'nuc')) [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); @@ -206,17 +215,25 @@ if any(contains(CurrPlane,'cyt')) [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); - end - - if any(contains(CurrPlane,'cytgal')) - [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); - [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); - - end + end if any(contains(CurrPlane,'drug')) [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end if any(contains(CurrPlane,'blue')) blue=imadjust(Img); @@ -249,7 +266,8 @@ if exist('cyt_bw4_perim','var') RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); end - RGBExportImage=imoverlay(RGBExportImage,Gal8Quant5,'m'); +% UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH COLOR +% RGBExportImage=imoverlay(RGBExportImage,Gal8Quant5,'m'); % ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); % ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); % @@ -302,4 +320,6 @@ % % D=[Categories;C]; % WritingHere=strcat(exportdir,'\','Gal8','_',run); -% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data \ No newline at end of file +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file From 712d2e69a513d655ad9726cdd57e681ba1d06a8e Mon Sep 17 00:00:00 2001 From: Sarah Reilly <93159450+sarahreilly@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:31:48 -0600 Subject: [PATCH 10/15] Slightly debugged version of main analysis code and unfinished GUI --- BF_Functions/BronkOpeningWindow.mlapp | Bin 0 -> 104699 bytes .../m_Bronk_2022_02_07_for2021_06_29_assay.m | 309 ++++++++++++++++++ 2 files changed, 309 insertions(+) create mode 100644 BF_Functions/BronkOpeningWindow.mlapp create mode 100644 BF_Functions/m_Bronk_2022_02_07_for2021_06_29_assay.m diff --git a/BF_Functions/BronkOpeningWindow.mlapp b/BF_Functions/BronkOpeningWindow.mlapp new file mode 100644 index 0000000000000000000000000000000000000000..abd8f71367d0cdfcd87782f7f0582096d7adf8c6 GIT binary patch literal 104699 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�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
$2$h3ID%* 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 Date: Tue, 8 Feb 2022 23:07:42 -0600 Subject: [PATCH 11/15] Major Improvements based on DataScientists Conversation Made some major formatting changes! the places marked with "##" (just ctrl+F for ##) are notes on things that make good specific things to be working on, particularlyy for michale Also added feature to automatically save the exacdt file that was run everytime we run teh code. This should help with record keeping and everythnig a ton. --- ...022_02_08_Commented_byBF_forMichaelSarah.m | 308 ++++++++++++++++++ .../m_Bronk_2022_02_04_for2021_06_29_assay.m | 2 +- 2 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m diff --git a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m new file mode 100644 index 0000000..5138bb5 --- /dev/null +++ b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m @@ -0,0 +1,308 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +A = exist(newbackup,'file'); +if (A~=0) +warning('Backup already exists for the current version') +end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end +% ##UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH COLOR +% RGBExportImage=imoverlay(RGBExportImage,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); +% +% + imshow(RGBExportImage) + end + %% Test + + %All Data Images + +% WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); +% ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); +% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); +% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); + % figure; imshow(ExportImage); + % + + %% Measure Image Data + + % measurement +% areacell=bwarea(Nuc_bw4(:)); +% CellSum=sum(Nuc(Nuc_bw4)); +% areaGal8=sum((vertcat(Puncta.Area))); + % + % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; + % Write Images to File +% name file relative to that directory +% imwrite(ExportImage, fulldestination); %save the file there directory +% +% BaxterImages + + + +% imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); +% imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); +% +% +% SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); +% imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); +% +% +% SegNameCell=fullfile(BaxSegFolderCell,BaxterName); +% imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); +% % + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m index 20bf048..2dc0757 100644 --- a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m +++ b/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m @@ -128,7 +128,7 @@ bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 %Input Planes - ImagePlanes=[1,2,3]; %Which image Planes to analyze + ImagePlanes=[1,2,3]; %Which image Planes to analyze #Integrate with ImageAnalyses={{'Bax'},{},{'Bax'}}; %Which Image analysis/functions to call. NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol MakeOverlayImage=1;%Logical Yes or no to make overlay image % Add selection for what to overlay on the overlay image, for example, From ee33907297617a7767de32c416428a1b9409c759 Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Tue, 8 Feb 2022 23:19:22 -0600 Subject: [PATCH 12/15] Gal8 Simplification Simplified Gal8 Inputs and Outputs --- BF_Functions/Gal8.m | 17 +++++++++++------ ..._2022_02_08_Commented_byBF_forMichaelSarah.m | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/BF_Functions/Gal8.m b/BF_Functions/Gal8.m index 6c20c3f..3584c1d 100644 --- a/BF_Functions/Gal8.m +++ b/BF_Functions/Gal8.m @@ -1,11 +1,16 @@ -function [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(cyt,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk) +function [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here -Gal8=wiener2(cyt); +Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + +Gal8=wiener2(Img); Gal8TH=imtophat(Gal8,Gal8TophatDisk); Gal8Open=imopen(Gal8TH,Gal8OpenDisk); -Gal8MinValue= Gal8MinThreshold*intmax(class(cyt)); +Gal8MinValue= Gal8MinThreshold*intmax(class(Img)); Gal8Quant2=Gal8Open-Gal8MinValue; Gal8Quant2(Gal8Quant2<=0)=0; Gal8Quant3=bwareaopen(Gal8Quant2,4); @@ -14,11 +19,11 @@ Gal8Quant3=imdilate(Gal8Quant3,Gal8DilateDisk); Gal8Quant4=imdilate(Gal8Quant3,Gal8OutlineDisk); Gal8Quant5=imbinarize(Gal8Quant4-Gal8Quant3); -GalPals=cyt; +GalPals=Img; GalPals(~Gal8Quant3)=0; -Puncta=regionprops(Gal8Quant3,cyt,'Area','Centroid','MeanIntensity'); -Ring=regionprops(Gal8Quant5,cyt,'Area','Centroid','MeanIntensity'); %need to figure out way to subtract out surrounding brightness for each individual Point +Puncta=regionprops(Gal8Quant3,Img,'Area','Centroid','MeanIntensity'); +Ring=regionprops(Gal8Quant5,Img,'Area','Centroid','MeanIntensity'); %need to figure out way to subtract out surrounding brightness for each individual Point RingMeanInt=2; %need to figure out way to subtract out surrounding brightness for each individual Point Gal8Signal=sum((vertcat(Puncta.MeanIntensity).*vertcat(Puncta.Area))); % Gal8Signal=Gal8Signal'; diff --git a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m index 5138bb5..cbc4422 100644 --- a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m +++ b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m @@ -102,7 +102,7 @@ bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. %Input Planes ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI - ImageAnalyses={{},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI % ##Add selection for what to overlay on the overlay image, for example, % showing the cytosol perimeter analysis or Not @@ -207,7 +207,7 @@ %Secondary Analyses if any(contains(CurrPlane,'cytgal')) [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); - [GalPals,Gal8Signal,RingMeanInt,Gal8Quant5,Gal8Quant4,Gal8Quant3,Gal8Open,Gal8TH,Gal8Quant2,Puncta,Ring] = Gal8(Img,Gal8TophatDisk,Gal8OpenDisk,Gal8DilateDisk,Gal8MinThreshold,CytPos,Gal8OutlineDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); end if any(contains(CurrPlane,'nucWS')) From cf084753033c0fae5c2da5aaf1f0e9d40089429b Mon Sep 17 00:00:00 2001 From: BrockFletcher <88505907+BrockFletcher@users.noreply.github.com> Date: Wed, 9 Feb 2022 15:56:37 -0600 Subject: [PATCH 13/15] Working Towards Universalization --- BF_Functions/CytDrug.m | 25 ++ BF_Functions/Drug.m | 12 + .../RunLogbackup_2022-02-09-02-21-07.m | 283 ++++++++++++++++++ .../RunLogbackup_2022-02-09-02-21-10.m | 283 ++++++++++++++++++ BF_Functions/{ => Old Files}/m_2021_12_30.m | 0 .../{ => Old Files}/m_Bronk_2022_01_05.m | 0 .../m_Bronk_2022_01_05_bigChanges.m | 0 .../m_Bronk_2022_01_06_for11_15_assay.m | 0 .../m_Bronk_2022_02_04_for2021_06_29_assay.m | 0 .../m_Bronk_2022_02_07_for2021_06_29_assay.m | 0 .../RunLog/backup_2022-02-09-02-23-12.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-23-14.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-23-19.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-25-04.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-25-31.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-26-32.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-26-43.m | 283 ++++++++++++++++++ .../RunLog/backup_2022-02-09-02-27-51.m | 283 ++++++++++++++++++ ...onEval2ef0f50d.m2022-02-09-02-24-29backup_ | 283 ++++++++++++++++++ ...022_02_08_Commented_byBF_forMichaelSarah.m | 281 +++++++++++++++++ ...022_02_08_Commented_byBF_forMichaelSarah.m | 121 +++----- ...022_02_08_Commented_byBF_forMichaelSarah.m | 281 +++++++++++++++++ 22 files changed, 3760 insertions(+), 73 deletions(-) create mode 100644 BF_Functions/CytDrug.m create mode 100644 BF_Functions/Drug.m create mode 100644 BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-07.m create mode 100644 BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-10.m rename BF_Functions/{ => Old Files}/m_2021_12_30.m (100%) rename BF_Functions/{ => Old Files}/m_Bronk_2022_01_05.m (100%) rename BF_Functions/{ => Old Files}/m_Bronk_2022_01_05_bigChanges.m (100%) rename BF_Functions/{ => Old Files}/m_Bronk_2022_01_06_for11_15_assay.m (100%) rename BF_Functions/{ => Old Files}/m_Bronk_2022_02_04_for2021_06_29_assay.m (100%) rename BF_Functions/{ => Old Files}/m_Bronk_2022_02_07_for2021_06_29_assay.m (100%) create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-23-12.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-23-14.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-23-19.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-25-04.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-25-31.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-26-32.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-26-43.m create mode 100644 BF_Functions/RunLog/backup_2022-02-09-02-27-51.m create mode 100644 BF_Functions/RunLog/backup_LiveEditorEvaluationHelperESectionEval2ef0f50d.m2022-02-09-02-24-29backup_ create mode 100644 BF_Functions/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m create mode 100644 BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m diff --git a/BF_Functions/CytDrug.m b/BF_Functions/CytDrug.m new file mode 100644 index 0000000..e97bc53 --- /dev/null +++ b/BF_Functions/CytDrug.m @@ -0,0 +1,25 @@ + %%Drugmine Code + +function [DrugBright,areaDrug, Drugsum, DrugAvgInCell, DrugAvgOutCell,Drug_eq,DrugMask] = Drug(Img, Drug_threshold, cyt_bw4) + + Drug_eq =imadjust(Img,[0 0.4],[]); + + Drug_threshold = Drug_threshold *intmax(class(drug)); + + Drugweiner=wiener2(Img); + RhodMask=Drugweiner>Drug_threshold; + areaDrug = sum(RhodMask,'all'); + if + Drug_in_cell = drug(cyt_bw4); + Drug_out_cell = drug(cyt_bw4 == 0); + + cell_area = sum(sum(cyt_bw4)); + not_cell_area = size(cyt_bw4,1) * size(cyt_bw4, 2) - cell_area; + + Rhodsum = sum(rhod_eq(RhodMask)); + RhodBright=drug; + RhodBright(~RhodMask)=0; + DrugvgInCell = sum(Drug_in_cell) / cell_area; + DrugvgOutCell = sum(Drug_out_cell) / not_cell_area; + + \ No newline at end of file diff --git a/BF_Functions/Drug.m b/BF_Functions/Drug.m new file mode 100644 index 0000000..ff3cf5d --- /dev/null +++ b/BF_Functions/Drug.m @@ -0,0 +1,12 @@ + %%BasicThresh Code + +function [DrugBright,areaDrug, Drugsum, DrugMask] = Drug(Img, Drug_threshold) + + Drug_threshold = Drug_threshold *intmax(class(drug)); + DrugMask=Img>Drug_threshold; + areaDrug = sum(DrugMask,'all'); + Drugsum = sum(Img(DrugMask)); + DrugBright(~DrugMask)=0; + + + \ No newline at end of file diff --git a/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-07.m b/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-07.m new file mode 100644 index 0000000..086eada --- /dev/null +++ b/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-07.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-10.m b/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-10.m new file mode 100644 index 0000000..086eada --- /dev/null +++ b/BF_Functions/Old Files/RunLogbackup_2022-02-09-02-21-10.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/m_2021_12_30.m b/BF_Functions/Old Files/m_2021_12_30.m similarity index 100% rename from BF_Functions/m_2021_12_30.m rename to BF_Functions/Old Files/m_2021_12_30.m diff --git a/BF_Functions/m_Bronk_2022_01_05.m b/BF_Functions/Old Files/m_Bronk_2022_01_05.m similarity index 100% rename from BF_Functions/m_Bronk_2022_01_05.m rename to BF_Functions/Old Files/m_Bronk_2022_01_05.m diff --git a/BF_Functions/m_Bronk_2022_01_05_bigChanges.m b/BF_Functions/Old Files/m_Bronk_2022_01_05_bigChanges.m similarity index 100% rename from BF_Functions/m_Bronk_2022_01_05_bigChanges.m rename to BF_Functions/Old Files/m_Bronk_2022_01_05_bigChanges.m diff --git a/BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m b/BF_Functions/Old Files/m_Bronk_2022_01_06_for11_15_assay.m similarity index 100% rename from BF_Functions/m_Bronk_2022_01_06_for11_15_assay.m rename to BF_Functions/Old Files/m_Bronk_2022_01_06_for11_15_assay.m diff --git a/BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m b/BF_Functions/Old Files/m_Bronk_2022_02_04_for2021_06_29_assay.m similarity index 100% rename from BF_Functions/m_Bronk_2022_02_04_for2021_06_29_assay.m rename to BF_Functions/Old Files/m_Bronk_2022_02_04_for2021_06_29_assay.m diff --git a/BF_Functions/m_Bronk_2022_02_07_for2021_06_29_assay.m b/BF_Functions/Old Files/m_Bronk_2022_02_07_for2021_06_29_assay.m similarity index 100% rename from BF_Functions/m_Bronk_2022_02_07_for2021_06_29_assay.m rename to BF_Functions/Old Files/m_Bronk_2022_02_07_for2021_06_29_assay.m diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-23-12.m b/BF_Functions/RunLog/backup_2022-02-09-02-23-12.m new file mode 100644 index 0000000..61fb464 --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-23-12.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-23-14.m b/BF_Functions/RunLog/backup_2022-02-09-02-23-14.m new file mode 100644 index 0000000..61fb464 --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-23-14.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-23-19.m b/BF_Functions/RunLog/backup_2022-02-09-02-23-19.m new file mode 100644 index 0000000..61fb464 --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-23-19.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-25-04.m b/BF_Functions/RunLog/backup_2022-02-09-02-25-04.m new file mode 100644 index 0000000..52e549a --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-25-04.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')] +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-25-31.m b/BF_Functions/RunLog/backup_2022-02-09-02-25-31.m new file mode 100644 index 0000000..52e549a --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-25-31.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')] +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-26-32.m b/BF_Functions/RunLog/backup_2022-02-09-02-26-32.m new file mode 100644 index 0000000..52e549a --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-26-32.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')] +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-26-43.m b/BF_Functions/RunLog/backup_2022-02-09-02-26-43.m new file mode 100644 index 0000000..52e549a --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-26-43.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')] +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_2022-02-09-02-27-51.m b/BF_Functions/RunLog/backup_2022-02-09-02-27-51.m new file mode 100644 index 0000000..52e549a --- /dev/null +++ b/BF_Functions/RunLog/backup_2022-02-09-02-27-51.m @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')] +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/backup_LiveEditorEvaluationHelperESectionEval2ef0f50d.m2022-02-09-02-24-29backup_ b/BF_Functions/RunLog/backup_LiveEditorEvaluationHelperESectionEval2ef0f50d.m2022-02-09-02-24-29backup_ new file mode 100644 index 0000000..93dc60f --- /dev/null +++ b/BF_Functions/RunLog/backup_LiveEditorEvaluationHelperESectionEval2ef0f50d.m2022-02-09-02-24-29backup_ @@ -0,0 +1,283 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,mfilename,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m b/BF_Functions/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m new file mode 100644 index 0000000..045a8c9 --- /dev/null +++ b/BF_Functions/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m @@ -0,0 +1,281 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +RunLog=fullfile(pwd,'RunLog'); +mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,RunLog); +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file diff --git a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m index cbc4422..b574c8a 100644 --- a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m +++ b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah.m @@ -38,12 +38,17 @@ LogFile=strcat(LogDirectory,'\'); FileNameAndLocation=[mfilename('fullpath')]; newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +Gitdir=fullfile(pwd,'RunLog\'); +GitLog=sprintf('%sbackup_%s.m',Gitdir,Version); +% GitLog=sprintf('%sbackup_%s.m',LogFolder,Version); +% mkdir(RunLog); currentfile=strcat(FileNameAndLocation, '.m'); copyfile(currentfile,newbackup); -A = exist(newbackup,'file'); -if (A~=0) -warning('Backup already exists for the current version') -end +copyfile(currentfile,GitLog) +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end %##This may not be the best way to be logging the data and directory, since %it's in a new folder every time, but we can figure htis otu later. Also %might be possible to write this all into a function @@ -53,23 +58,23 @@ % For conveience, a number of sizes of disk shaped structural elements are % generated for data exploration. %## Can probably delete this section after checking on all of the functions -sr1=strel('square',1); -se1=strel('disk',1); -sr2=strel('square',2); -se2=strel('disk',2); -se3=strel('disk',3); -sr3=strel('square',3); -se4=strel('disk',4); -se5=strel('disk',5); -se6=strel('disk',6); -se7=strel('disk',7); -se8=strel('disk',8); -se9=strel('disk',9); -se10=strel('disk',10); -se12=strel('disk',12); -se20=strel('disk',20); -se25=strel('disk',25); -se100=strel('disk',100); +% sr1=strel('square',1); +% se1=strel('disk',1); +% sr2=strel('square',2); +% se2=strel('disk',2); +% se3=strel('disk',3); +% sr3=strel('square',3); +% se4=strel('disk',4); +% se5=strel('disk',5); +% se6=strel('disk',6); +% se7=strel('disk',7); +% se8=strel('disk',8); +% se9=strel('disk',9); +% se10=strel('disk',10); +% se12=strel('disk',12); +% se20=strel('disk',20); +% se25=strel('disk',25); +% se100=strel('disk',100); %% Sizing/Resolution Parameters EDIT HERE ADVANCED %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size @@ -123,12 +128,12 @@ CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. %Gal8 Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start - %Rhodamine - Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold -% Rhoda_threshold_Big = 100; + %Drugamine + Drug_threshold = 0.01; %Number 0-1, removes Drugmine signal dimmer than threshold +% Drug_threshold_Big = 100; %% Analysis Variables -Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaDrug'},{'Drugsum'},{'DrugAvgInCell'},{'DrugAvgOutCell'}]; %##Categories are manually typed out here, but it should integrate so that %these are auto-populated or selectable within the GUI, might have to get %clever for this to work @@ -201,7 +206,7 @@ end if any(contains(CurrPlane,'drug')) - [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + [DrugBright,areaDrug, Drugsum, DrugAvgInCell, DrugAvgOutCell,Drug_eq,DrugMask] = Drug(Img, Drug_threshold, cyt_bw4); end %Secondary Analyses @@ -216,9 +221,11 @@ if any(contains(CurrPlane,'cytWS')) [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); - end - - if any(contains(CurrPlane,'blue')) + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) blue=imadjust(Img); % else % blue=zeros(size(Img),'like',Img); @@ -235,6 +242,12 @@ end end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + if logical(MakeOverlayImage) if ~exist('blue','var') blue=zeros(size(Img),'like',Img); @@ -249,52 +262,14 @@ if exist('cyt_bw4_perim','var') RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); end -% ##UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH COLOR -% RGBExportImage=imoverlay(RGBExportImage,Gal8Quant5,'m'); -% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); -% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); -% -% - imshow(RGBExportImage) + imshow(RGBExportImage) end - %% Test - - %All Data Images - -% WSArea = imoverlay(RGBExportImage, Cyt_WS_perim,[0.8500 0.3250 0.0980]); -% ExportImage=imoverlay(WSArea,Gal8Quant5,'m'); -% ExportImage=imoverlay(ExportImage,Nuc_bw4_perim, [0.3010 0.7450 0.9330]); -% ExportImage=imoverlay(ExportImage,rhodPerim, 'y'); - % figure; imshow(ExportImage); - % - %% Measure Image Data - - % measurement -% areacell=bwarea(Nuc_bw4(:)); -% CellSum=sum(Nuc(Nuc_bw4)); -% areaGal8=sum((vertcat(Puncta.Area))); - % - % C(j,:)=[{run},{WellTime},{areacell},{CellSum},{areaGal8},{Gal8Signal},{areaRhod},{Rhodsum},{RhodAvgInCell},{RhodAvgOutCell}]; - % Write Images to File -% name file relative to that directory -% imwrite(ExportImage, fulldestination); %save the file there directory -% -% BaxterImages - - - -% imwrite(drug, strcat(ImageName,'c04','.tif'),'tif'); -% imwrite(RhodBright, strcat(ImageName,'c05','.tif'),'tif'); -% -% -% SegNameNuc=fullfile(BaxSegFolderNuc,BaxterName); -% imwrite(NucLabel, strcat(SegNameNuc,'c01','.tif'),'tif'); -% -% -% SegNameCell=fullfile(BaxSegFolderCell,BaxterName); -% imwrite(Cyt_WS, strcat(SegNameCell,'c01','.tif'),'tif'); -% % + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes end diff --git a/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m new file mode 100644 index 0000000..ea10e3a --- /dev/null +++ b/BF_Functions/m_2022_02_08_Commented_byBF_forMichaelSarah/RunLog/m_2022_02_08_Commented_byBF_forMichaelSarah.m @@ -0,0 +1,281 @@ +%% Gal8 Recruitment MATLAB Program +%% Image Folder Location +clc, clear all, close all +reader = bfGetReader('D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\PolyScreen004.nd2'); +exportdir='D:\Dropbox (VU Basic Sciences)\Duvall Confocal\Duvall Lab\Brock Fletcher\2021-06-29-PolymerScreen\2022_02_04_SarahHelp'; + +%% Directory Code + +run=char(datetime(clock),"yyyy-MM-dd-hh-mm-ss"); % The Run number is used to track multiple runs of the software, and is used in + +readeromeMeta=reader.getMetadataStore(); +RunDirectory= fullfile(exportdir,run); +mkdir(RunDirectory); + +destdirectory1 = fullfile(RunDirectory,'Overlaid'); +mkdir(destdirectory1); + +BaxtDirectory = fullfile(RunDirectory,'Baxter'); +mkdir(BaxtDirectory); + +LogDirectory = fullfile(RunDirectory,'Log'); +mkdir(LogDirectory); + +SegDirectory = fullfile(RunDirectory,'Segmentation'); +mkdir(SegDirectory); + +exportbaseBAXTSegNuc=fullfile(SegDirectory,'Segmentation_Nuc'); +mkdir(exportbaseBAXTSegNuc); + +exportbaseBAXTSegCell=fullfile(SegDirectory,'Segmentation_Cell'); +mkdir(exportbaseBAXTSegCell); + %##Need to universalize the Segmentation stuff for whatever the + %GUI needs, so that it can be arbitrarily named and assigned. + %Might be a good idea to write this all into a function + +%%Log Data +Version=run; +LogFile=strcat(LogDirectory,'\'); +FileNameAndLocation=[mfilename('fullpath')]; +newbackup=sprintf('%sbackup_%s.m',LogFile,Version); +RunLog=fullfile(FileNameAndLocation,'RunLog'); +mkdir(RunLog); +currentfile=strcat(FileNameAndLocation, '.m'); +copyfile(currentfile,newbackup); +copyfile(currentfile,RunLog); +% A = exist(newbackup,'file'); +% if (A~=0) +% warning('Backup already exists for the current version') +% end +%##This may not be the best way to be logging the data and directory, since +%it's in a new folder every time, but we can figure htis otu later. Also +%might be possible to write this all into a function + + +%% Structuring Elements +% For conveience, a number of sizes of disk shaped structural elements are +% generated for data exploration. +%## Can probably delete this section after checking on all of the functions +sr1=strel('square',1); +se1=strel('disk',1); +sr2=strel('square',2); +se2=strel('disk',2); +se3=strel('disk',3); +sr3=strel('square',3); +se4=strel('disk',4); +se5=strel('disk',5); +se6=strel('disk',6); +se7=strel('disk',7); +se8=strel('disk',8); +se9=strel('disk',9); +se10=strel('disk',10); +se12=strel('disk',12); +se20=strel('disk',20); +se25=strel('disk',25); +se100=strel('disk',100); +%% Sizing/Resolution Parameters EDIT HERE ADVANCED + + %NEED TO ADD microns per Pixel %NEED TO ADD Cell size (Small, Medium, Large)%Go through this and make all disks calculated on the microns per pixel and %the Cell Size + +MiPerPix=0.34; +CellSize=1; %Scale as needed for different Cells + %Disks + NucTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); + NucOpenDisk= strel('disk',round(5*(0.34/MiPerPix))); + NucErodeDisk=strel('disk',round(6*(0.34/MiPerPix))); + NucCloseDisk=strel('disk',round(4*(0.34/MiPerPix))); + + CytTophatDisk=strel('disk',round(250*(0.34/MiPerPix))); % EditHere + CytOpenDisk =strel('disk',round(5*(0.34/MiPerPix))); + CytErodeDisk=strel('disk',round(5*(0.34/MiPerPix))); + CytCloseDisk=strel('disk',round(5*(0.34/MiPerPix))); + + Gal8TophatDisk=strel('disk',round(6*(0.34/MiPerPix)));% EditHere + Gal8OpenDisk =strel('square',round(2*(0.34/MiPerPix))); + Gal8DilateDisk=strel('disk',round(1*(0.34/MiPerPix))); + Gal8OutlineDisk=strel('disk',round(2*(0.34/MiPerPix))); + + %##Probabloy possible and better to integrate all of this into + %a single function for the "round" section and then have ll of + %the indivual disks just created in each function based on the + %relative pixel size with a cell size correction +%% Analysis Functions +%Bit Depth + bitdepthin= 12; %Bit depth of original image, usually 8, 12, or 16 + bitConvert=(2^16/2^bitdepthin); %This assures that whatever the bit depth of the input image, the analyzed images are all 16 bit. +%Input Planes + ImagePlanes=[1,2,3]; %Which image Planes to analyze ##Integrate with GUI + ImageAnalyses={{'cytgal'},{},{}}; %Which Image analysis/functions to call. ##NEed to solve problem of secondary analyses like watershed of Nuc and Cytosol or gal8 and cytosol + MakeOverlayImage=0;%Logical Yes or no to make overlay image #Integrate with GUI + % ##Add selection for what to overlay on the overlay image, for example, + % showing the cytosol perimeter analysis or Not + + % ##Add selection for data of interest from each analysis, i.e. what to + % export from each function + % + +%% Image Thresholding EDIT HERE BASIC + %##Need to make these into GUI, and make universal so that as we call + %each function we can set the function parameters in the GUI. I believe + %Baxter has a very good solution for doing this + %Nuclear Stain + NucMax=0.8;%Number 0-1, removes Cell Debris brighter than this value in order to allow low end to remain visible. 0.2 is usually a good start + NucLow=100;% + %Cytosol + CytMax= 0.5; %Number 0-1, removes Cell Debris brighter than this value. 0.2 is usually a good start + CytLow=0; %Choose number 0-20, start at 0. Higher numbers remove more dim cells and background. + %Gal8 + Gal8MinThreshold=0.2;%Number 0-1, removes Puncta Dimmer than this value. 0.05 is usually a good start + %Rhodamine + Rhoda_threshold = 0.01; %Number 0-1, removes rhodamine signal dimmer than threshold +% Rhoda_threshold_Big = 100; +%% Analysis Variables + +Categories=[{'run'},{'well'},{'areacell'},{'CellSum'},{'areaGal8'},{'galsum'},{'areaRhod'},{'Rhodsum'},{'RhodAvgInCell'},{'RhodAvgOutCell'}]; +%##Categories are manually typed out here, but it should integrate so that +%these are auto-populated or selectable within the GUI, might have to get +%clever for this to work + +NumSeries=reader.getSeriesCount(); %The number of different wells you imaged +NumColors=reader.getEffectiveSizeC(); %The number of colors of each well you imaged +NumTimepoint=(reader.getImageCount())/NumColors; %The number of timepoints you imaged +NumImg=NumSeries*NumTimepoint*NumColors; %The total number of images, combining everything + +C = cell(NumImg,length(Categories)); +%##C is something that will probably have be edited to allow data output +%from this scale of the analysis. Don't even know if it's correct right now +%or even neccessary at all +%% Analysis Program +for j=0:NumSeries-1% Number of wells in ND2 File + % Set Current Well and other important values + %##Would be very useful to figure out how to make this work as a parfor + %loop, but might be quite difficult + CurrSeries=j; %The current well that we're looking at + reader.setSeries(CurrSeries); %##uses BioFormats function, can be swapped with something else (i forget what) if it's buggy with the GUI + fname = reader.getSeries; %gets the name of the series using BioFormats + Well=num2str(fname,'%05.f'); %Formats the well name for up to 5 decimal places of different wells, could increase but 5 already feels like overkill + PositionX = readeromeMeta.getPlanePositionX(CurrSeries,1).value(); %May be useful someday, but not needed here + PositionY = readeromeMeta.getPlanePositionY(CurrSeries,1).value(); %May be useful someday, but not needed yet. Get's the position of the actual image. Useful for checking stuff + T_Value = reader.getSizeT()-1; %Very important, the timepoints of the images. Returns the total number of timepoints, the -1 is important. + + %CreateFolders for Baxter to read data + %##Important work: generalize this folder creation and put into GUI, so + %that whatever segmentations the user creates can be saved for baxter + %analysis. The "BaxSegFolderCell" is probably the most important and + %default, but this should be customizable + + BaxWellFolder=fullfile(BaxtDirectory,Well); %Creates a filename that's compatible with both PC and Mac (##Check and see if any of the strcat functions need to be replaced with fullfile functions) + mkdir(BaxWellFolder); %makes a new folder on your hard drive for the baxter stuff + + BaxSegFolderNuc=fullfile(exportbaseBAXTSegNuc,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderNuc); %makes a new folder on your hard drive for the nuclear segmentaiton for Baxter + + BaxSegFolderCell=fullfile(exportbaseBAXTSegCell,Well); %Creates a filename that's compatible with both PC and Mac + mkdir(BaxSegFolderCell); + + for i=0:T_Value %For all of the time points in the series, should start at zero if T_Value has -1 built in, which it should + %Set up the particular timepoint image + Timepoint = num2str(i,'%03.f'); %Creates a string so taht the BioFormats can read it + iplane=reader.getIndex(0,0,i); %Gets the particular timepoint image, so now we're in a particular well at a particular timepoint + WellTime = round(str2double(readeromeMeta.getPlaneDeltaT(CurrSeries,iplane).value())); %The time that the well image was taken. Very useful for sanity checks + Img=[];%Creates an empty array for the image ##Check and see if this is necessary or if there's a more efficient way of doing this. + + BaxterName=strcat('w',Well,'t',Timepoint) ; %Very important, creates a name in the format that Baxter Algorithms prefers + + ImageName=fullfile(BaxWellFolder,BaxterName); %Creates a name for each particular image + + for n=ImagePlanes + Img= bitConvert*bfGetPlane(reader,iplane+n); + CurrPlane=ImageAnalyses{n}; + + %Primary Analyses + if any(contains(CurrPlane,'Bax')) + my_field = strcat('c',num2str(n,'%02.f')); + imwrite(Img, strcat(ImageName,my_field,'.tif'),'tif'); + + end + if any(contains(CurrPlane,'nuc')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + + end + + if any(contains(CurrPlane,'cyt')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + end + + if any(contains(CurrPlane,'drug')) + [RhodBright,areaRhod, Rhodsum, RhodAvgInCell, RhodAvgOutCell,rhod_eq,RhodMask] = Rhoda(Img, Rhoda_threshold, cyt_bw4); + end + + %Secondary Analyses + if any(contains(CurrPlane,'cytgal')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [GalPals,Gal8Signal,Gal8Quant5] = Gal8(Img,Gal8MinThreshold,CytPos,MiPerPix); + end + + if any(contains(CurrPlane,'nucWS')) + [NucLabel,Nuc_bw4,NucPos,NucBrightEnough,NucMT1,NucOpen,Nuc_eq,NucTopHat,Nuc_bw4_perim,NucOverbright,NucQuant1,NucWeiner,NucArea] = NuclearStain(Img,NucTophatDisk,NucMax,NucOpenDisk,NucErodeDisk,NucLow,NucCloseDisk); + end + if any(contains(CurrPlane,'cytWS')) + [CytBright,CytArea,CytNucOverlay,cyt_bw4,CytPos,CytBrightEnough,CytMT1,CytOpen,cyt_eq,CytTopHat,cyt_bw4_perim] = Cytosol(Img,CytTophatDisk,CytMax,CytOpenDisk,CytErodeDisk,CytLow,CytCloseDisk); + [Cyt_WS,Cyt_WS_perim,L_n] = CytNucWaterShed(cyt,Nuc_bw4,CytTopHat,cyt_bw4); + end + + %Make RGB Image + + if any(contains(CurrPlane,'blue')) + blue=imadjust(Img); +% else +% blue=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'green')) + green=imadjust(Img); +% else +% green=zeros(size(Img),'like',Img); + end + if any(contains(CurrPlane,'red')) + red=imadjust(Img); +% else +% red=zeros(size(Img),'like',Img); + end + + end + + %Make Overlay Image + %#UNIVERSALIZE THIS CODE AND MAKE IT SO THAT WE FROM THE GUI + %CALL WHICH PERIMETER OF WHICH MASK WE WANT TO OVERLAY IN WHICH + %COLOR + + if logical(MakeOverlayImage) + if ~exist('blue','var') + blue=zeros(size(Img),'like',Img); + end + if ~exist('green','var') + green=zeros(size(Img),'like',Img); + end + if ~exist('red','var') + red=zeros(size(Img),'like',Img); + end + RGBExportImage=cat(3,red,green,blue); + if exist('cyt_bw4_perim','var') + RGBExportImage=imoverlay(RGBExportImage,cyt_bw4_perim,[0.8500 0.3250 0.0980]); + end + imshow(RGBExportImage) + end + %% Measure Image Data + %##Write Code here that uses parameters set in the GUI to take + %all of the data we'd be interested in analyzing. Will probably + %need to get clever with the analysis function output names in + %order to make it all work with an arbitrary number of analyses + %and image planes + + end + +end +%% Write Analysis Data to File +% +% D=[Categories;C]; +% WritingHere=strcat(exportdir,'\','Gal8','_',run); +% writecell(D,strcat(WritingHere,'.xlsx')); % Exports an XLSX sheet of your data +% +%% add code that writes the text of this code with the timestamp to a record every time it is run \ No newline at end of file From 4891b5fb5d58ce2a64986ee17a9bbaf2bbb6e1d1 Mon Sep 17 00:00:00 2001 From: Sarah Reilly <93159450+sarahreilly@users.noreply.github.com> Date: Tue, 15 Feb 2022 13:28:44 -0600 Subject: [PATCH 14/15] Update BronkOpeningWindow.mlapp --- BF_Functions/BronkOpeningWindow.mlapp | Bin 104699 -> 107085 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/BF_Functions/BronkOpeningWindow.mlapp b/BF_Functions/BronkOpeningWindow.mlapp index abd8f71367d0cdfcd87782f7f0582096d7adf8c6..5291921d205a4cf3ef4702d401c4d6044cb283ae 100644 GIT binary patch delta 105449 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�tDB^-GaNbI0Rjm#g~O&a_@b=^ZhZW zr_Y(1?mB;`ru(U?r>51}d9G1kt~-X?;zi{dYUXET5nGl}d{a548gEEC= zQ7kA>Pug6Z0T|h~1Mj+$>XW?2^WCVV)!2q?SytIc@Xm}or2}}2bGY@NR_J?-2PNe9 zy*T8Y!(^no)2Dj94%{7-=;#GsUl-HTa1Nt)QL@-bi~m5-N-+||_uio6*XE&408!B> zw`6}3Q8Lv(x#y1q_}&~ZdHii@PPIM>1Zx#N84h6-M6(WykZJDX4dA)^XkU!0sVZ>c zDeNZ8NYKyB#|#rGLKVxv@4ZWrk`7aKekiB;#(r||Iq078?Wc0BNZN^CJ*(@T2Ae7E z-<%)M+;Giz6fA&I(|EVEu&l#G89F;FqHKR_==B3$?-KXWh9wxsHTy)$24timF97j3 zsZzg?md&e^SGg)xOE2QU9=tizPS&oAt~uvBdQCR_h7>KI4s5@q^D7dae+nAw$q%!w zAukx(_CbO3MZDgV0x!?C=bakcTMi6`yw`=!?{6>(0vri%7L#0X<^8+U zWVo58cVVlv=?$t~YW~0ZKI=iOAohcG4>xta2kDj7&fk|kj~KaJ)d&umN3uq}oOGkp z4$LMeI|30yYtZYb&;FRxDj|VKfhGhH$*suIHs?dHA|roa-D+xyx58d>8#;e*=cV3d zM!(bA!=_OG*3~WB4K_5OBSAOYMFl3}fa0!ICHruM;2AZf|iC*r=2~` zskak#0*&*h^71C410&#{0dxsA(*g-);HB3IcRqK5_r7uuCbJNX#eI%j(p;F|UAp|7 zo3oqS{gk;I^t~m7s-M}x6@7oA3j`E*lp2d$>d)M6a^0ND8oeIfb~BJ3l=>9e3Q;t| z?Eun4+i@OUun=gzW}>x#c6r`X-@f2_9_c%Ct&5Sr-Y(mUWLpIDZSrVIh~s}XhkNS$a9eB+ znE$lEwmz@0V=`D;dUAQ{t*;cW*L-BuNtuQc)!-?r*PD&?4~ts$9UvL7F7@st>AxT1 zVB^`P7w3v4-*F;!qZVwsNiu!8*t`8qdCa!*06={zH$4N18TuemumlEb1wMWp{EG($ z0v`ppt!=rx0s~R@)INVkh<}Oi-@g5I;YNKofrUu8_r>f>xut||S*z^;uDZD2RE)oqky;s7T=V|7YQUUvfDk;3?P3;Q!&eY`6B)0xgfaj zbny3jWV;jN!m6c;%Y#Gr?X^ett=11Y4Ev6TW|?-Cfan{eRjkKbdeBOTn&p$EOIEds zP?i35zP_;c%?an+Y~E4GSpcc{K%Zk^M;)x*MIhV=55(n(N9ef}a^9v3S|1peA_7$1 z1kEx~wO2uYcLo*uSif4WfO5x z!smw(gTL_x#~9|0^58g)CmV;TF4Bda%CX6o-fkjoC&@h<4R`BoM{NVW2~*6k{0s;d z{YdsEP7PYrD95fI(Bc>Te;oTMtp0&><)(dlQd@v5y=r5Z@%iwJVhQ4lWpt$P1wT0P zo`o5c&T@a}{~)34_2-@=LS$Aa$Tw<0*bbNaL1~`%5{gHF>f$lST1ih-zmL7~+{V6C z=;+KL4SD#QLKVD}b#B?uISnc@K1#nRJkp)%g2lD7b6!p|A59?z z*}^i+ihbF~93MLnz%f5Kr#1LVvtu91oB@K-y4ruj#0VJ-pu`0q^V>NV!k<+lM)W#z z)WPKM+CxKgcd7(xps<@I&cm~*I6t@vG<`UW3w$Y7elEW)htEl{jpVZgWuzpWF=V@#kAQ2&JjGUHea!B zM9zQG!Z?z~L(45v}@`1DMB_$*WQ@nG@jO?hVMt`sNvZHmQvMQWaDbwSF(Rz zjxG0Bs=;?Vp{7B^zE`|_w4*OGrSQA+1z1`5zdt;z)c#RWSIB<*bZ>z-o7eNDU1Hm| zheN}YR`s*r3y(E-+B&MJL=>n!t<+T1TmHK6IhnLwm2%Srz~8OE-~b2go{jZa8=#E3 zmHDqan)Un{_w0~&s1xQyl{bB3Zl8bg*+}IuFK65Xx5nILZyJhL@OI?rXI?r5BO$|$ zrcVtldXRCiM7|t_F{6(@GRYMHCI7b9z0~3IFcQJzM3cBEUaxuaV zpkXw*fLpG#wf0+uwRTNdgnj^t?$8$nPF4JaxT~9L`X8M!hG!q*OprqH#T&^dZ zn$`r0(b@1Zu6ue*f706Q_t4SHdS%HMpv%6YpD}UR(W^^cPTy7BTjiIIc@FX4`hpal zh_tgiQr$^W13KZbVD}0&SQQ}*IPmjcgs5>S^|pj1Qhe6m=IAr}>Vbdy+!f*c{YNh( zJSzT?M)N6y?3sQy@pNMAU(^5>M1l2h+>xPj&HO+y9{7I|oJ92L>d7c^kAK7R zWb{%|Noo0)qKuQ?OnZ8l?X3+Dg6ayRxuLp$Z-u>gX?X<9jkEmeeORO^X$u+vR_g+kH3^LGAb=5Df3C zZFM*fb*Sz?Ea{g{H;wErt?ZZfpt>3U-=WNz@BWJpgw8N$EeOOkX7pvsRPoaOc&;mtFSbydEe%UqY?gMaJ2@E#QEo_HEB%oKtt^Wj z1q=+jAcZaqUIaxj`?tM^;Ff}VPak+_QD!~bO7(vs)5TD+#BaWM&-mOffgQ^=g=&ui zy*0FZIJ=#xe$vFAJZ8sya(f8+Wb2yuL(4uP9y}xz-6(Ht^MUH; zcsGB?UC3Fu>yh#v1dx6QgUrR32g(m`ZSFiSp+3iK;qAu#xkBlv_}~p8MBJ;wNmgkT z7eD4AIJ<5i1L!6z;(&Qe#KJXqUG;Z^ zUu)0ZE~RG%LCOFH9BB!XlTOu)TNE>tiBFKtg`wewG2`aIbK9$$#rl0gv0Sh5Sc=W2 zKP?!z94L0(`{OG#F%2BxOZS_fNy5vT)-6+vgGQ?$)D7oymp&sy*&DB7k#_8CwK;zP z;Z?6KO}ipgKYeM(4-0ii40dBT*|C5b1Jdf)-#=^nD_%Lt_!l93_@pqsk$fEUtRnxn zXQl@JVF`-t5BY}|24VW$2OXTmm;262(DXqQPH_ESyfAiTo(yt&MdWJm4=laMF%)e4hi0~Cb!*Qam!G!I_aQZ556G$QK?FV5?0xjBEj83Dnz zEv;$TWGNT!uYEN{B^EC|-|P-84h(We7WRzU-)AWFdB^yMV}I}WHKEL<->UOA3w9v@ zP`fJi=#)wIv+LaB=bG4gFOl~&AGS=xIDIECya_Jqt$mFwmH{t1**~^PWRyLkT}N2U zZjj3GtzBjp1lY_r;n;172{nHPbwt5TRF)6rdR;k|;;}ZNo-gMs%!UDrzLY=FQ|~%p zQ%W%Z1sl6B z+bOvJ8NSNC69;D6XZ;?D*;I@&9ohO;dvNDBrQ>Xf^1wC_HK>jwL7K5%JSJeaJDmi1d<@{lU09jjrwEtv|0E_&YqWn z(da5a-_?UBo5AYv;4>MI^OIA+|Az}!W$?|!Lz3j?svcJ2ltnE01+ zN5Dp58CbmmJzFz%?}}wNBFIDtcCx_HRka&|mFHrgb`!x@PpIh)9S%3FduR z%osE|{7)|U{5703A#V&jj zgnA24j}3L6Xde3kt_T)$X~dNl^8ZoYp)(Y5BJ-(G!u$92jb-V~F<--t!@Kon+UmYR zJ=xv#_KSb^*smGW1nCZA!1IFzORer>O6gZGO=S?Z&WYW)alp%`r8&aH+m*IU32h_; zzxU8Cb-%E#{T)M;GYJtT~!OJ&(!=+R;MKMMF;U=>hIj?r~TUyel zTY!JkM6%l}KoOjvv`+|7>)oMttl3X5cV+C$Ol3jn_@Jx9$ZLNndefr#$-|FBH>hQB)xTGJ>Ufmynb$s!E zmb~Hecli~1qb*dvQG8=Xl15xyEp1&?wdjA~w4lo-v%!^K5FfiS6KAN$s92b!xa++X zP}VsD4pGQdQ~&BlHJeb2T+g&i={|WMNC}6hzQrhD`7{r-`>lcIA5Dr$Cafea)9ZzN zK9i0v?zH_p|17!N-FtsXhW!$_h7DX^w7%SL2_%ccgGr*bC%_Nl7x)5Nj#hEKB?*6T z`vZqx-7hjxO@Ho0XAAVH^t;lc3o(XW2>@S^tI)TJPJGe9=Y2 zS)#n;{`@#O#WaBsIct4%Hf6GW!X!~}9)6bBr$_jHz@IuVMJK$*=Kd5&I0#cg-Z&r; zY@vjz_%_E5_{u-f9dW-ranFEFK;ZTrrTJ?x0_eGpt(5&<0IMJ6WxQWt<~@H%!dxx$ zkm0W`!M#*#e4ai?lu~1U3Mze@0K(6=BI}ZLE(4o01lq^x9f)T?@uQ9d<_nLq^9Nyx z&DhT?A~6+(nKvhPUIOONWs~|-lX1}fV<#^h?wz4V&s`CUIM{T^hv}7~RIi)&#~gbm zra3_)3u?}zyyK4F=8a}!DP4cGq9~3y%w&DVzlpVDh-HO!Pj2f_n0qJBn`oKAme%Ho zmevedPtLy2n~Z>3{M&o~N^gBvbT0wZH;!$eW4hf#zJ=^5cbchpE?-ds6}3U-u%}jyA(J7nk3blg+wVUep+(_)0pVMQ&+Y} zpATgzvOU>+hSriMpqRnM$RPmHP>sO);^m2meu_9OwKMI0YgFTQV(cl#g*)l*w6@NQAKB@xx!-m4ziEwxdW%Y^^;n-(KdBP_s%m#@t59zt-qNx^W^j&R-%R14AWelHZ~dWnA;9XRJP5eP-C0{!TTZl^Q)Mveym&^FQRE`UYNnV?xMQG7aNH-^Y8ZaH03v0uM{494N<~|H21V~?oWWW zK7JYTU<_;B!GC|2+U#DtXLcUHc zPqrQ15#Xi*s2C2bDE~zU{R>dLubay*-kj*f<8(>0Zb;rQ!Bnge&EbChV^sP*<>AAc zUAIS-7t+m21h)%5Df8Uh0ZJF_(GOY&U0K+l1D^DIe4l@6gG{+k;&Z(wPYOnN5y8*; ztr9~EYEPmKBWyl!p5%@kQ!>71U2q}nW_}E4xE3=n=B{~suRq2L2GQ$o>;xv3TABM_~2|9Av@-1Co~XX@SV@Jif9 zS#WchPyDVP@{&5Yml&?MMC>r^y~aV!(eIs@UHrl8h~A){?P`zRz8m$cyP}>Be#{xO z2!l6U&iuZO8!SFR@TWW@nEv~Qo>lunpRl+?)*UL6LLXAs#9kc{iPa~8+z$sCgM>kL zYuJBa;yS$T5hlxaw*d%G8y@rK`X!3>N10AJoUt4sXG znE1%VCo=a$hNUMbv&HMTh;U0wUA(}M%-c>9?8y#aduz9{O>Ulmjg?MWc)&Mk*Pd^! zvwyCwapwcnvVU3H;Yw8{s3hU6Cvy6o+i8FD?HNM7{|{eh?xNLSoelPV_2_CA!vQGo z&E<6rt2qNUCrlzgAbxo~zQK1yzV2@pW{_sS1~7KlpNyU;zFMDuE$EN!6$b3bv1!Cy zy5`05H`6ex**x%9yRho)8qGA<2_zS87M}=RoR)~xZA=M-$h1=U2eEB$?ECtJchrBG z3**gy#vN5OVI6b+%Cy_}ej-?2X--cx?vKktLkMJn zATEl-`#Zq?t_FK(!5n+eV z9ySa#Cj`Km=O8z?1p)L02|R9byl1rk8uZM+I=jx_tJSp5w7vb*z9Yr<6xe@y5(P2# z#-+{V68LQTjJ{vE1oWdnrMy*Rd>G}Y8BDyuL%cj4Qm5J#TKn0|zOJDM0XpE-f zpwS7d(qcn@RpbUdDzsE|$LoLUj=EQT??M1Mv8iIwBL%S!#e9(~4ETZ+CPTH0n>seFWcK))T!0eX~fQY)z-Mu>Znv(x1Cq!C`Q>g+RAdQKC+?>;txV+w+bw?wN?UJmzoaHG z=>pW9sw32j>~lL^ygAlHcq83mEn!e-;3TsnR z^cuOz_aQHdP*G8dWLe*q;eTT-d%GpwEqc2)acCw~XFxXy zUU+Wj_pzPK9)8aLE-8pLWxtKm_wAyw69EgmUW<>1oqd0Xjb;E0&07PV?`_4iySL3Z zrEc#%rYcXbeAXuy`AHrhhr_rr?Nq_#L3`4zw41kp&n6Y1MVCsj*OKs(@cO~cueBe0 zgU@o{tJAdG+LL3sE9r*X$y;IXHt`C?OpSEI)I*8niS(UNz`0rAG@^UDtE;n%?4}zy z@>EKEBQ1X{zIA_g%LN5qn`BT=R%=M?J;46m1d!nQb6+B6P+L=KSX#S+g#g=3$ z-}}-qL$0JQbJrPM{i*A23pam?qTio2cGQA`b#JOFV2`gy1J2%)!Y*?+7+me&fv-Ar z0;mVNAs;(o?&@7?;NM2=H)tp4oSp3=(zb{x41<3~bkHo=%kpY);yNe3B6Om&9_V8o zG*RUYR|+`o@{G!*F{)j=mCG?o&d=Hxuk-Q0shDdh3El0=V4r)8m%Bo&_epgHKev`L zxY~II%(V)VK`Y|{-H!|VX%qprl0KF`o351g5FISIR1>5N1`}%Gp#%*dp1rOKPJ-Pm ztn`0g@AWspPkzG+lqA1idFA2Ll7pz(v21% z2%vkey4C$7*PoVz?vv-N&)cn+ch5g>Rj7hJj<)w)HkK>9}` z->dg!-$~}XI8EQUyaJGzzX5VQD&7@bplpAy^`&31Y$x{7gl%GV69CyH=#5yypUV)g z+mJp$7}kUStM3;^+bMm!-Vy7~{3Rg%p*+E=#SZ!oj=&Es%%((L+<^vn2^VVHIF<@` zITsY$OMTqod05hfPfU+Gcaayu+ckYAeIBd3bA6>@iC8p*Qf&VbR{JNMPBPgF$lia5 z@85+FK%-OI-7ehxVW%#^zcO@!2f-RN-HDr!ZSlP8Uq$yEM9NJ?Mg{u9D)XauyOnz4 z+Joftu?r3Y9{7*H-t9&oWHiLplpHKLcsVGLM>qM)s2kFh(>Q*V9jht3TA-u*pkD$} z57=|K_K&2ZXyV_y^RaR#SBk$HgdBevcz>I7^r{pECg#>DSLp^P-@Fwp`k-D}gDaW? zW-9vrWL!mhz2x{Ig2sOpSYxL!~u-YxLn&WicR%Jp^>tKJzVzF}N zMCOZ8Qc^!ryDs2A@46yLa3`$j&kaN?Jq-bWOz7b9@nW#@Tg?kybSznHoh#NP(#k8b zg@G=GNsDo|=!{!mmfyYAt4_|fj|sSV^Tag?`mxR6Ta-4x zp~i<3%V{KWv}=ma08%PC2H$_dG1lmSqT~dvsd4QhqROd@=-Ys=SIMp@0X_q?7sK|& ze4-2wcddezZjCyOeq(6fkR*PGgEGV~zg#iHIbMF2A7sGsr1gTVet5ZC!#nY*K$@zp zL$vhw%aT3eKQ{Q?-5JqkZPPC3KKPG)GyyT;Pdg! z3Iig4wrNr1NzPd{R$1sxc93)5?gf8P4>R72YEO*d7o|HijtwlM5Uq14L*~TBse?I{ zS@?z=aALwz?L* zV!LbrWlwF%N0-Vm>)*9Ec+?iB&&O#Tx}&gAElADJe~V+UTd)M!U{4*mLE;8+2vqcm zv*$!5u84oyXsdq@{A}peBGE}9bit;Al3i$6+R0}E+!y!a4tU&uVN*4E)^?0QHTY|g zQC9Taz#@UV_>g7w?J%+?dtT$*h(GT?5jor_hGT!v*!ewru0dps-em_P)p)q7t+BO@ zvE7zWvQX>wTkwb-scY%CCb}*a&O7+DVZ6Y)tvhi_{&IivC6~B+Noc7Kk!rbo!Bg>1 zYcv*yxe|+gi!{-TpCJmOEZP#%p$g&|0dsZ(qfz{HpjC>(wEop}#r;|@o{5Imynx1p zD7Wb5@(pT=D~#I&f(>_lVpzj^fu*B6dBxAp4NGwezST~yeVdB%zr9-R3T%`^Lq{(L zP@8dKfQ^5CleZn_Q}3o+{qB}V{X`>TMfG=&V%#UZqg%AMHQg;dL(A!xTUh} z8@Z;aLl(p*A4xk($ae#R@|UhY-d5o-4iLus)02O=WZqUP%YYWYH|x&qLwp^l7AL{~ ztGqFBU4Q?^dloBRQ{`Qn3`TKKS!&o~`Pp?7k;AG$VG!;6w|Hsz4nsF0X2~`grpj#K zt+ejm=RX=-Y3NUKG=6*85Xu@#yA-t)y}^maN;?VuP0_tlaqK$$S@!UBt%wey< z(qeyena=6xvJ6e`;R%Q~OA%3ozJDWkfe&kZdm~@54{BBYJV|zHF7IdUaZL4B*s?{`@n;_;{$5~O zsS^9QZN_J;i(wJuBf3Z3>E%Jzdl6(6SGnvCJS^p7iseH&p&E=gr8nVkN+%_TldOMw zyyU0w1Mj9|&TO*3@tA(xL|2z@XTL}ZK{x0WLV^UYwm#WjY+z@ivERQBGdpPgV%9N? zLT{3(B^@^S>a6CAWGT!UqR(SY^*PN1EOpIx7^e``W{%^UHrhrWp!Y za@o-hSR(JqHvo+^s(nv+=@;Ei`d;fRrB?Z7MpPA&zTy+>f-K-(X`2b{N#_e{f>3B~ zjURt_0_viXFAxK5Z@qn*SMCN2KZs7Etml`ZA6pWXZ=(J$>aZyh>)Mg?E~y37vc0be z=NvaKo|y?hpms_S>~hE^wcCHOD%Ape)Y|m;$92($|KOBReEs|yFp|6`Cs~8E!i&<~ zdhmiqkZ!&OwsjwJ(1oAv|HFW@F|8$zmOUg42?-DlbO$2Z>%>rJB( zUA9#(x~7_mM%(YgvASRQsx<`Kv>iNI5ok^d$A(N0Cr%$JUEe9KZAq<35zZV739*D2_L~jS|aA^tSC~{#Eaw0Z_rnv6yKX%YnY4Du zC^swcUPwOqmT-?q6;c?cQMye$8d{gaG4l@TseF zjW8az2dvOj*8r0bA2ed)vJ!fokNJxr`wx5Ba1!DvyQLF&WG;VaJF}Y$_s{*`z9%eO zo#HPb-Y7Ncw_nf<$`R_Jfbt*>XFrFQMSGa2WW|1i*C9g-DF{kAPwFYOOCGSc}qDfV($l=7Z z1FZHXc2&8&hT(sy_2fH>lHreswbT;ebBNRTiK5G?`sZz!_H1&W_H?qmkZ z(3TL)bq)OBusXI>{8*blGej{6k58wT0NVHjP^>w2a<;e4(Jbe5=5AC$)$3#3xG4MD zw=&N%mWK&lzqwW)-SIo9AZDvGIoTTkr&qV=8p>wv^P7L>SYHo*RN%g6NR`b%= z=#-EEG26`vVt_<-;oDk!s|}G+D`Aeho<9_lbNjm9TI=iQ0d-1q%$6kTx@(JXE{n78}SVR=2)<| z#Ntw!gvVl#-S6E{L|}t~D)2dLp>FAx*ZFV#ySv9#zY{q@u+l157^feMVV|?|`bNmPqR-wd0RH4N>-T7Iq7G}X z&(VLdHHQ0bs2$Pg&5LsAN=j+w0iQ{MPczpCX-|?(U361o+yT$&{<~3a`hu3~vLis1;M~VCMQHsT?UQ$U&^WMeXU0YM{ah_?%p9ie}GN3gy z2;aTgOm7~2_g-!QCHiFWgPf{Kk|Kts3f6z@`y@pbMeGoJA7cej!`OKxGC_Rs&Y;Hj z3~6^H5Jh8M^5J#1J;+O3{7ly5^=y|7AKW__GS%VdYFp1wuQW^T%)81pN1W{N#_Jy6 zS;uAS)BJvjJs5q}U!Hl@6QDnJrnTyBFL^@(M;N5n z1#&lI10QQXU-GKwLWLa@hb^as4}4_t6F+~E)?z!_4}FZrd?bV2>6EHa2T>qHqd!BF z?csIO(4gR*!yQmf9KAz)cgewJ+|Yl5`QVx0$8TnLtUuQrs=DX+r8hNgjm3;Q!AU=0 zX;358{P2+65T>m^VMJ%-JfSBEM`RAO!i>m)e^MxL;rkuCm~*8`dmx|OeW01N85Jwn zb2yr6#h_@S>X(At;i%mo+Zd8Jx<@iQVVUsq7@-qUGk$%Afc1Y1&1fYx zr^>~Zdb)~yJvvle;)wDiMGmk3DDqQ;St|42wOmcI=#Kltk`sL^gosiWd)?s;eWt~~ z%k~3L?|Ac9x2LABZv5^l$>9s4B0Ffv4hh+QxE{wb1?k1}*z>x1B|8l(tY^W8*sW}i_L=k^Qt)&wY0)mB ztKpYR>UJN{Sb~G|v@w5AQ%93wG%@%yKE~c6>J>^WM4i9~@+5YAd4Gz@CQf|H3}}|C zx`p^Vb--`UzvQ`1;_f1DdoRD9=4&t9D}BUTDa)7psH`8St<);MDK0*7I|*$WUp3|9 znqs!~{^i|_a{4x#>Vs3Hns8G=Wr=&Dj*9!JK-xW4a18?ee_wy*zodeXiUIGkw7M#7 zLC^~Ue1di_llD5r&@^v~9f6Jk&qZw(M%>Ewp71gCK&-AlDeM$)1zB;AKJ)AWx8r7Z z_A2>2n^qvVv^0FB2{D(2jKoo=ZL=@Lj*34T_USN;ljX{z@C*$uB!ryVY8zOGBgL}K z5-yb*OEAps-J^d%zuSt9vZRsiph1$y(Tgvgp>m;v`6Q}19DNe}C5u~v>-?6H>+*4J z@Pk=o$7Rr!*{p`;-UWqD4pbENS+mjcboW=Jv}}x!G1sM&D(=`Rz&EPWE9L#qoK}Ur`H_FF-jSZKDMFjb@2ZGWtRih9 zEb(I`xIeQ__KZ?nq1enR;&3^y@*gWl64@}|unB$CTB}V)NC_!5s76cdQ_=VlDOw7A z{6sAz!9uIQQb(mB5B;N+y1;MbgW+6iSHIIfQY<)9*b<$U`4Ij4;^dCBYL~&L{B7MR z8r?{R*tmadJz8HQ(R3W^n`=|uDUjkG%sHtgdzz``#TR5RwCJ(Y&wf2}18$H@19&%> zjtMqx1yc!8o{A&XJ~XTj24Kmw(QJ zc#-!IWX;kq-^y5YXgq_0{7JA~^Kf?_fTNRdEW29L*V7kz+Q_3$+Np@>vQ-rWNqIQ!BLIA z0wI4X-!z{@*v}j^oe9*wIvbvGY&Kb^SK1+t@yEU4OZX$Td+l{cBUD2n1l*44;A?vh zKD7E;ORjmG$y%k0}_Z*^efus@eZS5L>hVNnl)~|3M&*yU@tiUy7W- z@Eyd`Von%64(;bqP&shBH+?-ig3#eEKLUTt!Pi0oSH$6VKQl3Yv$bRVD=!TNWNv1& zG!QWyczST(&Ly?@8}R&iR9L)NG`o3JR3i<@dtxiU&g90;;|6ARu6AC@G-`Z%ocj@8 zemP2#9&^}2bV#`3{<^oAj_D_M%#W^AK_woq8)ISC`sJLk1nu;(ieG_9N(_4p`8t1n z%6T=jr4?5zY(e$Pc@?vzzplQs1r;jil`3P5{a+2SMj`?4o8UN^fwGwaJ%Z==uGEsg z7tI{BvO6?y%y#Y1_|lxc|7@uaa|F!9l5hiaI*&+JG%T#{FuW~D#Y#TfScLrPC{FEK z+6>^lnu3%dY1vyw(#BF21z~l&)#-nHz>en-%&L!ZUcnvFmOtxHunw3{J=1$c_9G4m zkReU5dND?be$C`6?t%weVIPP>qP*_goQHu5yI>sF5!{0;o zsznuh5(3D3%_2>No-gv??|{+l*uhBUGrK8V+VhcV-EgRdy|3egsT7(4{^vy7tvxql z`X@B$bU|~nj8~q7ro>6Zr`>b ztJ+99v(o1^u}<79zbQt^;NkjTFrd!vgvaxu-PYsNA*1Q*tNP6D-eyzRnC=vDKyatT zeJAHqSGRVYwA`ie(-bq`9mjJps&z9BgUI(FQ-0>ImdVFEpZ*qz^2~pOrD0wP01DLJ z;HI5_LeS?0#O?%}XF`B$n5&!ovS`Dw#@x_*7UB8Vf}9;Hru7;eeGgMkgc_{3-$tu z5MR0e!PaP)(RX(CIU9eki0r-W5}`rX=ZtyQ8qC8cY;!Lx?Werzxd}iih;IM+*{Z|u zE_fF1vEnDkIs_OkDgt(!W<#>M(9YoUigghRY#8*%?C4S6wZHERWi>tx3%@PrR@K?z z&C(^XnEq@rJ#8_~V>z89KvWM1Uys?~p%@peNz^_)og7Of;8 zWVTZ}XW<^?U^;rJliP@)(T2{N2RIb_KdQ!r3n4GQw;VweI;|ot8y&vvPE6T63aD8L z!)zvRdYWE+a3gd6*Dj8^tG)kGG?vDE#t|WH0ktS?NGH^#!;wWxN4dyWq26?ATzGfY z`VjVFIz_y&^G$!%+ttcXptP?1A%0_&0)V-<-R{<<^+9{-X9aQ>+n4GOHMqZZ1TK+y zHsLUi(v{q3q4SPmv(2xl8KA98@@htTo-OcOQ^p|E;Le|{0JoPe>it!?y-Lp}tm_h_ z92v1bU8(0ROyHvwS7~t0ld1A8ANVrLw^g^})6|1I@Ed=)yLJ6SM0DCCspTQ+(Ld++ zqsDFrO-2gBY8~)#eSZbGp3PJZ1iX2lj_&Yi(x|7H_43Su24eZu&u7DtUas{7V+zfR zlpqlM79)m5ANTP*W~@%(9e{H5we`D5>xrg5{JpY+Sspp#))N6MU!vDGzC+3zFiEE) zsXD%FSJ{87->&c|J-Wz(?O*3n7Ja-;r6YGTsl$`#d!{w9cpWeLPa2S} z9!}%C|L!8R6?66#bErws#jH#SeTQB*x6`57@Na)uZgoH4mfIU3p}*Vym3EO#>Wwa~ z#40W4XiLOeCdJY_o2xE*VtMRvit zIOcy3u{N}NDcZ2NHNFGZLN;V==$y!j97Om(AsU6iMm5gyO@H< z#xXq~(WK-B1H*nWYo|rav08ae4FGIFlfOq#=nPGKF^L=UYwRSsf(f91JA}JK%3#vJ zq<{PNctXE`wjO+C^zG(!>>Oz;8XDK<#R6Vd*Gw*d_U?6c$C6hU4^5E}n{zbFcT>>c z10eANfRQe{Yn#>cGaR1QLsoch+Je2!+RK&O%HZ!1?*Hux|K)-78_y`I?!P1;SWVu= zrEIA(QE5_Kd)uhGYVToE!CyQXMb&uC$7R~m2Y9y%*sc}-`=CaT%f`I-PDGl%nL_TK zA8=}aGr;?_BT$1gq@WVo+-nj7f_GFY2AL;#XlJB65YY4{-P^Y$$GQE6VzRareqHn0dOm>o&z-u)c8`_j1$TBmcG}3%dQ97Q!-`nVem2X69$>s z7xSndLtU@^m*2RK=T~2z%FIHik$<*?OO8+8J|@U~KW6aRDh_#pEx8`asd3#&H4Cc} z>X$Wl;8LMgmSBelUI;%{9ej11OLr@P|Ut{(y;;E+`M33Z4Bi8 zofB^`3|M}6KJsjvmS~suJRzaE!%*iHBJTaOeF@+jpwvf=IZ%L~p^2tM0kuXY!qaZU z3mE#2ciyTw*J5n&!6C!*vkAXT<+~XeyLidHws>v68KE zNFrG&ek@_oR5j(GH*(MXN$$=4!8?g(=8Y){O~~QrN4oc+Vc$3Ao=B#$4u)%{?gg*w0jMz=3 ziZDZXmV~n)gFNRQ$2A{&KYCdWb$5TQR3AS-I_oaol+kAa5BeJAv`BdE6b5Jfz90jx zK>v4!MCN~dnx2iys?3)dF9}kTEHGMn2asR6z~{7y?Sn_fB1CYw{rT`i8)Ei9Y^!v{V&rpEnZ04KfM&pE1%Qms^Mg6@v9b~ftIaIxAvWi* zHptAJdtYzzz8q=?ihzZ`e3k{p68z%7B*Q8@4fQ}ekAS>TKr5_6^WDPmP`5q_VZngZ zGLOnu9$3~*Af+}7_9@hV^QzJ{JHDWM(^Ug*_Dkb&v$3+l!oq`azO?CumiL6cFezJU znoyo!#eP}aHWf`P<&2TH&0K6HS&STKkx02Ksd4@qYKqoaWq6iU_in;IG=Vw{0S zLHd2b+c~AYpoL6c#z6lCu<^8P#r6w+eYq(MaU<&Q;_5z`vt~JeoF)3`v(nuijnMM@m1C z#`|=ynPta_c;G?-2dp_x-^5T1MsEMw@(oi7I}A-Uf?V{aaI6qjtCMm7azEusEPn*K z9<^VDzh7}BykCNUKsi&vmZc}Cwtl}#ybYmdUh`@C#n0x@)l@81s-(#THtK^w6c7P* zUFiP{lLKu0y#Q1iyLrdddTO5Sr^go?5Z*?#qvH?H+f1O9u9rQtZEf9kV}_Clg+ehw|fT%DiT+ z;q$WOQ(=PhitqCze*eV;SI~VScSE*tAbbf|Cn{(juJiKZ7f9!)WB#Ls1E z{#inC|LnFu1rPwr{q%qH)5lZv(~F3|p~U?=&CbiNFH0U=9m1*iXA;~TI$!>5ytBpR z{a+dHDA18DXc8_DrQoiEz^)|g%x?n|WN6ti zFR2YkUQ#A+;5bOr)ha}7WL;p)mHU?_4$q7x=bn`j{CoAK6Xyd&%60K z;sdfim;v!3q9VNDuy#PWy0WY_A;1RG}XE>>~qy>o&OOEq*{5$9PE5`=_?8w@Z z)zKAyXuZFDy>*Rm&*a0C?IT%xdYs}PYR=c%S+VCW+D$m$!g&_XGq_!;px~^IE6Ps} zSmXTP{k3YicEdRD^Y_}|T+94S&X<^UC*lhc4@u7AO8*O^RM$e-g^6g`$TIjYd~Q#Wkbl}45b|9i$O!2B?R6C z{DvSO;RMEpjuSCAKmrh-P8K3tY=ij zD1{s|I-(heG(=PQ37is`Weew}GJ`}Q)t#+&m%Hw|M>N7=>Ej!L3CGm#V#9oJy9u{{ zY5sYvx!mBK8cvPBxW`Y^y!qMvb9vLeSGK&eZE(9<%QG$ySMp1F;-tp!gNk3JLy=}I z{ebD5S?6uDvsJRQ1=RIb+?BK5{o2=B?e~;1a?SEt_3EArLS$zq?_H^XjH${Gfk@OJ z07b=^ChPB4)pePK8%W`l#FQb$i|ZtAnG1!$IfyyM@6Qo#o%F^Rh`? zt%_ZxrJepET*mdq;M*4d%HUnCfioHduzIhW>`$>ysvVzR28A6}egIPRNI zOtA@UO#uJ^jRF7w8vvKkmH{1qjgnn!!ypuf|4Q&aF{U3BNmAHGuQoPVM#t_%Pg`lC zqHbyb{Y=vIWAtL+g(vUpnWb44 zr(uzbEa-Gjr?amd|2f}J0f)V|Wv5<>uovLCmBxn|4&u#+5!HmLZsfmuA=4@)bT*@e zT=g;n`a8Y!HIxrltNm*jaLCJADxur{{z2?Qa*9?Nl9l7Dx-V`MRQ>|9sO%I5f6(RO zt+*Hf0KKUI022TJ0BvD(Y++(AWN%}2ZDnqBE_iKhwOws<+cviT-d};6jz{ubtt?S5 zw$r$K?YPc%CP_W9)9y|-HhY60KVbn03;~Ylh_i8^Wee30S*8X z2XFrVybj6lG)aRvI(s!9j$RQOe=Xu=5UtK$eZIZ=+sP}EW`4Bv!#JX6ucG)B`TLJ= zo?b8G#db}ji~vBCzJ5A;^_XRw*GEU`;*qZXbQo`F1os}|WbJ40HCY`!#mRD$#0#3H zfWHopywPZWwDyDO6@$EwmoMz^hX1-w_@A5XC8Xr(_3wUo_6ms6S4Tg-e>tk|^IzGI zZ~o`Y+spIY^Dm3gPtzrRAQwp-eftGCKu*5}(K3D_ZwN36{rjQ6*`&ks&E~>S>381| z_&Ffg2@p=QfTkpS^fR)ElZ2+5I9ie{CLjS<*6ee|fS>?$*D5m&Dsmque5nGSDAQhNVb_Q4}7oyI@q}|9FAo zg+cVK4TU5Qhm}AD@fPj`(Ux9pvn-BUK;#L<5+pt#tZrV?jIJ+1eG$FkA z?`eo4@H>_GRU9s%j^m%6H*u2vv<$MVfQCymfhtK8L|XQYdo#%tR}k5B@hQQuzp7VUrd?o+Ya=K5iEw-KN(x z3Dz{DNf(T_FIk+%f8kCTf<*{sSt+-TO3fN=uTsuntQ5epC>Q>77IP(xJ7W~pVj|*F zEjwXcCfk)!8!a(zDBN87$qNqTQkG!x&JRy?oc22Pliz$W(e#lncQEx}fupp-`1I}q zYp!k>8hv++cW@yxqqMX2aBC_@YYg7zynVGftv7FtA+$LRf5f%Tb;c;$99ohtZB7U3 z*5+iK&TUSB*`du)u2#9l=>xxme zIjkg|+MEW|vCU1KG0-+Q>Bs{|ac^_FUY*(;UM;R|4n=Wmb351vZ*$YVwYh0m46)52 zAkJ;BD@N7kf3T8tYI7P;$2K>0#z5QLv?C83#l6kxdUa}Zc(u5;ITXdM&Fx?xyv@z_ z*5+niF~l~9fH=3gt{7FD!%EVr&1pa#+uY0<18sA&jy!M__co{N)v3+l)#BRbP!zW| zw}XA~HaFi}o11sV5ZfFA;@sxCVpMGoD@ms|rvY_re{*wZ47AP7JMzF$+}oV4SEn|I zSBq<#Ls8t?+z$3}?I%88dqvmN8yD0+u%~&@;9hDRxbkTmv8P49Y}n#{dJU~wdoqwi z@mm$xZ%L5ROFsj^t02^#^fa!nf27YDuUveIzfm4&Uv0yXF}R_b2GS`1c>}tjwI&pV zM)`{%f4iic>`{9*WRm~5UDG63=#ObMB>7=O)1o+kJ`?miHZ-{oo@uBm#6c4#q?V7XZXXkxKE@$?hF#dPSreE|R~fcx=hl+cNG-f{OQaTK z?3PF^X2>m(TC8uiL&9*JkUppMl0Nv`Fe@MVe@K<6BbCW)2(z6LraL1{c1G}aMQErK z4dK&cy!6-5z&->~)hKVmU`Z1kA-~r~zGYXy20wV_hB7D&aQW5`DvQAnAY3HD>M@IG znhF#evp37PEPn~$Kkr6Bmv2b`hLEPxw<3Vcx2^ytZYX=}?2Tn_&i?by=g%}HrXO8A ze;26auY$-AVT5CNg~v9~qtP;dvx)y|^{$feRGu8bBqXGZj4nyQE|X1u{UJ_>Up%j` z1gi}B7ykQzy!FHI-d}txUZ;A5A!bPHcc=*cy?T=hMqbd;C2C3VI}FPXzpL^%AjQaR zvt^SA^018-Y^3^HdB39)C=)36ueo^Nf8T5dIfc6Xc{bO;nH3oLk`zYCl)wPdml6eQ z_9_q11eBrq?V91QJ`DDMkVNUTAZmCu2$Pe(B-CeCd`9jc-qGw6|JKh*9b(xn1C}`d zY=J!>8D$_a@szXMMj+lB_Zlh1Yx;p^{#pKQxS|>R%Jg@`G}%|!fn{F?30N7-e?`uq z!ou(YrV#y#^Z;^JMAqNndS4Vg{DGKhEosVt@|0sDWFkTgdijer!Lo;DC!<(1WJ?(p zt~o!Jj3#()62zfJ=kMcHi>x3Oo{uPQ%jSl*$wquN49`!*vE`Rn|Gl5mi}Qcpf)sSZ zXH~8uik#~mq{DN@5S3$NCY$D zCGQ6PG!0e}T@KBtADD;a2xJw<;53%hXWXCI@&M!#qy+o{2_p6`ZPhn_e|I3EC|?f_ zz(fg~*(*1GEnZiK?%@aJ7D%vVh_f_H7Jeq#_@MW1RyA^ZmiQwS^gLR=j~85{XJ6K= znpyGtJyz)(KYQ#QepN*y`o#R(c5{}3yNa@he(xa7uiPD^!*y>^kQo$wwaniItXruK zYxA@m^q^UR96}XR!wq9*e>s>juY)FeMwa^{3q;lXLSpUqVw)sjl@EgY5$z604|3Cm zm?uAB3uOJ?1&088 zW^V2!ht5YvtZ^2M%6IB}IuIKvDc8RL{+2b7wGYiM=Iw|<-GkqOe{5e^LxM|TyjlSP zevA23-Zm@01kE{!7F0zJvR(?!4jLU49!RnpW&w=jY4jof^6}~-?}e`R3sCYFWC4vg(cFf4Y;c2E}(PbExluB9gAvGbkRG`ha?8pqc^J<|o0Ck1y! zBeE#OnHe$$@K2nEK)n;F{+yRZjR&N3mW2(+VAV{sa0N!8fASnA<@Ul>xpNa;h->Qw z9BWz|hCvhg9$(~uta3wROY_6x5?i8AWp!VHmWl;+5cu*38~6489Q@IXV5q|WE?zSJ zcbRNg<%N|WmT7*wDK8eE?qOoUKdjiJ2>vOd%if<~rEGKML0=dw{E!XV{4k~cFZ028 z^i?qk)@uc4f8*ES?^fAkzbML~=IEhYEbjG#!T4~<3d=k*`R^GSp~C{MY{(oH>yHgX zA7)oZA7kFe?#wO>U)m;3v>57_ARAqI27n7 z&bL*$DyQC!C2K~~&;j(Peb^;cDv{>&ukAYm#yoJbjgM z%9JYrnn537ln=9$EC{*3uk(O;1TA2fnvN=nGqMfx?z-RmHQ=L&9t;oThX-{EC5jEN z<22yBf1w$UMgCj-{#Wcv zU(5y}UfG01oOnRm1JaYPCK|QHXqdv*zJf|$%nD&qOAK#=Eaa*vt{L@U-uI=!TegTX zf+73Vmw6y0%_zfv#7XcUw#pfvhcFrCJ5Qkqe+xETN_tLER{+DFbAr4#a*`Bla59;Y zDg5_Nj>&X}Se^yvmOgX#JPCj9D$VJQ71FSi4|iIYoqrBh(*Omgw_+vAS0Q0if>cQp zgrSQ0;(G@;v9i4Jj91j$gFi@JHI^=~us?cvLgw##KagITy7#AhjX7}O^+e&@1N)}b ze--qY8L-2;Ov}==q@2@}+={1TSMB6W)vT6|KBwUKk5U){JSH>fORyQ4x^=Kv~Sy9S&fx-W37W_+i+ZM(uyS;cP{NEc zPii(r17zE*yBeYCA%|>%OdB(^1zMk!e>9liElsmRHx^H8+$D~AQuCH_2fMT3xZ0f+ zOSZdXGM=akD6{xbiDiyQ4Jf+$043KTJ<|SA>Zbzf6gaM zdi!ScB&>bQ5JPd6cC}!T#q^?h91Pd;$=m;7&t(UEy55|NsK=9$N0?Q^G+;79)ToG- zW3TeEQFVGaixRPpjKLK4Sbl3Z&Pq@!z!ca|PG)30hDPZjC8)(p@|QI8gAk_AtlJ~+ zpn;gnAuop77B(EF6S7o2r4X*0f2UXC9{duJ@9F26!-u|}1z6yMEehSo&zKeRg}9q^@Q>{F;%r@D{%Yeae$B|c+_9j6RpB7q z7?)y-s`(N(rt2zw)w!{hCbrVv2n|b)KHa_9?&8gK44V67Qk9qwMnh4}CyOeoEi)QQ9gxH||4OoAz^|BnVX@^#cTiJgkb@s*x86i}R8^-nIVeRaJ5#CCGAUFG!h28xy#>cEUIXAO67MZm1#|R5C zT#-8uLE6zTV@|1#e|qH3q!xDY&l9tMp1Awx3F4n8ZT$1Z=42-ZOPw_P=Sdg;tdo%= zIJvQrWIOq1osS$1%8idC>+YX*GD27>Hzu`U7yqmiQDalNu~DRV^3TQ^lVV;qc#BCZ z|EyJEC;x0Pc|E{Z2hKRs{`|8=*?VAb!rI+G>%5g;e+zf;&j=s0;^f>c{(0i) zpLG^uXft;ng0!oDMx0U|Any}Di0(WDX;=S@IHfw8qC1mX*ug)~%>H@i?w@Cff1b7R&oi5oof#~3*6g2W zUHr37Mve^W#zvCumhKO1XI zily1$EoQC!vsQ(j{IkL2^}wASIO9nB^UoG#?}5DuYj^*w^HzeCy4kNR+`&I1e9VfI zbF=v8nWKN!S%@K1-FXPouKpQuN_FH_cP6#4gMXfz{qx-2KhF{WJa6Nl=QbxhH(2Vt z*+0*_fB0vej2uPQjg2JR$v^9ShIBE6G; zHrALFcelY?%vL4G@M#*y~tpDoJX1A7zJ?*3Wltpqf7vtL=bgMUW& zm=!1IX7SH+NB^v|5W_3G^AMz6{WIc}>L|_be@trO2LF7{<0@4lC74XAp=lu|0Plo3Mezh{gZd)U~a&Lrqf}~}0geR$E=6P*)M_?yZYUt=O zf0pRj6MMA-ldcrbZkDHYHgtv9L71iioqW=zMirxE9vwL8I+cbi#g-OTcCWOf1#2ixJNiI<9PXU4|xOjYG6 z35c@8PwPn9?ee?xI`8u31jhe?-T}Q!<(Iy?*FUIZe3rZa*aYObIF+K-^V* zHH3rW)Sx#;l?mw5zCydM1gU!Ny!d8bMi8U>=*t4qnG`K|5lTY!Cc^r%k&F^3xdbc% zF0<@?_|VrfQAlJg%YH36AZ0vH7?0&`@6eFR@SnHAg6#lRV?n7&%DxQS`&6X+e^)cq zzgj|7aX40YY&>90Ck=Nd#2a~J%KZDWXY}vdxeEHwK|6VY)x?HBLsJ8C)=rMuDXsatA-Q;g0#0lzsh&1f31 zG^1jTX%7iUV%>wK~qKna4;2JH@CM)Un_!xY{ zxS=o8XAt_dUq8)_6}fzH(7Mn%PE~bqixl^;bq8Hg9ipGi$VoBwe`;G!WX%&j`EE~T z6;>2oORKD8vht2k+{>%)#X-*s+*f%g-OD>s%R8BLD6jr*GkUt>zREl8Uf!u%UT@yP zp7nRd(DNwwRo+?m^3K%qj*lnq<<+0PqbGRotGx5><(+Hg9gP~wYYwt%3#+OXZ9sZa ze%>keYyl6cI)QP^fAn-hj=fd{k$zM>-F1H?m2QyJ^p0E8)Vn|NINLqaoG3KMWHLQz zO;hi+#PfUiNOP*u^kAUcmZsj>hzAz$k>*UJIX;0(pR}W?_YvX=&3mLd*KBhZxe81WU<<@36>qFdPOErMIagB>5TI#6JG0#k#^Zy z>Gt+&%28SIIN|!L9)BCw!LT#$^@S%a)gCPh#dltHL_y^DQ3y;YXP#lD5tXmj7x^I- zaNE43sK_^Fe?YXz-uu*{5b^tF?S~-`_Dz@DV9h?g_mdUHB7SQyvQeEf4Vqs+QH85e z-8lv0%O^p0NjKSJLkEW^+oK)g8Mqpv0Y$MyaIQ1MVvzx$dP^n92*2N6pUqkPb={Sg zm9qXnA$*)+?WP(|BrLPSlc{elxs=QFLKB{o!^=&!f3p*fFFF}=l?E0tBV!L!#-5># z8ZfGN5c2y(dy@0#r-0+la8c z{77B`_stK$L4v?g|p2n0HbrSrT zRd#T0aXzU30Q&55YTd9nsg7mGPwFZYA!qrWZ#Fp|(=|V=mxk1KnBVq33>NZPeo)EK z87?wLqPkuk-3J#zjvpgd96XVq31WO}(tac$fBPvqZ2M_|pXe$`v;3%WPJ*9Q%gTF6 z`B~xe!s0~s3QVod@}njhT96iEvH{glLa9~i>@WQP`t`>*M^CRa{yX8nH~jZ~ zCA@s$AC~cA%f?_o{y$Jl0|XQR000O8G@MOTTi2Rs3pM}%BS)7S3jrX1?Ysw2RPEZP z+n@Rg0s@Kzi8hFUk|au&RzS&ufMg|SBxf*yAW@VYRU}Bxxj_k%L1=Q$Ip@qg?LJfI zpE`S{&i?0|si~>mRo@2eUhi7#eV^yPuY0Z4`@N#P)MY$MJOl!9`SGKNN(jXHCoKLD;UQ&)c=T5LPn0n{V(j0H%pzo1t{nDsE8L#_s3$-B#y>_W z=F0o^D^8b4AIS~O?KK=YdTqV9OJ2-fmEg5qx;JdsA;K*mxfkbuwn{T{dUEtP9Li_P z3`$=JUeBk@ep zt5~KB?Y5V$k|Aoukp8UF*+xMe^P*qhGzEXbn*Iz_7H z=!iHhcI!!LW~gRSl93e~G+o8i2sy3FCJ4JsH-;Lw$K73NO-=L^w40U1#7Jl+z8Kg-4PQSn=aWlT&=z)THQIOS-CpD9(J>}tx&1`^XFkrO9-W4gJ| z#T^}gi}#oGUmk4E3=|mCiMT$+y+T65Z8zI`M=jfArQz4F_88tfEG&<4pC~Hcpz0Py zsAX$K!}9)oi!-yhR((cGP97N^zH=~_h>r}W5#qBPENpCS+;nC*9U7@{@*#%Bmy?#3 ze)K2`rtI~3oWd-hQQwdDtHbK-aZs0YiCz(ZEil}0iFG3JWUO`771T0p2bKQ)`**`F zL8#@{^KGFp>i31k8Xx?#J+Cu0+`Q*M-|Vgosb#3HgsbT+z*JjUWD?VhijH=4tQGa? zR5&a}R1&&jYhCnkzMw;tiu3sosHxeuSSIiN)rvLwxO+&djon>GJG+*)ww~-En1Ael zu|S={Dxt|)pDCtulsS{!l1+n}D==zfWn+U1>C4ux7#|-`k_ss=EyYC^Ta7Hv%=Bca z<-B@@P^b4!Q%-Hq({DhbP#T3McVE<8P*3Yy@*#%PwCMWwI4{Y(v$NC6%4%@Y2cLX- zWo4+yoc!w5$(b3(TJ&^A@>f7T_Z{EC_ZH-oTv=07`NmURM z62eD94{p1jq&-O@V||uu)JBP{d-FHGYL*5s6h#cLIs3ER8?3C$LHwi63(1i>9y=mATI}hr_htBgxn_ zx^r~J;^q7D4O^g(Nv~ZCTex$74srjI7kAP4DB4W|Khf*dC8?7+lAK+O*{*hP% zJg4b7lYT^OtfsB)Ce%SJuel?Pm{WbKft&ZD_FbQjo8@Bn_ms=c7ltccwk}ig;bLo3 zwZuyM`sKal0cESQ>8@m%;^JcHZQatB6Cq-!%-;QZ`o4i7POHNL4vSBJ(XKlNa!H+~ z)?-zNJ4;@0joWYDx)m`ZL_$q% z@#4h`9!l7wrKu@2V~5*+-l|;Oy*!0PQIy~B-@lz(wCHc7dREmZ@s&@nV*|G-X_VbG2 zw^a&zpe92Zr0|fU`{Qpps*m&S=Gq+{9VNza+JdO~3qwleQ@Lpx*v$6VCuoEmuc01F zNSy3Xg=A@#u!l#UN4zROz12wOw$uch>b=N~umwOd!e4dNZTL z!x^QW>3CA?48T=350`T21ntwlO_>Gtr9FATM~L`Avbtuy+qGbys*vajOQ&lw1$K6J=tk!>?dBMroHKCi>cho58-0wPPELE!pQP!t z3kw1k{kdNr_=-BWuxS<(;Ng9&%>Wl7 zJufeBP;;Y|yQ9$ux(h@?vr3JKE9JCHhNCB2duTg<1NFp5R81;`wug|(`@@4%INueR zxmZ5SLYC{KOFzeaZKi%T5k;B0^T*#OKp^lAjs)_d25Cjz_si_&rWf}&reM^J5&N+M zV}&we3W|NPvn?@{A9$+?i6r!h=h?}g?}~Dc4%+i%N6p33qt5RNQH9&}(4_a9c%CrN zii(PVT3T_HD=9LO?D_3XiSArBlXb_(?#McjB{1Eck~WYN6+${A1A{nWm;7&`#d?~( zOFOpN1_wmXb<1p%<>LiyU7EvK>PLS)O_IEftUEvIx4Vr|Fg7q~3>j#P!V_Pjkw?3K>#;u*sT%|KUhZJ-VmATB)RLNrK%_k)hZh~) z+T!9Nu25w2dBcF_=4SBB&O%d+^bE7Qy85PSdY1##$m379JPsF9ZB@c``I&pcrD<2r zKacotKzQo4=Rii>Kz~2=y_e%4aM{_}zC?67fQ}M-X%ryx&?NiN9h!wEc~Ihiu(E3Q zAwb6otRbWZEvssNyWj|tY>{6<-=Er(W8cvt+J1`*zuY%`@Xx6FDry)`9NdX?zc>0nYa^nD+S(-LRC&^ofV0VsG09-+=&&$@a$W&} zvU3%XL!JPtxVarEnYPu|PW7nidK^3I>FbLK3)7Yn0oS`9iy{!~QMmce_nMlT=Gx;k z=5>y}B$MvK_8`4-F+8RKoB($GmV@2p4of9to|>wUg(;chDP9pLn|*$Axbx)C>*8Cah{#A^pA#e{(h(M<_dWOhTw;1wR@Qs>_BS+R zAqoH+dJ_XYcpUfAsv8-9%|d>;oqPU%G#)PQJfI9c}+u6fY5TsWOHs({nBbR!!bUhD}L6%OA_9D*{Gz8NuL2stY$9o>F@MD@~B3MlU z+*=~pYHMoninf4ttJiDr0k9%0V^&K+5)wq*9DxFE-J1O=L%jv z-DMx0Mi9B(UQKHU;H$mWk(7#Ihzapdqb?IZw6Ra2`*+*kS-Cg@{(T6zm78Xa}+p_>($>Xn?Lg0J~1~c|{6wvJk6* ze8WWd&88(-++n+pcwv{W+FE_sBY^Pc`g&t)s|6;d4M^92pben6BTfJVr3A|d+q~Dw ziJU1bD{}>}KHL#;-Nu5nPL3|@-0O6UuB@l0rwA5jcXt}|v94kJMt&6lP906kkv$8BsE z$3mUzq{`EOsMB7*zA!thnk*e&GU|E<7BSj5;b1C643Flnpy1(j(LAS>J2!cooY#F7p~!^g*m@`E_=40i)~D)#h2SoaxB9Av0$ z0RaJP^iD6#^78UB9nYvf_zQKXA!0PF)E7L>Ak=I=JqzL>u*y`ii<1u<+(dxtiiv!b-Caf z@NuwF9bL^Ijs$qaMb=tyJ-)r1pP)ja+&!-PG4V!ngU@J5D7$SEL{y5=<9!q ziAm3LTpPtw#m2@4{4d5xB_$;VDzUi-dPui_!Vx${&Pt=qcBbw<2{hsm+HDWWF=jRu&yRS-r z#bfdt!X_SC8>$H(h*&OO$Y~XpOa9R#lkT+8VT}q%7!d3P8n}j2latjoH6yp%t%pnV zpxkZCV9Lc#_mhejL{F++cOa>#6vcpqSoWm%IE{Jqm00U$wfAOe&OFL>Pvqw2wjQk< zC^S`GIZ=?7HiM#8^*TL1V2})4-`zcb-RaXU5(HWSL}C2f=JVze6fKa0*7CJ=tS*<$ zCA74*@|<`{buH~s@mb7wCAUB<6oE6<(t>_rpr>CQMaPDQe!(nEKW-Wt65``i#SM*) z{vID$r+cy8kt}-l(v}TazBa&v$O+pY3Ja7AmXqX z780TWbW2T5Jy>jc1Vy5$skvk?sG!gR%jg9Vw)q?72YJ=m#YH7Y2TSCzX+TiWNniEp zPP@>WU$uNqTMVz;$xdJO{$v0Yh=hbh6FNUXpOVK!5hMrN(;Pgh8luX<)?Cq(OP{}T z(g!ps&C`26dgNDZVQI;h!;9U2G$nNk;+Sa*ME?E7jGV$ANHAtCNs>XZp0ULme`p;* zFJMIy5PI8dVXWE@o|or34ZRX@^CA=!SUIgMHP1g>dbPqQXO|< zV&V!NUCv5)bhJ88JsG`FPV%z>95xR;BpHW}mXd#vzyDQK zJc+Dld6U1tJlLA+5Q7u|Ub#8b;nRZ2=qNJxl7 zqwtYc%sm^uhYz7WnXs{bsV~P17I9D~I5;?`>M)&JTV7Unduz*o&fflb=oDcXbORO* z?dpJ0VdK7pv=@voKCUO%H4#@%Na4i>{o)xANNB1>Ib5W4`3o^#US3RHG`F#T78x~l zW)YYQH%6{Q?99FMkZU<+_r-K$s4WIO7~)UK%L$bFC@i;Lh{@tVSU!ajDwtb)1swJ9 z5h0!Ea3RyC-Wa)muDi|IDL!&?YN{xVLrTkk5baj78?rg#G-i4Q_E;ntM2VGv3OGyh zLF_dY@c*IQ7Z1SCwq4N~8F$pEz7$rY|B_L~UMV|0=bnWU2k)1%ZK>WExE4S zR0J1S-h>lRM(TR9430O3GRP&Zz?2rv=vBWsW%Kg#D*OF^RRSOR5R%GF`aXo7nfnS zW=Xq!Mx3xlCjY22!&Ws7cxh-wC*%vzI#u)Lj*c~Jr%-Y30^BlQR#w^UZ0(BO?F9^Y zQiL#Ke3rYh;7#sVYhdzZ_dtsW_3Jf?%#uZ#5sG2La->JO!k9qK z932s49pv(9C$R%NCJ4}9r`OPo;Hx_M22B8eK8A)E>r_UMT6cHsdO5Dd^gdV-y)NKq zzUWKm`2l}(QnOPnb>s~1={1-DEnh;KkDos2>**;eD+9Gow-wm>&q2>(y1HPlN?=W1 z)V_-r{cZ!~j>3hcz#tV|_v=^l>klaYQPIpR43b)Fu}oQg`w^LYQ_Wy;~RdF!f! z6#3K)pfP*^VseLmnn1EG7?xR z>X*U=q>;w80R>t~F+F(X3jtmS4h$@RtljcM4-dCdYd?5#1D%&UG|B${KDPD-TM z4*42{&UR&x7gGZ{DPF+t*LK7!IO!lb(*E2RgMCi~Le2n?HR9pOPFB#0)u)H%ii+5a zl+$Kk##-+jUM?tXyuS5u_vM2FuM?QNBDp~VJX6r)!Ob8l{!$En_+R2=hE}kDV^}Q_ zx81P4p5~zt1J0s?0vS0u5Hc(1Y5-J*2GK;1UG*}3Bcqhq*x2f7FTjf;%?4U^Gcz*? zI53Z^D=Q-vPSygAUqqDBZ(e*mkrX0IDdy>pNs$8_Lj%MBq~jssjJWiF1$HJ$@mus` zf$z(gFN|`nyy2mtojJPI05`>dCY_Vm8yneLrh|nGCr$#k(|-F)p_)F0@W$!e&pJ9f zB)4RvxQ&D3<40g&xw*K21jxa+EM|<_Vo3eJ%ylGo0IZKzmVNq!0r&^y(@v}LzC=<} zTZ^R%tb@Re!TDA~xH{1#RBZC`@xflb1Vug;TC22!Q^F@__xARN^{705T+B%MBn3ts z_30A{35mX7fISQbBC1j8Yy;r=>{)-Tb(Mh2=JXL=`>$U{urW{|3k%E7pFcO#!**Yy zzm9Rr$iO5+=}t~g7QR1PSXfX=e`*Tk1XVuju{Q!R2+$nWemVxVAVuea4X@qZ-N`bM zfbyP< z`y?|fhCv}yS9GY=p+d%P+lT3?acGx!!@*TnR^C=gw-_$%Y-!1Vc#FH@((**&0 zwmlv|>@F~s_}hzR6&2<|VD3$QeQKhohP%rHM5h+kpO=XZo`jBqp274(1b;Aku`}&S zQe~wurlIb$JF9NhF?w%w>dpnlfv_$9R&VbM*K?8~I7&Ty_|oXUq3W?**!_e3z3Q_O zw40O5oHua|OtHOxD_OH|+&rY$FaE2zug>Tbf2kz&J;vTKhO8zR%XbNRm4pOHQFcxq z5l$>lMw)pok>#ya?Mr;cODc{0t=-*E!68@Jvx!9aKkHU|&J6rD{sMdHBF+BxG*!w% zN8ows@$Y~C&t4#zWHM7JvYGnjzj{tlecf)|@bxEx&l5L)l})c0kn%nM@e2Fz8&yzj z{;O{WCU2g{mFEhl5?6h}Yu24M&yL_Ujx#_!wQUXkk0UGNC)^7S4JCTUee>owS+{dP zSZzN3rD%nlukaP;U}|IB%OCNXSe^^fjH8UdPHcY*_%bOesc19*p6d6KOP@b}N{#&L z1C?0T!A|6V7B;Ly29TWl$VX*zMWi5+umt?jg9l zhX9KOclY3KgA*V)VS(VT!2$#b7G!Y`A;Ad}eDR=r_kZ82TlL=O+syQISIw8{KIinW z>-pdpQ1UiKW`fnAAFX0jB(KWdohS%G*4hPI4DCgrIUmt)6~zCbNuxFo!}@1ue*opt z%Q=j%?c91uz~G;D%Kqz0r&c_20of($+sp0l#Kf@9bh~YMJ*-CYgK=rt!#|K+N!Z6M z;mvtAH?6D{Qw?=>6bdR@=`h^rDK}iFeS5+XDK)j@%z(VB;K^kXT{p}|3}#7nA3 z-)@bB1fe!}*8ctx2??mPl{|CnOjs5Ah#BWP#L ztdW6SHs!DULcT~2cRR6BbyZcCzClZiPEY9JlrBtAkoOGk)85+T>A}9SCUj^|_M#@> z>fpyykATVdl5Tq0?8wMxqk|c}F0Na3$9D@QIrVSnNcxpXCdNLE z-Y-S%FG!b$f`Vd<=OLN0%f6}Z2hLz?fE*@}BB>&ItE5ERw^d{iMGuh4tZ%WS@J8;t zi-#&m1%wZg{5%f)>qo9=r#HQ@USDWmcVS|zMFl%f$n6p>3Xf?3M#EjS_`0wk+yJX)Y}7jgtnK5Ot+ z+xlIXl4!EVV@39t`$p930~D5y(~OT}U}(7X$q*^Qu%t&(?;IWcrgj{9BRA@x?L6Z{ zdaI>#o-fgff=5z^d9V)uko55f{h83b1>UW)zo?kEk&R*z;j;B@zdI_+RefDESZDhW zI>WnSK6zn!TcWsI_ccj4|5}~o zkA&Qyp`WETd)wKwjB3FMSeVrvyk@#6^Km;Y)Hl{5&we$Y+^(DYlf6s(@L_br1W=Utl$DhwAf)Yog?_vzV?)L- zpjqDq=?C6<2N%kF|M<5-#Xl+P{aG_5!;mdc0(d(9Br=Iv*aX)5^@}A#91@UQd&*lg zA{jJDF|a}(l$b5%ONb)!3S7Gt2hLo1*}M@NS$JM?AVJ7HmL_y*%mN~%|BOJifzvplr}^^AMxxm&$wPfyku{cpO)%);L&iBgKJ zvp+A-d?Sf%gcnIL<{lhOMY#1xXt{c=(Y|Jleb)qbc3}Q{l&H?fp{2BroMHqO1(W%k8ql_cKTe>Ew!?5I z%fO_^m-bF~gbLj27yJoDyC7DG_Rd`G1*)THjE~4j$M@6+`afbfcqY!$XhVmIPU0XY~R1RBgKz ztZyv|_4M=%w_$~DW*uI3_J$y$^lk2G^ih&Ee3rnzF1AH9%#}2DR=+*`YsTKx$ufUC z5sCTRDy1SCx)3j#o9EbITT)ragn0&XDWI?WHxI|Q!fV*7`qi^wxpzg4LT)8W^aK-; zp^A!Vic^9gKVTi`=#bD?(l)A%oV_}dvfYO-N1oL-8nbE@c!uyW7|UT+*;Yk94B7ys zdzGzSYcmwU{QX;nW!9->aUzq|G~d%Y>*l}+LU@?(TO7EOCn6j9$-qm9;)eeRijfWycKxg&59<_%SE+i z(E-Wq^U&REPA2Xdy2X;F3q|)+ywpD1K!5e{!>1ifj@iw0etDdYy~;DL6p(fbY^*A; zu6DBBMw_$rlCcD{-Jtt+RhP3&W|CHzw6jMQWt5hb+%XKPYijx%1<4s>GNFK|U-9ar zSb(BFa-7N17hG5cbF|QV2Ze-$xP2ZBlf!;1pleOzm48q6mH!0??dI{JgoxBCr7tw% zV{5C&b*-W-1Of?@14*B10WtHGEGeUkNhzC~??g|%Rvvzxp4`r~=a7<; z4)GxgsHEhhv$HHuPxV++m@|oWs4^zz=Ft08jReY;arDy`6;{!c9bzEoFtmTblS1svZhD3~XPX{gyD zRmoSc>hXSXx!3)+Ed4UhfM$|uVNBT~8^A*!RkX3Ol+FEla=!_eNLvL(EY4`A#Q|oM zM!}0s&w@gzY7QlQPxn3Va(AdG?Ue;)I01~)>?;MiGbF&?!NI1k?=Rm|nSVt~L2YfV z02xt6swF*sZM(0Z8xVeYyF#nnb>-{p$;Yc+pR7ynW*TGU*)dC=firV`d*NU*`z10m zGCVw7bxwat{>vWHNsDN=Rntk&&}$S)?>I&w$9sKMEc|uN)?5>T!l``_mRgvWCa2EB z$oPG#;1Oc_cszX;k8N8P*L5$!C|-NcI07?=QT2p)*)HWq0ts4S-%ApxD2Wx`sNMy8P-T%#?;9Hg?U@MJ$2ORrPEGe$C)4f8qm^ z&VTW`+uhwAaliPW;&^g$6zvZeZIB5k?a=>o6L*hfWXkY)d+q@B;k}D$5d(juL;j)I z5}-CoirgPs03Csya#DQ@PuCyL^W>>r3B$}nZqBZg)HXXE;IkeFh^)Pj(VvQOs{+)A z4GfwH`V|jI`{r6-Ao_g{|85Odu@lq&#R`>@>V8q1hFqGDX6A)QjKbiJ@bhyVTmyM~ zHQG*0$e@p0{=HK}XU*|AG+ZEe=XxE&rXQ8p}R7*NVas3Ly?mf zOA|1k2IJ>!h{+yRUL`dl2 z=}U8Tipa{NHlwDYb9ZvY;dMRQJPcv;^qx0ml^_zMfKVPc-19H*6T z4SrL0ajCSt4UJ?F7=#UTL)0aWB>Uy)KdhN+^U#+U1t>2nzuXO!TqX;Cyz?C`>w0(y zy*Av`n+%El^3+w{aeM7gM_7PVq3l~WHa1iMzvE>}l+EX?l2NFrUbCj7%bj~xC1*TU z?q;P$MPL1nog|W@N=r+VAdaI{AgvwU=OhP^%9}_|jJ;S_lD)(>a`S;6FmIA1qEz_b ziXROZqO&S^KeDE&>1=E@J?~(C;7?S2)&p5~85m*xa>d$qfx8{x;=$XGq14g%CHx$C zmbOck==L#DWB;`kVZf%EL|mU7dtoL{MpjKt&E((2D^n7*QM25l>QWK}Rt-rptpN)& ziylH!S6&UDHcgQ6QRLcGr|}~KA+6{i9i)zPx<~)>Z~;*&apdtp?7uXd((51~MqEAK zV{-}K`hntz|MBw)IkcR7P}h~|p{5q79gwDm4U+u2?QCvt7MmnY&bgL3Mg?UpVOU#P z@g23@!(E4)t$ta%PA5A5C5RSy?f>6!5ljaj^=M zmJQM6JIY6Q29;e*|Cqt-iH3ZqWsAcfi9?#~trhPR5|AN>f`WpQhqhhul{_H7l{3FE zd!2;%!WrLYvz?MVX8!R6&74Z<*}nPJ?Zw`Kq#Nv>s_9`-83Thvt~WNWmDh`KOz`|N zg!7Hj>B{IoWehK!ldoP9s5M!5JQ*n|1Q^!%D&gn5Veklp&8x$oTU%QKCka|9+uPgR z{w3+@6_Rrl?rUYKiOtR~PPc$h_vzkr{CesKxDU1DD(X0?tH@^uft`X*%BwL`@kO+1W?>N2@hSQ3mToyg_sPEIV6A zu8OwI86xNnNH*BF>&N?>)zz1Y2?_kYHe|@}i{irdimS7;(>CslYTXx`TP`ESH);b6 zJuGiaS9`=MKxKzEr6YiZs2H-?(<*1X3IFaq7{MV%JyrNvP+vMVEL z)tFmOL?h5XbA|4}dCLkh>K#lufp1hS_j^}{Ele8W5t0HgYwrSDcHX2jCxsthDvN=h z&8n7sSg*l@AdO0P*`Lo(3@t1Wu*mW<%H)El_^dpp$j{5H*|g#3aJI$9_lbynb!bjb zHPkbIgOLaz(*AY6K+=Byq^3^h!FJpYEo^n{_hzUQLR2a~`Dh%~O;~ZrOaFM@x9$ym z|5^2l)zlsje^@A?pL$%1XqiIv7NL1!b@IG|C|!daG*R_U4N;kOI!Cv9Nq{$z=Ku?1 ziF=&n$DW`3wEpB1&uE^Bv1JkXLEX^#=5aCLs*4U_9tIdrs8qw?UpddQgys#NyYmbC z6cYCk0&m`WJBF<>*Pa`{e^s|F7!-_;RCk)CkUlzYBV;e@lkxHK!?jFrl=JAt z3nqt+=W&+8TIlXc(ch+n*T7CNrje9^2YZymdVrUb%7r0mKx-U7<*qo{9?G)mN!%0*nC8beOl-;Yi*M#~nUc4xJjDWx8YC($8i!eYs z;PpncvG87C^E}K!j9fpF;B8Rw-1|~Xd%y|%zVUs!FAql4{=pdH;TA(gq@v>&UT_Om z_94|mx^vbr%l7#g4pGv^Wc@KB$ZCACW3NytlH6FAQ@QK6_x8^Q635p^sN_f`biMYh zFO_@iDeh3d90cMIY(gq_KR=sKw&$lQODlGrsC;5@x3Xv{>B%EOYYRp$Uy)iMp!M2X zJgrfdJIKDl4333`1&6y$cgOg1s;W^50Xp+DbsQ}WX)+M!qse}^iJ&SJvVBB{8q!I49$snc8-`)HV?Ujs`f(Cc&sL6s@3Z%j~k^Ug^- zKhTcc3@6=JXZLz~RAF)BY=DvZOTO}9T(O8Yt|jPtdSc)|xK-wlsVV&Hv(Op#k*g%a zqbPR0C8;7UG7B_^tR~CPNaEZY!a8xWiA-IW;l6kEPwuVY^?ZNbX0)Nq!xbV_{@?nx z+!Ww`d7AXpJ&TOD+$baV+{!*%r?f~DOaydM)6E9u?~5}^;xj5sYy$}mq=xe^DxSa> z4+wmRE5x+&?fykH%sf2cIfIYbg}CNN`t%0NURVcal&6|@R*cH)H)~n99?hw_|IYrv zMBLX_xE-)glXrz<8y5>pO^$mLaLFnAYz|4MC@uxJhH3c1z+muPn%2Jkk<_*1W9-JR znb<$|2vIvDA-~3;10dq*$$^@hy5u1kMfFccMq6+#6EK_;I^AOAb&tMt(s6=a z#cTFqnrb%YMv*I9K5Eh@1xf&SyJr_R2Sa{U$w@Qa8>C;RM%g0Kl zC^$xh@{$?RuR6t^ySRpY`JPvt8`BM2cot7`dT#gSBG%l;w;d5hP=<{8>dGe*&LgK7oxa2ljZPzb~2W&3%T{`meDMXj%HSP1*?&)2Fh&R{q0mn!pzT3u+_+rEb z&wcF?NWJd_*1|X+XJ-TN<$Bq`V+w#Ib72*BP4F-mQONPtVVHhU167Es_EX5vRIOmk zKKFBe?&CKup^1l{E8ZuHo>#-znApQ26yz23yRvf*wzkw16lu*vrrWMW6VT?yrVf)u zk<}b#rRkyRUQCMXLxa1Q!lX>R#NIUV3-C8Z(=Iv@(2d z##$~eFBL(n0TJ-u{yja_92^EeOEibA0mN4yvGvJ6M?SW0URbOlz_%Fxltm#1a%YmNF4?TwV-VP(3I^EeR>tU9h&8E@bI z%z_5~yUnMj(F9}nuut(2kQ4#4jw4l~#upx{M`;vBMn)Dr>aIMN6Xu;?slO`7&l`u@BBc4>q)D53jVAQGqw6hw(CqV_*`04PWVm0tb73y%NW9rXOa z$1D&Klpq^jzHvg~KoIp@I STo4s>CmTeF;avFN%l`+rx;51R delta 103061 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≫mt()6o0C>j?`t1O8)^hj^@=$r5FmsYSlM^$jiB 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 Date: Tue, 15 Feb 2022 14:51:12 -0600 Subject: [PATCH 15/15] Update BronkOpeningWindow.mlapp --- BF_Functions/BronkOpeningWindow.mlapp | Bin 107085 -> 107710 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/BF_Functions/BronkOpeningWindow.mlapp b/BF_Functions/BronkOpeningWindow.mlapp index 5291921d205a4cf3ef4702d401c4d6044cb283ae..910f5e65492610d910f319305408fe499da22ca9 100644 GIT binary patch delta 105036 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 AdH?_b