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 14: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