Difference between revisions of "CPSbopkc"
Jump to navigation
Jump to search
(Created page with "back to C-OPS/CERBERUS Mfiles") |
|||
| Line 1: | Line 1: | ||
| + | <pre> | ||
| + | function inde = cpsbopkc(string,depth_width,infile) | ||
| + | %bopkc determines the attenuation coefficients for spectral data. The user | ||
| + | %specifies the channel and depth window over which to perform the | ||
| + | %regression. Originally used with binned data, it determines the k value | ||
| + | %for each depth z. Regression is calculated using Kd = -dlnEd(ed,lu,etc)/dz | ||
| + | %looks like ln(Edz(z)) = ln(Ed0-) - Kdz | ||
| + | %modified 1-30-2014 added pitch and roll critery for window | ||
| + | %modified 2-8-2014 pts to pts2 goodpts | ||
| + | %modified 2-8-2014 badflag line 272 and 308 | ||
| + | %modified 2-8-2014 retain first winminus(opens depth window a couple | ||
| + | %modified 2-13-2014 medfit was putting NAN's for some values. replaced NAN | ||
| + | %with -9.9E35 | ||
| + | %points) | ||
| + | %get windows | ||
| + | %test for good z fit | ||
| + | %declare vars for regression | ||
| + | %find boundary conditions for Tschebyshev test | ||
| + | % | ||
| + | |||
| + | %[rowindex,time_atindex,depth_atindex] = index1(infile); | ||
| + | infp = fopen(infile,'r'); | ||
| + | dpcnt = 0; | ||
| + | while feof(infp) ~= 1 | ||
| + | ln = fgets(infp); | ||
| + | if strncmp(ln,'<data>',6) ==1 | ||
| + | break | ||
| + | end | ||
| + | if strncmp(ln,'<derived_parameters>',20) ==1 | ||
| + | dpcnt = dpcnt+1; | ||
| + | end | ||
| + | end | ||
| + | ct =0; | ||
| + | frewind(infp); | ||
| + | while feof(infp) ~=1 %used when making new list_ac9 | ||
| + | tu = fgets(infp); | ||
| + | ct = ct+1;%counts number lines | ||
| + | end | ||
| + | |||
| + | |||
| + | %==End of get cast params== | ||
| + | %======================================================================== | ||
| + | %==Check if done before== | ||
| + | %return boolean holder if bopkc was run before | ||
| + | %make sure it was binned | ||
| + | |||
| + | frewind(infp); | ||
| + | donebf = 'n'; | ||
| + | binned = 'n'; | ||
| + | while ~feof(infp) | ||
| + | ln = fgets(infp); | ||
| + | if (strncmp(ln,'bopkc',6)) ==1 | ||
| + | donebf ='y'; | ||
| + | break | ||
| + | end | ||
| + | if strncmp(ln,'bin_1.0_1depth',14) ==1 | ||
| + | binned = 'y'; | ||
| + | end | ||
| + | end | ||
| + | % % % if binned == 'n' commented on 11/23/2013 finally getting rid of | ||
| + | % % % binned headers | ||
| + | % % % disp('file is not binned') | ||
| + | % % % return | ||
| + | % % % end | ||
| + | %======================================================================= | ||
| + | %==End check if done before== | ||
| + | %======================================================================= | ||
| + | |||
| + | %=================================================== | ||
| + | %==Find index for parameter== | ||
| + | %=================================================== | ||
| + | %if can't be found, abort | ||
| + | linecounter =1; | ||
| + | frewind(infp); | ||
| + | |||
| + | for i = 1:ct %check for header indexes | ||
| + | |||
| + | checkline = fgets(infp); | ||
| + | |||
| + | if strncmp(checkline,'<sampled_parameters>',20) ==1 | ||
| + | startparam = linecounter; | ||
| + | end | ||
| + | if strncmp(checkline,'<derived_parameters>',20) ==1 | ||
| + | blankind = linecounter; | ||
| + | end | ||
| + | if strncmp(checkline,'<data>',6) == 1 | ||
| + | dataind = linecounter; | ||
| + | endparam = linecounter; | ||
| + | end | ||
| + | if strncmp(checkline,'<filters_used>',14) ==1 | ||
| + | filterind = linecounter; | ||
| + | end | ||
| + | linecounter = linecounter +1; | ||
| + | |||
| + | end | ||
| + | |||
| + | ext = 0; | ||
| + | i=1; | ||
| + | %for i = 1:ct%size(varargin,2) was for pulling multiple locations | ||
| + | frewind(infp); | ||
| + | |||
| + | %============================================================ | ||
| + | %==========make the data file================================ | ||
| + | %============================================================ | ||
| + | dfile = strcat('temp',infile); | ||
| + | |||
| + | dfd = fopen(dfile,'W+'); | ||
| + | for linc = 1:ct | ||
| + | lllc = fgets(infp); | ||
| + | if linc > dataind | ||
| + | fprintf(dfd,lllc); | ||
| + | end | ||
| + | if linc == filterind -1 | ||
| + | break | ||
| + | end | ||
| + | end | ||
| + | frewind(infp); | ||
| + | fclose(dfd); | ||
| + | % return | ||
| + | %==========end make datafile================================= | ||
| + | %============================================================ | ||
| + | |||
| + | |||
| + | %========================== | ||
| + | %master loop for all channels | ||
| + | %========================== | ||
| + | |||
| + | for count = 1:ct | ||
| + | varcheck = fgets(infp); | ||
| + | vari = string; %<=========== | ||
| + | if strncmp('LuZDepth',varcheck,6) ==1 %changed 12-3-12 | ||
| + | dep = count - startparam; | ||
| + | end | ||
| + | |||
| + | if strncmp('EdZPitch',varcheck,8) ==1 %changed 1-14-14 | ||
| + | pitch = count - startparam; | ||
| + | end | ||
| + | |||
| + | if strncmp('EdZRoll',varcheck,7) ==1 %changed 1-14-14 | ||
| + | roll = count - startparam; | ||
| + | end | ||
| + | |||
| + | if strncmp(varcheck,'<derived_parameters>',20) ==1; | ||
| + | ext =1; | ||
| + | end | ||
| + | |||
| + | if strncmp(varcheck,vari,length(vari)) ==1 %finds the variables index | ||
| + | |||
| + | pull(i) = count - startparam; | ||
| + | i = i+1; | ||
| + | end | ||
| + | end | ||
| + | %end | ||
| + | |||
| + | %==End of find index== | ||
| + | %======================================================================== | ||
| + | %==Read all data== | ||
| + | %load depth into a sepparate variable | ||
| + | %get size of data field | ||
| + | |||
| + | %datafilepref = strrep(infile(1),'b','binmat'); just changed | ||
| + | %datafile = strcat(datafilepref,infile(2:end)); just changed 5-10-2012 | ||
| + | datafile = dfile; | ||
| + | m = load(datafile,'.ASC'); | ||
| + | depth = m(:,dep); | ||
| + | pitch_a = m(:,pitch); | ||
| + | roll_a = m(:,roll); | ||
| + | |||
| + | %==End read all data | ||
| + | %======================================================================== | ||
| + | %==Do the meat, calculate K== | ||
| + | %qualifiers | ||
| + | %delta needs to be less than depscale | ||
| + | %if delta>= abs(depint) winplus =i (the deepest value for depth, input to | ||
| + | %function) | ||
| + | |||
| + | %================initialize | ||
| + | start = 0; | ||
| + | data = m(:,pull(1)); | ||
| + | winminus =1; | ||
| + | winplus =-1; | ||
| + | allvals = []; | ||
| + | inde = []; | ||
| + | nextk =0; | ||
| + | g =1; | ||
| + | am = []; | ||
| + | bm= []; | ||
| + | abdevm = []; | ||
| + | badline =1; | ||
| + | %================= | ||
| + | |||
| + | %========================================================== | ||
| + | %=====window loop ===================== | ||
| + | %=================================================== | ||
| + | % if strncmp(string,'1Lu665',6) ==1 | ||
| + | % keyboard | ||
| + | % end | ||
| + | while g <= length(depth) %master loop counter | ||
| + | |||
| + | delta = m(g,dep); | ||
| + | if delta < -9.0E35 | ||
| + | badline = badline +1; | ||
| + | b = -9.9E35; %%%%% 9-10-12 | ||
| + | inde = [inde,b];%%%%%%%%%%%%%%%%%%%%added 9-10-12 | ||
| + | %dbq winminus = badline; | ||
| + | g = g+1; %%%%%commented 9-10-12 | ||
| + | continue %%%%%commented 9-10-12 | ||
| + | end | ||
| + | |||
| + | if start == 0 && winplus == -1; %only done first through to get start location | ||
| + | |||
| + | % winminus =g; | ||
| + | if depth(winminus) < -999 | ||
| + | winminus = winminus +1; | ||
| + | end | ||
| + | if delta >= abs(depth(winminus) + depth_width/2) %for starting out. | ||
| + | nextk = g; | ||
| + | end | ||
| + | |||
| + | start = nextk; %+ depth_width/2 | ||
| + | |||
| + | if delta >= abs(depth(winminus) + depth_width) %if passing half window size. | ||
| + | winplus = g; | ||
| + | % disp('breaking') | ||
| + | pause | ||
| + | g = g+1; | ||
| + | |||
| + | break | ||
| + | else | ||
| + | % disp('first incr') | ||
| + | |||
| + | %=g; %playing with this 2-15-2013 wat just start: | ||
| + | g =g+1; | ||
| + | b = -9.9E35; | ||
| + | inde = [inde,b]; | ||
| + | size(inde); | ||
| + | continue | ||
| + | end | ||
| + | end | ||
| + | |||
| + | if start ~= 0 %if not first time through the loop | ||
| + | |||
| + | delta = depth_width/2; | ||
| + | condition = depth(start) - delta; %checking for this "window min" | ||
| + | ptr =start; | ||
| + | |||
| + | while ptr ~= 0 %starts in center of bin and works down | ||
| + | if winplus ~= -1 %retians first winminus from first go-through | ||
| + | if depth(ptr) <= condition | ||
| + | winminus = ptr; | ||
| + | break | ||
| + | end | ||
| + | end | ||
| + | ptr = ptr -1; | ||
| + | end | ||
| + | ptr =start; %resets ptr from center and works up. | ||
| + | condition = depth(ptr) + delta; | ||
| + | while ptr <= length(depth) %+1 | ||
| + | if depth(ptr) >= condition | ||
| + | winplus = ptr; | ||
| + | break | ||
| + | end | ||
| + | ptr = ptr +1; | ||
| + | end | ||
| + | start = start +1; | ||
| + | end | ||
| + | |||
| + | %================================================= | ||
| + | %=================end window loop=========== | ||
| + | %================================================= | ||
| + | %===check if window is good ======== | ||
| + | |||
| + | pts = 1; | ||
| + | badflag =0; | ||
| + | for z = winminus:winplus | ||
| + | if data(z) == -9.9E35 || depth(z) == -9.9E35 || data(z) <= 0 || pitch_a(z) >=10 || roll_a(z) >= 10 | ||
| + | |||
| + | % badflag =1; | ||
| + | % b = -9.9E35; %uncommented 1-15-13 | ||
| + | %inde = [inde,b]; %uncommented 1-15-13 | ||
| + | % continue | ||
| + | % pitch_a(z) | ||
| + | % roll_a(z) | ||
| + | % depth(z) | ||
| + | % data(z) | ||
| + | % keyboard | ||
| + | else | ||
| + | goodpts(pts,:) = z; | ||
| + | end | ||
| + | pts = pts + 1; | ||
| + | end | ||
| + | pts = length(goodpts); | ||
| + | if pts <2 %error if not enough points | ||
| + | keyboard | ||
| + | if badflag ==1 | ||
| + | %continue | ||
| + | else | ||
| + | disp('error need more pts to calculate') | ||
| + | keyboard | ||
| + | end | ||
| + | end | ||
| + | goodpts(find(goodpts ==0)) = []; | ||
| + | pts2 = length(goodpts); %actual number of good points after cleanup up from line above | ||
| + | x = depth(goodpts); % declare x and y for gregression | ||
| + | y = log(data(goodpts)); | ||
| + | %y_L = log(data(goodpts)); | ||
| + | n = size(x,1); | ||
| + | % plot((y),-x); Hanging on this ?????????????????? 10/28/2013 | ||
| + | % xlabel('channel'); | ||
| + | % ylabel('depth (m)'); | ||
| + | [abdev,a,b,siga,sigb] = deal(0); | ||
| + | |||
| + | %==============run the medfit script ====================== | ||
| + | %========================================================== | ||
| + | % % %if badflag ==0 | ||
| + | |||
| + | [a,b,abdev] = medfit(x,y,pts2,a,b,abdev); | ||
| + | |||
| + | |||
| + | if winplus - winminus < 10%strncmp(string,'1Lu665',6) ==1 so computation window does not exceed winplus. | ||
| + | % winminus | ||
| + | % winplus | ||
| + | % keyboard | ||
| + | b = -9.9E35; | ||
| + | end | ||
| + | % % %else | ||
| + | % % % b = -9.9E35; | ||
| + | % % %end | ||
| + | goodpts = []; %clear this for next iteration of loop | ||
| + | if delta < -9.0E35 | ||
| + | b = -9.9E35; | ||
| + | pause | ||
| + | end | ||
| + | |||
| + | %=====assign values gotten from medfit============ | ||
| + | %====================== | ||
| + | if isnan(b) %added 2-12-2014 | ||
| + | b = -9.9E35; | ||
| + | end | ||
| + | inde = [inde,-b]; | ||
| + | |||
| + | %====================== | ||
| + | |||
| + | % disp('second incrim') | ||
| + | g = g+1; | ||
| + | |||
| + | end | ||
| + | |||
| + | |||
| + | %pause(5) | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | </pre> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
back to [[C-OPS/CERBERUS Mfiles]] | back to [[C-OPS/CERBERUS Mfiles]] | ||
Latest revision as of 15:31, 13 February 2014
function inde = cpsbopkc(string,depth_width,infile)
%bopkc determines the attenuation coefficients for spectral data. The user
%specifies the channel and depth window over which to perform the
%regression. Originally used with binned data, it determines the k value
%for each depth z. Regression is calculated using Kd = -dlnEd(ed,lu,etc)/dz
%looks like ln(Edz(z)) = ln(Ed0-) - Kdz
%modified 1-30-2014 added pitch and roll critery for window
%modified 2-8-2014 pts to pts2 goodpts
%modified 2-8-2014 badflag line 272 and 308
%modified 2-8-2014 retain first winminus(opens depth window a couple
%modified 2-13-2014 medfit was putting NAN's for some values. replaced NAN
%with -9.9E35
%points)
%get windows
%test for good z fit
%declare vars for regression
%find boundary conditions for Tschebyshev test
%
%[rowindex,time_atindex,depth_atindex] = index1(infile);
infp = fopen(infile,'r');
dpcnt = 0;
while feof(infp) ~= 1
ln = fgets(infp);
if strncmp(ln,'<data>',6) ==1
break
end
if strncmp(ln,'<derived_parameters>',20) ==1
dpcnt = dpcnt+1;
end
end
ct =0;
frewind(infp);
while feof(infp) ~=1 %used when making new list_ac9
tu = fgets(infp);
ct = ct+1;%counts number lines
end
%==End of get cast params==
%========================================================================
%==Check if done before==
%return boolean holder if bopkc was run before
%make sure it was binned
frewind(infp);
donebf = 'n';
binned = 'n';
while ~feof(infp)
ln = fgets(infp);
if (strncmp(ln,'bopkc',6)) ==1
donebf ='y';
break
end
if strncmp(ln,'bin_1.0_1depth',14) ==1
binned = 'y';
end
end
% % % if binned == 'n' commented on 11/23/2013 finally getting rid of
% % % binned headers
% % % disp('file is not binned')
% % % return
% % % end
%=======================================================================
%==End check if done before==
%=======================================================================
%===================================================
%==Find index for parameter==
%===================================================
%if can't be found, abort
linecounter =1;
frewind(infp);
for i = 1:ct %check for header indexes
checkline = fgets(infp);
if strncmp(checkline,'<sampled_parameters>',20) ==1
startparam = linecounter;
end
if strncmp(checkline,'<derived_parameters>',20) ==1
blankind = linecounter;
end
if strncmp(checkline,'<data>',6) == 1
dataind = linecounter;
endparam = linecounter;
end
if strncmp(checkline,'<filters_used>',14) ==1
filterind = linecounter;
end
linecounter = linecounter +1;
end
ext = 0;
i=1;
%for i = 1:ct%size(varargin,2) was for pulling multiple locations
frewind(infp);
%============================================================
%==========make the data file================================
%============================================================
dfile = strcat('temp',infile);
dfd = fopen(dfile,'W+');
for linc = 1:ct
lllc = fgets(infp);
if linc > dataind
fprintf(dfd,lllc);
end
if linc == filterind -1
break
end
end
frewind(infp);
fclose(dfd);
% return
%==========end make datafile=================================
%============================================================
%==========================
%master loop for all channels
%==========================
for count = 1:ct
varcheck = fgets(infp);
vari = string; %<===========
if strncmp('LuZDepth',varcheck,6) ==1 %changed 12-3-12
dep = count - startparam;
end
if strncmp('EdZPitch',varcheck,8) ==1 %changed 1-14-14
pitch = count - startparam;
end
if strncmp('EdZRoll',varcheck,7) ==1 %changed 1-14-14
roll = count - startparam;
end
if strncmp(varcheck,'<derived_parameters>',20) ==1;
ext =1;
end
if strncmp(varcheck,vari,length(vari)) ==1 %finds the variables index
pull(i) = count - startparam;
i = i+1;
end
end
%end
%==End of find index==
%========================================================================
%==Read all data==
%load depth into a sepparate variable
%get size of data field
%datafilepref = strrep(infile(1),'b','binmat'); just changed
%datafile = strcat(datafilepref,infile(2:end)); just changed 5-10-2012
datafile = dfile;
m = load(datafile,'.ASC');
depth = m(:,dep);
pitch_a = m(:,pitch);
roll_a = m(:,roll);
%==End read all data
%========================================================================
%==Do the meat, calculate K==
%qualifiers
%delta needs to be less than depscale
%if delta>= abs(depint) winplus =i (the deepest value for depth, input to
%function)
%================initialize
start = 0;
data = m(:,pull(1));
winminus =1;
winplus =-1;
allvals = [];
inde = [];
nextk =0;
g =1;
am = [];
bm= [];
abdevm = [];
badline =1;
%=================
%==========================================================
%=====window loop =====================
%===================================================
% if strncmp(string,'1Lu665',6) ==1
% keyboard
% end
while g <= length(depth) %master loop counter
delta = m(g,dep);
if delta < -9.0E35
badline = badline +1;
b = -9.9E35; %%%%% 9-10-12
inde = [inde,b];%%%%%%%%%%%%%%%%%%%%added 9-10-12
%dbq winminus = badline;
g = g+1; %%%%%commented 9-10-12
continue %%%%%commented 9-10-12
end
if start == 0 && winplus == -1; %only done first through to get start location
% winminus =g;
if depth(winminus) < -999
winminus = winminus +1;
end
if delta >= abs(depth(winminus) + depth_width/2) %for starting out.
nextk = g;
end
start = nextk; %+ depth_width/2
if delta >= abs(depth(winminus) + depth_width) %if passing half window size.
winplus = g;
% disp('breaking')
pause
g = g+1;
break
else
% disp('first incr')
%=g; %playing with this 2-15-2013 wat just start:
g =g+1;
b = -9.9E35;
inde = [inde,b];
size(inde);
continue
end
end
if start ~= 0 %if not first time through the loop
delta = depth_width/2;
condition = depth(start) - delta; %checking for this "window min"
ptr =start;
while ptr ~= 0 %starts in center of bin and works down
if winplus ~= -1 %retians first winminus from first go-through
if depth(ptr) <= condition
winminus = ptr;
break
end
end
ptr = ptr -1;
end
ptr =start; %resets ptr from center and works up.
condition = depth(ptr) + delta;
while ptr <= length(depth) %+1
if depth(ptr) >= condition
winplus = ptr;
break
end
ptr = ptr +1;
end
start = start +1;
end
%=================================================
%=================end window loop===========
%=================================================
%===check if window is good ========
pts = 1;
badflag =0;
for z = winminus:winplus
if data(z) == -9.9E35 || depth(z) == -9.9E35 || data(z) <= 0 || pitch_a(z) >=10 || roll_a(z) >= 10
% badflag =1;
% b = -9.9E35; %uncommented 1-15-13
%inde = [inde,b]; %uncommented 1-15-13
% continue
% pitch_a(z)
% roll_a(z)
% depth(z)
% data(z)
% keyboard
else
goodpts(pts,:) = z;
end
pts = pts + 1;
end
pts = length(goodpts);
if pts <2 %error if not enough points
keyboard
if badflag ==1
%continue
else
disp('error need more pts to calculate')
keyboard
end
end
goodpts(find(goodpts ==0)) = [];
pts2 = length(goodpts); %actual number of good points after cleanup up from line above
x = depth(goodpts); % declare x and y for gregression
y = log(data(goodpts));
%y_L = log(data(goodpts));
n = size(x,1);
% plot((y),-x); Hanging on this ?????????????????? 10/28/2013
% xlabel('channel');
% ylabel('depth (m)');
[abdev,a,b,siga,sigb] = deal(0);
%==============run the medfit script ======================
%==========================================================
% % %if badflag ==0
[a,b,abdev] = medfit(x,y,pts2,a,b,abdev);
if winplus - winminus < 10%strncmp(string,'1Lu665',6) ==1 so computation window does not exceed winplus.
% winminus
% winplus
% keyboard
b = -9.9E35;
end
% % %else
% % % b = -9.9E35;
% % %end
goodpts = []; %clear this for next iteration of loop
if delta < -9.0E35
b = -9.9E35;
pause
end
%=====assign values gotten from medfit============
%======================
if isnan(b) %added 2-12-2014
b = -9.9E35;
end
inde = [inde,-b];
%======================
% disp('second incrim')
g = g+1;
end
%pause(5)
back to C-OPS/CERBERUS Mfiles