123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- %% CALLED BY NCfitImCFparforFailGbl2.m %%
- function [resMatStd, resMat, selTimesStd, selIntensStd, FiltTimesELr, NormIntensELr] =...
- NCscurImCF_3parfor(dataMatrix, AUCfinalTime, currSpotArea, sols, bl, minTime)
- % Preallocate
- resMatStd=zeros(1,27);
- resMat=zeros(1,27);
- % Set internal variables sent to matlab fit function
- me=200;
- meL=750;
- mi=25;
- miL=250;
- rmsStg1=0;
- rmsStg1I(1)=0;
- slps=1;
- filterTimes=[];
- normIntens=[];
- nn=1;
- numFitTpts=0;
- % Build filterTimes and normIntens from spot dataMatrix selection codes produced in filter section
- for n=1:size(dataMatrix,2)
- if (((dataMatrix(3,n)==1))||(dataMatrix(3,n)==3)||(dataMatrix(3,n)==2)...
- ||(dataMatrix(3,n)==0))
- filterTimes(nn)=dataMatrix(1,n);
- normIntens(nn)=dataMatrix(4,n);
- nn=nn+1;
- end
- end
- filterTimes=filterTimes';
- selTimesStd=filterTimes;
- normIntens=normIntens';
- selIntensStd=normIntens;
- lastTptUsed=1;
- lastIntensUsed=1;
- thresGT2TmStd=0;
- try
- lastTptUsed=max(filterTimes);
- lastIntensUsed=normIntens(length(normIntens));
- lastIntensUsedStd=lastIntensUsed;
- lastTptUsedStd=lastTptUsed;
- Tpt1Std=filterTimes(1);
- numFitTptsStd=nnz((normIntens(:)>=0)==1);
- thresGT2=find(((normIntens(:)>2)==1), 1);
- if isempty(thresGT2)
- thresGT2TmStd=0;
- else
- thresGT2TmStd=filterTimes(thresGT2);
- end
- numTptsGT2Std=nnz((normIntens(:)>=2)==1); % nnz(filterTimes(find(filterTimes>=thresGT2Tm)));
- K_Guess=max(normIntens);
- numTimePts=length(filterTimes);
- opts=fitoptions('Method','Nonlinear','Robust','On','DiffMinChange',1.0E-11,'DiffMaxChange',0.001,...
- 'MaxFunEvals',me, 'MaxIter', mi, 'TolFun', 1.0E-12, 'TolX', 1.0E-10, 'Lower', [K_Guess*0.5,0,0],...
- 'StartPoint', [K_Guess,filterTimes(floor(numTimePts/2)),0.30], 'Upper', [K_Guess*2.0,max(filterTimes),1.0],'Display','off');
- ftype=fittype('K / (1 + exp(-r* (t - l )))','independent','t','dependent',['K','r','l'],'options',opts);
-
- % Carry out the curve fitting process
- [fitObject, errObj]=fit(filterTimes,normIntens,ftype);
- coeffsArray=coeffvalues(fitObject);
- rmsStg1=errObj.rsquare;
- rmsStg1I(slps)=errObj.rsquare;
- sDat(slps,1)=errObj.rsquare;
- K=coeffsArray(1); sDat(slps,2)=coeffsArray(1); % Carrying Capacity
- l=coeffsArray(2); sDat(slps,3)=coeffsArray(2); % lag time
- r=coeffsArray(3); sDat(slps,4)=coeffsArray(3); % rateS
- % Integrate (from first to last time point)
- numVals=size(filterTimes);
- numVals=numVals(1);
- t_begin=0;
- t_end=AUCfinalTime;
- AUC=(K/r*log(1+exp(-r*(t_end-l)))-K/r*log(exp(-r*(t_end-l)))) - (K/r*log(1+exp(-r*(t_begin-l)))-K/r*log(exp(-r*(t_begin-l))));
- MSR=r;
- rsquare=errObj.rsquare;
- confObj=confint(fitObject,0.9); % get the 90% confidence
- NANcond=0; stdNANcond=0; % stdNANcond added to relay not to attempt ELr as there is no curve to find critical point
- confObj_filtered=confObj;
- Klow=confObj(1,1); sDat(slps,5)=confObj(1,1);
- Kup=confObj(2,1); sDat(slps,6)=confObj(2,1);
- llow=confObj(1,2); sDat(slps,7)=confObj(1,2);
- lup=confObj(2,2); sDat(slps,8)=confObj(2,2);
- rlow=confObj(1,3); sDat(slps,9)=confObj(1,3);
- rup=confObj(2,3); sDat(slps,10)=confObj(2,3);
- if(isnan(Klow)||isnan(Kup)||isnan(llow)||isnan(lup)||isnan(rlow)||isnan(rup))
- NANcond=1; stdNANcond=1; % stdNANcond added to relay not to attempt ELr as there is no curve to find critical point
- end
- catch
- % if no data is given, return zeros
- AUC=0;MSR=0;K=0;r=0;l=0;rsquare=0;Klow=0;Kup=0;
- rlow=0;rup=0;lup=0;llow=0;
- NANcond=1; stdNANcond=1; %stdNANcond added to relay not to attempt ELr as there is no curve to find critical point
- end
- if (exist('K','var')&& exist('r','var') && exist('l','var'))
- t=(0:1:200);
- Growth=K ./ (1 + exp(-r.* (t - l )));
- fitblStd=min(Growth);
- end
-
- cutTm(1:4)=1000; %-1 means cuts not used or NA
-
- % Preserve for ResultsStd
- resMatStd(1)=AUC;
- resMatStd(2)=MSR;
- resMatStd(3)=K;
- resMatStd(4)=r;
- resMatStd(5)=l;
- resMatStd(6)=rsquare;
- resMatStd(7)=Klow;
- resMatStd(8)=Kup;
- resMatStd(9)=rlow;
- resMatStd(10)=rup;
- resMatStd(11)=llow;
- resMatStd(12)=lup;
- resMatStd(13)=currSpotArea;
- resMatStd(14)=lastIntensUsedStd; % filtNormIntens(length(filtNormIntens));
- maxRateTime=0; %[]; %Std shows []; ELr shows 0; %parfor
- resMatStd(15)=0; %maxRateTimestdMeth;
- resMatStd(16)=lastTptUsedStd;
- if isempty(Tpt1Std)
- Tpt1Std=777;
- end
- resMatStd(17)=Tpt1Std;
- resMatStd(18)=bl; % perform in the filter section of NCfitImCFparfor
- resMatStd(19)=fitblStd; % taken from NCfil... and not affected by NCscur...changes
- resMatStd(20)=minTime; % not affected by changes made in NCscur...for refined 'r'
- resMatStd(21)=thresGT2TmStd;
- resMatStd(22)=numFitTptsStd;
- resMatStd(23)=numTptsGT2Std;
- resMatStd(24)=999; % yhe Standard method has no cuts .:.no cutTm
- resMatStd(25)=999;
- resMatStd(26)=999;
- resMatStd(27)=999;
- % ELr New Experimental data through L+deltaS Logistic fit for 'Improved r' Fitting
- FiltTimesELr=[]; %{ii}=filterTimes;
- NormIntensELr=[]; %{ii}=normIntens;
- normIntens=selIntensStd;
- filterTimes=selTimesStd;
- stdIntens=selIntensStd;
- tmpIntens=selIntensStd;
- stdTimes=selTimesStd;
- if stdNANcond==0
- % Determine critical points and offsets for selecting Core Data based on
- % Standard curve fit run. Put diff into NImStartupImCF02.m calling source
- % to reduce repeated execution since it doesn't change.
- % fd4=diff(sym('K / (1 + exp(-r* (t - l )))'),4);
- % sols=solve(fd4);
- tc1=eval(sols(2));
- tc2=eval(sols(3));
- LL=l; %eval(sols(1)); %exactly the same as 'l' from std. fit method-Save time
- rsTmStd=LL-tc1; %%riseTime (first critical point to L)
- deltS=rsTmStd/2;
- tc1Early=tc1-deltS; %AKA- tc1AdjTm %2*tc1 -LL
- L_Late=LL+deltS;
- tc1EdatPt=find(filterTimes>(tc1Early),1,'first');
- cutTm(1)=filterTimes(2);
- cutDatNum(1)=2;
- cutTm(2)=tc1Early;
- cutDatNum(2)=tc1EdatPt-1;
- L_LDatPt=find(filterTimes< L_Late,1,'last');
- tc2LdatPt=find(filterTimes< tc2+rsTmStd,1,'last');
- cutTm(3)=L_Late;
- cutDatNum(3)=L_LDatPt;
-
- % Select Core Data Set (Remove Early data before critical point)
- ints=[];
- ints(1:L_LDatPt-tc1EdatPt+2)=(tmpIntens(L_LDatPt));
- ints(2:end)=tmpIntens(tc1EdatPt:L_LDatPt);
- ints(1)=tmpIntens(1);
- tms=[];
- tms(1:L_LDatPt-tc1EdatPt+2)=(stdTimes(L_LDatPt));
- tms(2:end)=stdTimes(tc1EdatPt:L_LDatPt);
- tms(1)=stdTimes(1);
- % Include/Keep late data that define K
- if length(tmpIntens(tc2LdatPt:end))> 4
- KlastInts=tmpIntens(tc2LdatPt:end);
- KlastTms=stdTimes(tc2LdatPt:end);
- lengthKlast=length(tmpIntens(tc2LdatPt:end));
- ints(end:(end+ lengthKlast-1))=KlastInts;
- tms(end:(end+ lengthKlast-1 ))=KlastTms;
- cutTm(4)=tc2+rsTmStd;
- cutDatNum(4)=tc2LdatPt-1;
- else
- lengthKlast=length(tmpIntens(tc2LdatPt-1:end));
- if lengthKlast>1
- KlastInts=tmpIntens(end-(lengthKlast-1):end);
- KlastTms=stdTimes(end-(lengthKlast-1):end);
- ints(end:(end+ lengthKlast-1 ))=KlastInts;
- tms(end:(end+ lengthKlast-1 ))=KlastTms;
- end
- cutTm(4)=stdTimes(tc2LdatPt-1);
- cutDatNum(4)=tc2LdatPt-2; %length(stdTimes(end-(lengthKlast-1):end));
- end
- Ints=[];
- Tms=[];
- Ints=ints';
- Tms=tms';
- try
- filterTimes=Tms; filterTimes4=Tms;
- normIntens=Ints; normIntens4=Ints;
- % Classic symmetric logistic curve fit setup restated as COMMENTS for reference convenience
- % opts=fitoptions is the same as for Std and so is redundant
- % opts=fitoptions('Method','Nonlinear','Robust','On',...
- % 'DiffMinChange',1.0E-11,'DiffMaxChange',0.001,...
- % 'MaxFunEvals',me, 'MaxIter', mi, 'TolFun', 1.0E-12, 'TolX', 1.0E-10, 'Lower', [K_Guess*0.5,0,0], 'StartPoint', [K_Guess,filterTimes(floor(numTimePts/2)),0.30], 'Upper', [K_Guess*2.0,max(filterTimes),1.0]);
-
- ftype=fittype('K / (1 + exp(-r* (t - l )))','independent','t','dependent',['K','l','r'],'options',opts);
- fitObject=[]; errObj=[];
- % carry out the curve fitting process
- [fitObject, errObj]=fit(Tms,Ints,ftype);
- coeffsArray=coeffvalues(fitObject);
- r3=coeffsArray(3); % sDat(slps,4)=coeffsArray(3); % rateS
-
- if (exist('K','var')&& exist('r','var') && exist('l','var'))
- t=(0:1:200);
- GrowthELr=K ./ (1 + exp(-r.* (t - l )));
- fitblELr=min(GrowthELr); %jh diag
- end
- catch
- % if no data is given, return zeros
- AUC=0;MSR=0;K=0;r=0;l=0;rsquare=0;Klow=0;Kup=0;
- rlow=0;rup=0;lup=0;llow=0; %normIntens=[];
- end
- end
- % Update values if r is better(higher) with removal of early data
- try
- if r3>r && stdNANcond==0
- r=r3; sDat(slps,4)=sDat(slps,4); % rateS
- K=coeffsArray(1); sDat(slps,2)=coeffsArray(1); % Carrying Capacity
- l=coeffsArray(2); sDat(slps,3)=coeffsArray(2); % lag time
- coeffsArray=coeffvalues(fitObject);
- rmsStg1=errObj.rsquare;
- rmsStg1I(slps)=errObj.rsquare;
- sDat(slps,1)=errObj.rsquare;
-
- % JH diagnostics
- numFitTpts=nnz((normIntens(:)>=0)==1);
- thresGT2=find(((normIntens(:)>2)==1), 1);
- thresGT2Tm=filterTimes(thresGT2);
- numTptsGT2=nnz((normIntens(:)>=2)==1);
- numTimePts=length(filterTimes);
-
- AUC=(K/r*log(1+exp(-r*(t_end-l)))-K/r*log(exp(-r*(t_end-l)))) - (K/r*log(1+exp(-r*(t_begin-l)))-K/r*log(exp(-r*(t_begin-l))));
- MSR=r3;
- rsquare=errObj.rsquare;
- confObj=confint(fitObject,0.9); % get the 90% confidence
- NANcond=0;
- confObj_filtered=confObj;
- Klow=confObj(1,1); sDat(slps,5)=confObj(1,1);
- Kup=confObj(2,1); sDat(slps,6)=confObj(2,1);
- llow=confObj(1,2); sDat(slps,7)=confObj(1,2);
- lup=confObj(2,2); sDat(slps,8)=confObj(2,2);
- rlow=confObj(1,3); sDat(slps,9)=confObj(1,3);
- rup=confObj(2,3); sDat(slps,10)=confObj(2,3);
- if(isnan(Klow)||isnan(Kup)||isnan(llow)||isnan(lup)||isnan(rlow)||isnan(rup))
- NANcond=1;
- end
- filterTimes=Tms;
- normIntens=Ints;
- resMat(17)=.00002;
- resMat(18)=bl;
- resMat(19)=fitblELr;
- resMat(20)=minTime;
- else % r is better than r3 so use the Std data in the ELr result sheet
- filterTimes=selTimesStd;
- normIntens=selIntensStd;
- lastTptUsed=lastTptUsedStd; % Reinstall Std values for jh diags
- Tpt1=filterTimes(1);
- try
- if isempty(Tpt1)
- Tpt1=0.00002; %777;
- end
- catch
- Tpt1=0.00002; %777;
- end
-
- resMat(17)=Tpt1;
- numFitTpts=numFitTptsStd;
- numTptsGT2=numTptsGT2Std;
- thresGT2Tm=thresGT2TmStd;
- cutTm(1:4)=1000; % 1 means cuts not used or NA
- resMat(18)=bl; % only applicable to Std curve Fit; ELr superceeds and makes meaningless
- resMat(19)=fitblStd; % only applicable to Std curve Fit; ELr superceeds and makes meaningless
- resMat(20)=minTime; % only applicable to Std curve Fit; ELr superceeds and makes meaningless
- end % if r3>r1
- catch
- % if no data is given, return zeros
- AUC=0;MSR=0;K=0;r=0;l=0;rsquare=0;Klow=0;Kup=0;
- rlow=0;rup=0;lup=0;llow=0; % normIntens=[];
- end
-
- resMat(1)=AUC;
- resMat(2)=MSR;
- resMat(3)=K;
- resMat(4)=r;
- resMat(5)=l;
- resMat(6)=rsquare;
- resMat(7)=Klow;
- resMat(8)=Kup;
- resMat(9)=rlow;
- resMat(10)=rup;
- resMat(11)=llow;
- resMat(12)=lup;
- resMat(13)=currSpotArea;
- resMat(14)=lastIntensUsed; %filtNormIntens(length(filtNormIntens));
- % spline fit unneccessary and removed therfor no max spline rate time->set 0
- maxRateTime=0; % ELr will show 0; Std will show []
- resMat(15)=maxRateTime;
- resMat(16)=lastTptUsed; % filterTimes(length(filterTimes));
- try % if Std fit used no cuts .:. no cutTm
- resMat(24)=cutTm(1);
- resMat(25)=cutTm(2);
- resMat(26)=cutTm(3);
- resMat(27)=cutTm(4);
- catch
- resMat(24)=999; % if Std fit used no cuts .:. no cutTm
- resMat(25)=999;
- resMat(26)=999;
- resMat(27)=999;
- end
- FiltTimesELr=filterTimes;
- NormIntensELr=normIntens;
- lastTptUsed=max(filterTimes);
- lastIntensUsed=normIntens(length(normIntens));
-
- if (exist('K','var')&& exist('r','var') && exist('l','var'))
- t=(0:1:200);
- Growth=K ./ (1 + exp(-r.* (t - l )));
- fitbl=min(Growth); % jh diag
- end
- try % jh diag
- if isempty(thresGT2Tm)
- thresGT2Tm=0
- end
- catch
- thresGT2Tm=0;
- numTptsGT2=0;
- end
- resMat(21)=thresGT2Tm;
- resMat(22)=numFitTpts;
- resMat(23)=numTptsGT2;
- end
-
|