CPSbopkc

From Pnb
Jump to navigation Jump to search
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