%% CALLED BY par4GblFnc8c.m %% function [Tmpsbdg2, scanIntens, F_spots, bmtp, optomizedPos, TmpexpScanIntens2, TmpFexpScanSpots2, TmpFexpScanBMtp2, TmpanlZoneRefs2,areaOfIntensAboveBG]= ... NIscanIntensBGpar4GblFnc(Fflg, tifFileLst, ImParMat,PTmapPos,optCirMask,diaExt,doCircle,cirPixA,numRows,numCols,ImHeigth,ImWidth,cirMask, ... tptLength,selScan,Empsc,~, ~, ~, ~,resDir, Tmpsbdg1) global ExpOutmat global CSrchRng %*************************************************************** searchIntens=[]; intensMax=[]; detMaxPos=[]; scIntens=[]; areaOfIntensAboveBG=[]; BkgrdMat=[]; if Fflg==1 %*****PreAllocation ***** tPtLength=length(tifFileLst); optomizedPos= cell(24,16,tPtLength); F_spots=cell(24,16,tPtLength); %Foto spot coordinates Preallocation bmtp=zeros(24,16,tPtLength); %Added/used for FOTOS Preallocation MPnum=ImParMat(1); destPerMP=ImParMat(2); spotThres=ImParMat(4)/100; %width=ImParMat(5); CSrchRng = ImParMat(12); width=24; %absolute fixed after Sept 2014 ditherF=ImParMat(6); ditherF=1; %absolute fixed after Sept 2014 %Get PTmap data (detPos) and create PTimage with cirMask 2019_0904 PTmapOnesDbl= zeros(2075,1400); for r=1:24 for c=1:16 [PTrefPt]=PTmapPos{r,c}; PTrefPtR=PTrefPt(1); PTrefPtC=PTrefPt(2); %******* doCircle PTmapOnesDbl(PTrefPtR:(PTrefPtR+(diaExt-1)),PTrefPtC:(PTrefPtC+(diaExt-1)))=optCirMask; end end %********************************************************************* end %if Fflg==1 %******* Zeroth Initial Search Parameters***************************************** rRangeUpper=-12; rRangeLower=12; cRangeLower=-12; cRangeUpper=12; ditherI= width/3; %8; %***************************************** searchRange= floor(width*0.75); %generally -/+18 %searchRange=CSrchRng rCRangeUpper= -searchRange; % -12 % -8; %Ranges should be multiples of dither rCRangeLower= searchRange; %12; %Ranges should be multiples of dither cCRangeLower= -searchRange; %-12 %-8; %-12; %Ranges should be multiples of dither cCRangeUpper= searchRange; %12; %8; %Ranges should be multiples of dither ditherC= floor((2*searchRange)/9); %gnerally /6 0r /9 -> dither=6 or 4 pixels if ditherC==0, ditherC=1;end %********************************************************************* % rFRangeUpper= -floor(1/2*width); %(searchRange*2/3) %-12 % -8; %Ranges should be multiples of dither rFRangeLower= floor(1/2*width); %(searchRange*2/3); %12; %Ranges should be multiples of dither cFRangeLower= -floor(1/2*width); %(searchRange*2/3); %-12 %-8; %-12; %Ranges should be multiples of dither cFRangeUpper= floor(1/2*width); %(searchRange*2/3) %12; %8; %Ranges should be multiples of dither ditherF=1; % %********************************************************* %********************************************************* %The purpose is to reduce incidence of 'chasing' scratches and abrasions to %the edge of a frame and also to limit late timept finds of overgrown %spot(that are yet small). The idea is to make the threshold high enough to %prevent the tracking of scratches and small contaminants(overgrowth) while %not limiting detection of small slow grow cultures. Recommend value %slightly above the expected background level. noSpotThres=60; %If PixelIntensity for area < area*this, use the Orig.search Refpt if doCircle==1 noSpot= cirPixA*noSpotThres; else noSpot= (width^2)*noSpotThres; %Area * (a selected background pixel level i.e., 70) end %*************************************************************** %********************************************************** %Begin Time series loop %preallocation stopSearch=zeros(numRows,numCols); %set all spots 'stopSearch' to false intens=zeros(24,16); intensPrev=zeros(24,16); cent = cell(24,16); BGTav=zeros(numRows,numCols); BGthres(1:numRows,1:numCols)= 95; %70;before incr.to95 to accommodate dark media %50forEpson;%Initialize for first tPt run *****************************************************<< if length(tifFileLst) >2 %**************************************************************************** %******Determine a good Plate Image from all the timepoints to use for Registration %Plate Intensity curve over time points %clear plateImage plateImage= {}; % { %******Version compatability fixes*******assoc'd with diff and solve %{ v11a='7.12.0.635 (R2011a)'; v14a='8.3.0.532 (R2014a)'; %v14b='8.4.0.150421 (R2014b)'; v18a='9.4.0.813654 (R2018a)'; v18b='9.5.0.944444 (R2018b)'; pool= 2; if isequal(v11a,version)|| isequal(v14a,version) if matlabpool('size')==0 matlabpool(pool) end else if parpool('local')==0 parpool('local', pool) end end %} %parfor iii=1:length(tifFileLst) for iii=1:length(tifFileLst) %tifFileLst %asdf tifFile= char(tifFileLst(iii)); fullplt= imread(tifFile); %Ncode actually reading a .bmp file for Ncode fullpl= 255 - fullplt(:,:,1); %fullpl= (fullplt(1:ImHeigth,1:ImWidth)); pltInts(iii)= sum(sum(fullpl(:,:)))/(ImHeigth*ImWidth); plateImage{iii}= fullpl; %190919 to use instead of re-reading in NIscanIntensBG.m end guessOffsetAdj= 0.5; %Half(0.5) is the midpoint intensity guessOffset= (max(pltInts)- min(pltInts)) * guessOffsetAdj; %Could plug-in a curvefit routine to determine an 'L' value guessVal = max(pltInts)- guessOffset; guesTpt= find(pltInts > guessVal,1,'first'); if isempty(guesTpt) guesTpt= 1; end %************************************************************************** PtptIm= tifFileLst(guesTpt); PtptImg= char(tifFileLst(guesTpt)); ImageRd= imread(PtptImg); %Ncode actually reading a .bmp file for Ncode PltImg= (ImageRd(1:ImHeigth,1:ImWidth)); PltImg= 255 - PltImg; %Convert to image to BW then AND with PTmapOnesDbl GraythrShift= 1; BWimage= im2bw(PltImg, GraythrShift*graythresh(PltImg)); matchAnded= BWimage & PTmapOnesDbl; initPTANDed= matchAnded; ANDValInitPT=sum(sum(initPTANDed(:,:))); %******************************************************************* %*********Begin Image Registration for Pintool***************************** %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MaxANDVal= 0; %sum(sum(BWimage(:,:))); %seed MaxANDVal from the BWimage regDith= 4; TestmapOnesDbl= zeros(2075,1400); %##################################################################### %Create a Search Range centered on C==1 and R==1 of the PinTool map RtopBndry= 96; RbotBndry= 176; ClfBndry = 96; CrtBndry= 154; [PTrefPt]=PTmapPos{1,1}; PTrefPtR=PTrefPt(1); PTrefPtC=PTrefPt(2); rngUpper= RtopBndry - PTrefPtR; quotT= round(abs(rngUpper)/regDith); topRang= regDith * quotT; if rngUpper<0, topRang= -1*topRang; end rngLower= RbotBndry - PTrefPtR; quotB= round(abs(rngLower)/regDith); botRang= regDith * quotB; if rngLower<0, botRang= -1*botRang; end %----------------------------- rngLeft= ClfBndry - PTrefPtC; quotLf= round(abs(rngLeft)/regDith); leftRang= regDith * quotLf; if rngLeft<0, leftRang= -1*leftRang; end rngRight= CrtBndry - PTrefPtC; quotRt= round(abs(rngRight)/regDith); rightRang= regDith * quotRt; if rngRight<0, rightRang= -1*rightRang; end %######################################################################### %*************Orthagonal Registration ************************ testPos = cell(24,16); for shiftPosR= topRang:regDith:botRang for shiftPosC=leftRang:regDith:rightRang TestmapOnesDbl= zeros(2075,1400); for r=1:24 for c=1:16 [PTrefPt]=PTmapPos{r,c}; testPosR= PTrefPt(1) + shiftPosR; testPosC= PTrefPt(2) + shiftPosC; a=[testPosR,testPosC]; %testPos(r,c)= {testPosR,testPosC}; testPos(r,c)={a}; %******* doCircle TestmapOnesDbl(testPosR:(testPosR+(diaExt-1)),testPosC:(testPosC+(diaExt-1)))= cirMask; %optCirMask; end end GraythrShift= 1.0; BWtestimage= im2bw(TestmapOnesDbl, GraythrShift*graythresh(TestmapOnesDbl)); matchAnded= BWimage & BWtestimage; ANDVal=sum(sum(matchAnded(:,:))); if ANDVal> MaxANDVal MaxANDVal= ANDVal; MaxPos= testPos; MaxPosDbl= TestmapOnesDbl; end end end if MaxANDVal> ANDValInitPT MaxPosDbl= MaxPosDbl; MaxPos= MaxPos; else MaxPosDbl= PTmapOnesDbl; MaxPos= PTmapPos; end %*************SKEW Registration******************** testSkPos= MaxPos; MaxANDValSk= 0; %MaxANDVal; skQty= 0.05; regDith=4; for shiftPos= -regDith/2:regDith/2 for k= -5:5 sk= k* skQty; TestmapSkDbl= zeros(2075,1400); for r=1:24 for c=1:16 [skrefPt]=testSkPos{r,c}; testSkPosR= round(skrefPt(1) + (c*sk + shiftPos)); testSkPosC= round(skrefPt(2) + (-r*sk + shiftPos)); a=[testSkPosR,testSkPosC]; %testPos(r,c)= {testPosR,testPosC}; testSkPos(r,c)={a}; %******* doCircle TestmapSkDbl(testSkPosR:(testSkPosR+(diaExt-1)),testSkPosC:(testSkPosC+(diaExt-1)))= cirMask; %optCirMask; end end GraythrShift= 1; BWtestSkimage= im2bw(TestmapSkDbl, GraythrShift*graythresh(TestmapSkDbl)); matchAndedSk= BWimage & BWtestSkimage; ANDValSk=sum(sum(matchAndedSk(:,:))); if ANDValSk> MaxANDValSk MaxANDValSk= ANDValSk; MaxPosSk= testSkPos; MaxPosSkDbl= TestmapSkDbl; end end end if MaxANDValSk> MaxANDVal MaxANDVal= MaxANDValSk; MaxPosDbl= MaxPosSkDbl; MaxPos= MaxPosSk; end %----------------------------------------- %*********Center of Area for Final Registration**************************** %Note GraythrShift in NImapPT can be used to a lower or higher 'decider' %and thus effect the centroid(center of area) that this module determines. %GraythrShift= 1.0 normally allowing the Matlab graythresh to calc. the BW decider range= 0; lastDetMaxCentDbl= zeros(2075,1400); lastDetMaxPos= cell(24,16); %*************CIRCLE related************************* for r=1:24 for c=1:16 [refPt]=MaxPos{r,c}; refPtR=refPt(1); refPtC=refPt(2); %>>>>>>>>>>>>>>>>>>>>>>>Calc. Centroid Position of spot>>>>>>>>>>>>>>>>>>>> detPrLo= (MaxPos{r,c}(1)) -(range); detPrHi= (MaxPos{r,c}(1)) + (diaExt+range); detPcLo= (MaxPos{r,c}(2)) -(range); detPcHi= (MaxPos{r,c}(2)) + (diaExt+range); rsum=(sum(BWimage(detPrLo:detPrHi,detPcLo:detPcHi),2)); csum=(sum(BWimage(detPrLo:detPrHi,detPcLo:detPcHi),1)); if sum(rsum)>1 && sum(csum)>1 Rvec = detPrLo:detPrHi; Cvec = detPcLo:detPcHi; centR= round((sum(Rvec .*rsum')) /sum(rsum)); centC= round((sum(Cvec .*csum)) /sum(csum)); aa=[(centR-diaExt/2) (centC-diaExt/2)]; else rsum=(sum(MaxPosDbl(detPrLo:detPrHi,detPcLo:detPcHi),2)); csum=(sum(MaxPosDbl(detPrLo:detPrHi,detPcLo:detPcHi),1)); Rvec = detPrLo:detPrHi; Cvec = detPcLo:detPcHi; centR= round((sum(Rvec .*rsum')) /sum(rsum)); centC= round((sum(Cvec .*csum)) /sum(csum)); %} end aa=[(centR-diaExt/2) (centC-diaExt/2)]; lastDetMaxPos(r,c)={aa}; %**********2nd Recenter Based on Previous ***************************** detPrLo= lastDetMaxPos{r,c}(1) -(range); detPrHi= lastDetMaxPos{r,c}(1) + (diaExt+range); detPcLo= lastDetMaxPos{r,c}(2) -(range); detPcHi= lastDetMaxPos{r,c}(2) + (diaExt+range); rsum=(sum(BWimage(detPrLo:detPrHi,detPcLo:detPcHi),2)); csum=(sum(BWimage(detPrLo:detPrHi,detPcLo:detPcHi),1)); if sum(rsum)>1 && sum(csum)>1 Rvec = detPrLo:detPrHi; Cvec = detPcLo:detPcHi; centR= round((sum(Rvec .*rsum')) /sum(rsum)); centC= round((sum(Cvec .*csum)) /sum(csum)); aa=[(centR-diaExt/2) (centC-diaExt/2)]; else rsum=(sum(MaxPosDbl(detPrLo:detPrHi,detPcLo:detPcHi),2)); csum=(sum(MaxPosDbl(detPrLo:detPrHi,detPcLo:detPcHi),1)); Rvec = detPrLo:detPrHi; Cvec = detPcLo:detPcHi; centR= round((sum(Rvec .*rsum')) /sum(rsum)); centC= round((sum(Cvec .*csum)) /sum(csum)); end aa=[(centR-diaExt/2) (centC-diaExt/2)]; lastDetMaxPos(r,c)={aa}; [CentPt]= lastDetMaxPos{r,c}; CentPtR= CentPt(1); CentPtC= CentPt(2); %******* doCircle lastDetMaxCentDbl(CentPtR:(CentPtR+(diaExt-1)),CentPtC:(CentPtC+(diaExt-1)))= cirMask; %optCirMask; %******************************************************* end %end c end %end r, end for search for maximum intensity spot detection alignment %****************************************** BWtestCentimage= im2bw(lastDetMaxCentDbl, GraythrShift*graythresh(lastDetMaxCentDbl)); matchAndedCent= BWimage & BWtestCentimage; ANDValCent=sum(sum(matchAndedCent(:,:))); if ANDValCent>= MaxANDVal MaxPosDbl= lastDetMaxCentDbl; MaxPos= lastDetMaxPos; %detPos=lastDetMaxPos; end %detPos=lastDetMaxPos; detPos=MaxPos; %conclusion of NIplateImagPTreg******************************************** %**************************************************************************** end %if length(tifFileLst) >2 %************************************************************************* %preallocation for speed on 2019_1121 *** scIntens= zeros(24,16,length(tifFileLst)); BkgrdMat= zeros(24,16,length(tifFileLst)); %areaOfIntensAboveBG= zeros(24,16,length(tifFileLst)); lastDetMaxPos= cell(numRows, numCols); %*********************************************************************************************************************** for tPt=1:length(tifFileLst) tPt; tifFile= char(tifFileLst(tPt)); fullsc= plateImage{tPt}; fIntsc=fullsc; %**********Bad Image Filter Zone *************************** %NORMALLY turned off; This is Hand HARD CODE SPECIFIC to particular ExpJOB specificHardFilterCode=0; if specificHardFilterCode==1 && tPt==1 %Plate scratch filter prototype could be added here fIntsc(:,1105:1190)=uint8(67); %Specific blocking area set to background level here %fIntsc(:,:)=uint8(67); % set entire image to background level if 1.bmp is %bad. This allows acquisiton of the initial "Print Time" from .bmp time stamp. end %************************************************** tp=90; bt=1935; lf=90; rt=1318; blkVal=10; %tp=90; fIntsc(1:tp,:)=uint8(blkVal); %top of blocking frame fIntsc(bt:ImHeigth,:)=uint8(blkVal); %bottom of blocking frame fIntsc(:,1:lf)=uint8(blkVal); %left side of blocking frame fIntsc(:,rt:ImWidth)=uint8(blkVal); %right side of blocking frame bwIntsc= im2bw(fIntsc,80/255); %********************Collect Intensities (Absorbances)************************** %end for search for maximum intensity spot detection alignment if doCircle==1 earlySrc1Thres=.31*cirPixA*255; %Initial search spot det. threshold earlySrc2Thres= spotThres*cirPixA*255; %Course search spot det. threshold definedSpot= (spotThres+.03)*cirPixA*255; %typically .34 ; 20000; %Intensity at which a spot is well defined for a width=24 {formerly20} % 0.5*((width^2 * (255- backgrdPixel)) else earlySrc1Thres=.31*(width^2)*255; %Initial search spot det. threshold earlySrc2Thres= spotThres*(width^2)*255; %Course search spot det. threshold definedSpot= (spotThres+.03)*(width^2)*255; %typically .34 ; 20000; %Intensity at which a spot is well defined for a width=24 {formerly20} % 0.5*((width^2 * (255- backgrdPixel)) end detMaxPos = cell(numRows, numCols); bcent = cell(numRows, numCols); for r=1:numRows for c=1:numCols [refPt]=detPos{r,c}; refPtR=refPt(1); InitR=refPt(1); refPtC=refPt(2); InitC=refPt(2); %*****ZeroSearchIntens **************************************************** %clear ('searchIntens') searchIntens= []; if doCircle==1 % cutout= fIntsc(refPtR+1:(refPtR+(diaExt)),(refPtC+1:(refPtC+diaExt))); cutout= fIntsc(refPtR:(refPtR+(diaExt-1)),refPtC:(refPtC+(diaExt-1))); Imcir= cutout .* uint8(cirMask); zeroSearchIntens=sum(sum(Imcir(1:(diaExt-1),1:(diaExt-1)))); else %standard square analysis area refPtRExt=refPtR+widthEx; if (refPtRExt)> size(fIntsc,1), refPtRExt= size(fIntsc,1); end refPtCExt=refPtC+widthEx; if (refPtCExt)> size(fIntsc,2), refPtCExt= size(fIntsc,2); end zeroSearchIntens=sum(sum(fIntsc(refPtR:(refPtRExt),refPtC:(refPtCExt)))); end %************************************************************************** %clear ('searchIntens') searchIntens= []; intensMax=-1; src1cnt=0; %zero count for oneshot calc of centroid after initial location of spot during Src1 if stopSearch(r,c)==false %*******************Set Range and Dither******************** if intensPrev(r,c)< earlySrc1Thres %First Search parameters insert rRangeUpper=rCRangeUpper; rRangeLower=rCRangeLower; cRangeLower=cCRangeLower; cRangeUpper=cCRangeUpper; dither=ditherI; [searchStartRef]= detPos{r,c}; elseif intensPrev(r,c)> earlySrc1Thres &&intensPrev(r,c)<= earlySrc2Thres %Second Search parameters insert rRangeUpper= -CSrchRng; %rCRangeUpper; rRangeLower= CSrchRng; %rCRangeLower; cRangeLower= -CSrchRng; %cCRangeLower; cRangeUpper= CSrchRng; %cCRangeUpper; dither=ditherC; %src1cnt=src1cnt+1; %After spot defined above selected threshold, start search from %center of the calc'd spot area %Calc. Center of Area (black and white (1's and 0's) %detPrLo= (detPos{r,c}(1)) -18; detPrHi= (detPos{r,c}(1)) +width+18; %detPcLo= (detPos{r,c}(2)) -18; detPcHi= (detPos{r,c}(2)) +width+18; detPrLo= (detPos{r,c}(1)) -CSrchRng; detPrHi= (detPos{r,c}(1)) +width+CSrchRng; %Mod 15_0707 User contrain search detPcLo= (detPos{r,c}(2)) -CSrchRng; detPcHi= (detPos{r,c}(2)) +width+CSrchRng; %Mod 15_0707 User contrain search brsum=(sum(bwIntsc(detPrLo:detPrHi,detPcLo:detPcHi),2)); bcsum=(sum(bwIntsc(detPrLo:detPrHi,detPcLo:detPcHi),1)); bRvec= detPrLo:detPrHi; bCvec= detPcLo:detPcHi; bcentR= round((sum(bRvec .*brsum')) /sum(brsum)); bcentC= round((sum(bCvec .*bcsum)) /sum(bcsum)); bcent{r,c}= [bcentR, bcentC]; cornerOfset= ceil((0.5*width)+CSrchRng); %ceil(0.5*(width+(2*CSrchRng))); refCorner{r,c}= [(bcentR-cornerOfset),(bcentC-cornerOfset)]; %NAN blowup preventive if sum(brsum)>5 && sum(bcsum)>5 %[searchStartRef]= cell2mat(bcent(r,c)); [searchStartRef]= cell2mat(refCorner(r,c)); else [searchStartRef]= detPos{r,c}; end elseif intensPrev(r,c) >earlySrc2Thres && intensPrev(r,c)<= definedSpot rRangeUpper=rFRangeUpper; %Fine Search parameters insert rRangeLower=rFRangeLower; cRangeLower=cFRangeLower; cRangeUpper=cFRangeUpper; dither=ditherF; zz=lastDetMaxPos(r,c); [searchStartRef]= zz{1,1}; end %*******************Fixed to Roam Switch******************** %{ if intensPrev(r,c)<=earlySrc1Thres % [searchRef]= detPos{r,c}+ [rOff,cOff]; [searchStartRef]= detPos{r,c}; end if intensPrev(r,c)> earlySrc1Thres && intensMax= earlySrc2Thres, %Let Roam zz=lastDetMaxPos(r,c); [searchStartRef]= zz{1,1}; end %} %************************************************************* extent=CSrchRng; Rmin=InitR-extent; Rmax=InitR+extent; Cmin=InitC-extent; Cmax=InitC+extent; %clear cutout %just found 20_0327 cutout= []; for rOff=rRangeUpper:dither:rRangeLower for cOff=cRangeLower:dither:cRangeUpper [searchRef]= searchStartRef + [rOff,cOff]; refPtR=searchRef(1); refPtC=searchRef(2); if refPtRRmax,refPtR= Rmax;end if refPtCCmax,refPtC= Cmax;end %******Do Circle analysis****** if doCircle==1 % cutout= fIntsc(refPtR+1:(refPtR+(diaExt)),(refPtC+1:(refPtC+diaExt))); try cutout= fIntsc(refPtR:(refPtR+(diaExt-1)),refPtC:(refPtC+(diaExt-1))); catch tPt; r; c; end Imcir= cutout .* uint8(cirMask); searchIntens=sum(sum(Imcir(1:(diaExt-1),1:(diaExt-1)))); else %standard square analysis area refPtRExt=refPtR+widthEx; if (refPtRExt)> size(fIntsc,1), refPtRExt= size(fIntsc,1); end refPtCExt=refPtC+widthEx; if (refPtCExt)> size(fIntsc,2), refPtCExt= size(fIntsc,2); end searchIntens=sum(sum(fIntsc(refPtR:(refPtRExt),refPtC:(refPtCExt)))); end %**************************************** if searchIntens > intensMax intensMax=searchIntens; intens(r,c)=searchIntens; intensPrev(r,c)=searchIntens; a=[refPtR,refPtC]; detMaxPos(r,c)={a}; lastDetMaxPos(r,c)=detMaxPos(r,c); end if intensMax>definedSpot || intensMax<2 stopSearch(r,c)=true; end end %for cOff end %for rOff if intensMax< noSpot intensMax= zeroSearchIntens; lastDetMaxPos(r,c)= {refPt}; end else %elseif Spot is well defined STOPSearch strong [refPt]=lastDetMaxPos{r,c}; refPtR=refPt(1); refPtC=refPt(2); if doCircle==1 cutout= fIntsc(refPtR:(refPtR+(diaExt-1)),refPtC:(refPtC+(diaExt-1))); Imcir= cutout .* uint8(cirMask); intens(r,c)=sum(sum(Imcir(1:(diaExt-1),1:(diaExt-1)))); else %standard square analysis area intens(r,c)=sum(sum(fIntsc(refPtR:(refPtR+widthEx),refPtC:(refPtC+widthEx)))); end end %stopSearch loop %******************************************************* %{ if intensMax> earlySrc1Thres && intensMax< earlySrc2Thres && src1cnt==0, %{ src1cnt=src1cnt+1; detPrLo= (detPos{r,c}(1)) -12; detPrHi= (detPos{r,c}(1)) +width+12; detPcLo= (detPos{r,c}(2)) -12; detPcHi= (detPos{r,c}(2)) +width+12; rsum=(sum(fIntsc(detPrLo:detPrHi,detPcLo:detPcHi),2)); csum=(sum(fIntsc(detPrLo:detPrHi,detPcLo:detPcHi),1)); Rvec= detPrLo:detPrHi; Cvec= detPcLo:detPcHi; centR= round((sum(Rvec .*rsum')) /sum(rsum)); centC= round((sum(Cvec .*csum)) /sum(csum)); cent{r,c}= [centR, centC]; %} end %} %******************************************************* end %for c end %for r -end for search %**************************************************************************************************************** %[F_spots,bmtp, BGthres,bmm,rwm,lstTpt,BGsc,totBkgrd]= ... % NIgenBkGrdDataPar4Fnc(ImParMat, tifFileLst, lastDetMaxPos, numRows, numCols, fullsc, tPt,BGthres, doCircle, cirPixA,diaExt, cirMask, BGTav); %NIgenBkGrdDataPar4Fnc %function [F_spots,bmtp, BGthres,bmm,rwm,lstTpt,BGsc,totBkgrd ]= ... % NIgenBkGrdDataPar4Fnc(ImParMat, tifFileLst, lastDetMaxPos, numRows, numCols, fullsc, tPt, BGthres, doCircle, cirPixA, diaExt, cirMask, BGTav)% Called by NIscanIntensBG.m % %global resDir global ExpOutmat %global pixsAboveBG MPnum=ImParMat(1); destPerMP=ImParMat(2); spotThres=ImParMat(4)/100; %selScan=ImParMat(4); width=ImParMat(5); dither=ImParMat(6); BGthresInput=ImParMat(3); % a value of percent to be added (20=>1.20*BGTav) lstTpt=length(tifFileLst); LfOffset= 65; %lf; %Ncode TopOffset= 65; %tp; rtLim=1350; %1400; %1350; rtNotchOffset=10; cushion=20; %close2edgeTol=90; botLim= 2003; botNotchOffset=60; %**********Initialize************************** %clear('totBkgrd') %clear('pixsAboveBG') %clear('lineV','pixCnt','lineSum,meanBkgrd') %clear('rw','rwm') totBkgrd= 0; pixsAboveBG= 0; lineV= 0; pixCnt= 0; lineSum= 0; meanBkgrd= 85; rw= 0; rwm= 0; %************************************************* %****Start Generation of BackGround data after the 2nd Row (&& 2nd Col) %*****Optomized spot positions determined. *********** %if r>=2 && c>=2, BGsc=zeros(2075,1400); %Empsc; widthEx=width-1; %width extention from reference point for r=1:numRows for c=1:numCols refP=lastDetMaxPos{r,c}; if r1, refPrR=lastDetMaxPos{r-1,c}; end if c>1, refPrC=lastDetMaxPos{r,c-1}; end %****At least NINE conditions which must be treated differently % ++++++++++ Condition (0) ---most spots fall in this central category if r>1 && r1 && c0 refBG(1)=refP(1)- floor(0.5*(refP(1) - TopOffset)); refBG(2)=refP(2)- floor(0.5*(refP(2) - LfOffset)); %Icode -0 refBG(3)=refP(1)+widthEx+ floor(0.5*((refNxR(1)-(refP(1)+widthEx)))); refBG(4)=refP(2)+widthEx+ floor(0.5*((refNxC(2)-(refP(2)+widthEx)))); detBG(r,c)= {uint8(refBG)}; %Store Background Reference pt data in a Cell %clear('lineV','pixCnt','lineSum') lineV= fullsc(refBG(1),refBG(2):refBG(4)-1); %mean across top rt if tPt==1 || tPt==lstTpt,rw=lineV';end pixCnt(1)=nnz(lineV .* uint8(lineV79 if r==1 && c>1 && c(size(fullsc,2)-close2edgeTol)%if intens area too close to edge if refBGcExt>(rtLim-cushion)%if intens area too close to edge refBG(4)=rtLim-rtNotchOffset; else refBG(4)=refP(2)+widthEx+ floor(0.5*(rtLim-refBGcExt)); end detBG(r,c)= {uint8(refBG)}; %Store Background Reference pt data in a Cell %clear('lineV','pixCnt','lineSum') lineV= fullsc(refBG(1),refBG(2):refBG(4)-1); % across top rt if tPt==1 || tPt==lstTpt,rw=lineV';end pixCnt(1)=nnz(lineV .* uint8(lineV(size(fullsc,2)-close2edgeTol) %if intens area too close to edge if refBGcExt>(rtLim-cushion) %if intens area too close to edge meanBkgrd = (sum(lineSum(1:4)))./ (sum(pixCnt(1:4))); if sum(pixCnt(1:4))==0, meanBkgrd=double(BGthres(r,c));end %meanBkgrd = (lineSum(1)+lineSum(2)+lineSum(4))./ ... %((2*(refBG(4)-refBG(2))+(refBG(3)-refBG(1)))); %divby 2*across+1*down if doCircle==1, totBkgrd(r,c) = meanBkgrd* cirPixA; else totBkgrd(r,c) = meanBkgrd* width^2; end else %clear('lineV') %3 lineV = fullsc(refBG(1):refBG(3)-1,refBG(4)); %mean down rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV];end pixCnt(3)=nnz(lineV .* uint8(lineV47 farRight col edge if r>1 && r(botLim-botNotchOffset)%if intens area not too close to bot edge else refBG(3)=botLim + cushion; else refBG(3)=refP(1)+widthEx+ floor(0.5*(botLim-refBGrExt)); end if refBGcExt>(rtLim- cushion)%if intens area not too close to edge else refBG(4)= rtLim -cushion; else refBG(4)=refP(2)+widthEx+ floor(0.5*(rtLim-refBGcExt)); end detBG(r,c)= {uint8(refBG)}; %Store Background Reference pt data in a Cell %clear('lineV','pixCnt','lineSum') %1 lineV= fullsc(refBG(1),refBG(2):refBG(4)-1); % across top rt if tPt==1 || tPt==lstTpt,rw=lineV';end pixCnt(1)=nnz(lineV .* uint8(lineV(size(fullsc,2)-close2edgeTol)&&... if refBGcExt>(rtLim-cushion)&&... refBGrExt<(botLim-botNotchOffset) %if intens area too close to right edge only %clear('lineV') %4 lineV = fullsc(refBG(3),refBG(2):refBG(4)-1); %mean across bot rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV'];end pixCnt(4)=nnz(lineV .* uint8(lineV(botLim-botNotchOffset) &&... refBGcExt>(rtLim-cushion)%if intens area too close to bottom edge only %clear('lineV') %3 lineV = fullsc(refBG(1):refBG(3)-1,refBG(4)); %mean down rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV];end pixCnt(3)=nnz(lineV .* uint8(lineV(size(fullsc,2)-close2edgeTol)&& ... elseif refBGcExt>(rtLim-cushion)&& ... refBGrExt>(botLim-botNotchOffset) %if intens area too close to both right edge and bottom edge meanBkgrd = (sum(lineSum(1:4)))./ (sum(pixCnt(1:4))); if sum(pixCnt(1:4))==0, meanBkgrd=double(BGthres(r,c));end %meanBkgrd = (lineSum(1)+lineSum(2))./ ... %((refBG(4)-refBG(2)+(refBG(3)-refBG(1)))); %divby 1across+1*down if doCircle==1, totBkgrd(r,c) = meanBkgrd* cirPixA; else totBkgrd(r,c) = meanBkgrd* width^2; end else %clear('lineV') %3 lineV = fullsc(refBG(1):refBG(3)-1,refBG(4)); %mean down rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV];end pixCnt(3)=nnz(lineV .* uint8(lineV1 && c(botLim-botNotchOffset)%if intens area not too close to bot edge else refBG(3)=botLim + cushion; else refBG(3)=refP(1)+widthEx+ floor(0.5*(botLim-refBGrExt)); end if rem(c,numCols)==0 refBG(4)=refP(2)+widthEx+ floor(0.5*(plateEdgeSpace)); else refBG(4)=refP(2)+widthEx+ floor(0.5*(refNxC(2)-(refP(2)+widthEx))); %refBG(4)=refP(2)+widthEx+ floor(0.5*(size(fullsc,2)-refBGcExt)); end detBG(r,c)= {uint8(refBG)}; %Store Background Reference pt data in a Cell %clear('lineV','pixCnt','lineSum') %1 lineV= fullsc(refBG(1),refBG(2):refBG(4)-1); % across top rt if tPt==1 || tPt==lstTpt,rw=lineV';end pixCnt(1)=nnz(lineV .* uint8(lineV(botLim-botNotchOffset) %if intens area too close to bottom edge meanBkgrd = (sum(lineSum(1:4)))./ (sum(pixCnt(1:4))); if sum(pixCnt(1:4))==0, meanBkgrd=double(BGthres(r,c));end %meanBkgrd = (lineSum(1)+lineSum(2)+lineSum(4))./ ... %((refBG(4)-refBG(2)+(2*(refBG(3)-refBG(1))))); %divby 1*across+2*down if doCircle==1, totBkgrd(r,c) = meanBkgrd* cirPixA; else totBkgrd(r,c) = meanBkgrd* width^2; end else %clear('lineV') %4 lineV = fullsc(refBG(3),refBG(2):refBG(4)-1); %mean across bot rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV'];end pixCnt(4)=nnz(lineV .* uint8(lineV(botLim-botNotchOffset)%if intens area not too close to bot edge else refBG(3)=botLim + cushion; else refBG(3)=refP(1)+widthEx+ floor(0.5*(botLim-refBGrExt)); end refBG(4)=refP(2)+widthEx+ floor(0.5*(refNxC(2)-(refP(2)+widthEx))); detBG(r,c)= {uint8(refBG)}; %Store Background Reference pt data in a Cell %clear('lineV','pixCnt','lineSum') %1 lineV= fullsc(refBG(1),refBG(2):refBG(4)-1); % across top rt if tPt==1 || tPt==lstTpt,rw=lineV';end pixCnt(1)=nnz(lineV .* uint8(lineV(botLim-botNotchOffset) %if intens area too close to bottom edge meanBkgrd = (sum(lineSum(1:4)))./ (sum(pixCnt(1:4))); if sum(pixCnt(1:4))==0, meanBkgrd=double(BGthres(r,c));end %meanBkgrd = (lineSum(1)+lineSum(2)+lineSum(3))./ ... %((refBG(4)-refBG(2)+(2*(refBG(3)-refBG(1))))); %divby 1*across+2*down if doCircle==1, totBkgrd(r,c) = meanBkgrd* cirPixA; else totBkgrd(r,c) = meanBkgrd* width^2; end else %clear('lineV') %4 lineV = fullsc(refBG(3),refBG(2):refBG(4)-1); %mean across bot rt if tPt==1 || tPt==lstTpt,rw=[rw;lineV'];end pixCnt(4)=nnz(lineV .* uint8(lineV1 && rBG); %calc non-background within circular analysis area %pixsAboveBG(r,c)=nnz(fullsc(refPtRx:(refPtRx+ (diaExt-1)),refPtCx:(refPtCx+ (diaExt-1)))>BG); %BG); else %standard square analysis area pixsAboveBG(r,c)=nnz(fullsc(refPtRx:(refPtRx+widthEx),refPtCx:(refPtCx+widthEx))>BG); %calc non-background within square analysis area end %--------------------------------------------------------- %TimePT average %meanBGTsum(r,c)=meanBGTsum(r,c)+meanBkgrd; %meanBGTav(r,c)= meanBGTsum(r,c) /tPt; bmm(r,c)=uint8(floor(meanBkgrd)); % For FOTOS only FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F_spots(r,c,tPt)={refBG}; %Foto spot coordinates bmtp(r,c,tPt)=bmm(r,c); %Added/used for FOTOS 11_0830 %FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF %TimePT Average BG intensity calc method BGTav(r,c)=uint8(round((BGTav(r,c)*(tPt-1))+meanBkgrd)/tPt); %BGTav(r,c)=((BGTav(r,c)*(tPt-1))+meanBkgrd)/tPt; %sliding BG average %{ if r==1 && c==1, slavg(1:5)= BG;end %slavg(1:5)= 50; %120620 Epsonvalue is 33; end slavg(5)=slavg(4); slavg(4)=slavg(3); slavg(3)=slavg(2); slavg(2)=slavg(1); slavg(1)=BG; slidingAvg=mean(slavg); %} %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % For Visualization Purposes only %1->2 across rt 1, 2-4 BGsc(refBG(1),refBG(2):refBG(4))=1; %1->4 down lf 1-3, 2 BGsc(refBG(1):refBG(3),refBG(2))=1; %2->3 down rt 1-3, 4 BGsc(refBG(1):refBG(3),refBG(4))=1; %4->3 Bot Across rt 1, 2-4 BGsc(refBG(3),refBG(2):refBG(4))=1; %BGsc(refBG(1):refBG(3),refBG(2):refBG(4)) %just displays matrices end % Outer c (column loop) end % outer r (row loop) BGthres=uint8(double(BGTav) * (1+(BGthresInput/100))); %end % Outer if r>1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %END OF NIgenBkGrdData brought inside for GLOBAL PARALLEL %***************************************************************************************************************** %***************************************************************************************************************** %***************************************************************************************************************** %***************************************************************************************************************** %***************************************************************************************************************** optomizedPos(:,:,tPt)=lastDetMaxPos; %if(isequal(SWsingleSc,1))|| ((~isequal(SWsingleSc,1))&&tPt==tptLength) %190731 change to capture last timePt PTmap if(isequal(SWsingleSc,1)) %if(isequal(SWsingleSc,1))&& (tPt==1 || tPt== guesTpt || tPt==tptLength)|| ((~isequal(SWsingleSc,1))&&tPt==tptLength) %190919 Option for observation %if (tPt==1 || tPt== guesTpt || tPt==tptLength) %190919 Option for observation if (tPt==tptLength) %190919 change to capture ONLY last timePt PTmap %*******************OptmapOnes Empsc; %***********vis************************* %clear OptmapOnes; OptmapOnes= []; %OptmapOnes=Empsc+ 1.4; OptmapOnesDbl=double(Empsc)+ .8; for r=1:numRows for c=1:numCols [refPt]=lastDetMaxPos{r,c}; refPtR=refPt(1); refPtC=refPt(2); if doCircle==1 %OptmapOnesDbl(refPtR:(refPtR+diaExt),refPtC:(refPtC+diaExt))= cirMask; OptmapOnesDbl(refPtR:(refPtR+(diaExt-1)),refPtC:(refPtC+(diaExt-1)))=optCirMask; else refPtRExt=refPtR+widthEx; if (refPtRExt)> size(fullsc,1), refPtRExt= size(fullsc,1); end refPtCExt=refPtC+widthEx; if (refPtCExt)> size(fullsc,2), refPtCExt= size(fullsc,2); end OptmapOnesDbl(refPtR:(refPtRExt),refPtC:(refPtCExt))= 1;%255; end end end %****Cross Optomized Map Matrix onto tifFile Matrix*************** %***********for visualization purposes only!!!!!!!!!!!!!!! if tPt==1,figure;end resIm= uint8((double(BGsc) + OptmapOnesDbl) .* double(fullsc)); %clear('OptmapOnesDbl') OptmapOnesDbl= []; %hres=imagesc(resIm); hfscanIm=imagesc(resIm); hfIm=gcf; haxis=gca; title(strcat('Scan',num2str(selScan),'timePt-',num2str(tPt))); clf(hfscanIm,'reset'); set(hfIm,'NumberTitle','off') set(hfIm,'Name', char(ExpOutmat)) %strcat('EASYconsole- ',char(resDir))) if Fflg==1 resDir; %for debugging fullfile(resDir,'Fotos',strcat('Scan',num2str(selScan),'_timePt-',num2str(tPt))) hgsave(fullfile(resDir,'Fotos',strcat('Scan',num2str(selScan),'_timePt-',num2str(tPt)))); %F 14_0626 else hgsave(fullfile(resDir,'figs',strcat('Scan',num2str(selScan),'_timePt-',num2str(tPt)))); end else selScan; %tifFile end %****************************************************************** BkgrdMat=totBkgrd; %BkgrdMat(:,:,tPt)=totBkgrd; %debug parfor effort areaOfIntensAboveBG(:,:,tPt)= pixsAboveBG; %actual area of growth for each timepoint (used for printout of grArea ?not used in previous analysis) scanIntens(:,:,tPt)= intens-BkgrdMat; %capture first and last background values if tPt==1 bdg(:,:,1)= bmm; bdg(:,:,3)=rwm; Tmpsbdg1={bdg}; end if tPt==lstTpt bdg(:,:,2)= bmm; bdg(:,:,4)=rwm; Tmpsbdg1={bdg}; end %-------------------------------------------------------------------- TmpexpScanIntens1= {scanIntens}; %par4Gbl 20_0122 TmpFexpScanSpots1= {F_spots}; TmpFexpScanBMtp1= {bmtp}; TmpanlZoneRefs1= {optomizedPos}; %added to store tPt by tPt positions TmpexpScanIntens2= TmpexpScanIntens1; TmpFexpScanSpots2= TmpFexpScanSpots1; TmpFexpScanBMtp2= TmpFexpScanBMtp1; TmpanlZoneRefs2= TmpanlZoneRefs1; Tmpsbdg2= Tmpsbdg1; %----------------------------------------------------------- end % end for tifFile for-loop (i.e. timepoint scan)********************************************************************