Difference between revisions of "CPSbopkc"

From Pnb
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