rditype.m
changeset 0 0a450563f904
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rditype.m	Tue Oct 20 16:23:49 2009 -0400
@@ -0,0 +1,349 @@
+%======================================================================
+%                    R D I T Y P E . M 
+%                    doc: Wed Jan  7 16:49:09 2009
+%                    dlm: Wed Jan  7 16:49:22 2009
+%                    (c) 2009 A.M. Thurnherr
+%                    uE-Info: 287 0 NIL 0 0 72 0 2 8 NIL ofnI
+%======================================================================
+
+% CHANGES BY ANT:
+%   Jan  7, 2009: - tightened use of exist()
+
+function [data,d] = rditype(file, verbose, select);
+
+% function data = rditype(file, verbose, select);
+%	Read the fixed leader data from a raw ADCP
+%	data file.
+%	Returns the contents of the fixed leader
+%	as 31 elements of the vector 'data' or an
+%	empty matrix if the fixed leader ID is not
+%	identified (error condition)
+%	If the variable select is provided as a vector
+%	of zeros and ones, the function will return
+%	only the elements of data which correspond to
+%	a one in the vector select.  Select must be the
+%	the same length as the number of fields in the
+%	record, currently 32.
+%	Set verbose=1 for a text output.
+
+% get fixed leader data
+ if nargin<3, select = ones(1,31); end
+ if nargin<2, verbose = 0; end
+ if nargin<1, disp(' provide file name '), return, end
+
+ 
+ fid = fopen(file,'r','l');
+ hid = 127;  % header identification byte
+ [id,n] = fread(fid,2,'uint8');
+ status = fseek(fid,0,'bof');
+ if id(1) ~= hid
+  % Fix parameter for NB-ADCP Kiel
+  data=zeros(1,32);
+  d.nbytes=NaN;
+  d.ntypes=NaN;
+  d.Firm_Version=0;
+  d.Frequency=150;
+  d.Up=0;
+  d.Beam_angle=20;
+  d.Cell_length=1600;
+  d.Pings_per_Ensemble=8;
+  d.Pulse_length=1600;
+  d.Blank=NaN;
+  d.Mode=NaN;
+  d.Time_Pings=NaN;
+  d.Coordinates=3;
+  d.NarrowBand=1;
+  return
+ end
+ [d.nbytes, d.ntypes, offsets] = rdhead(fid, verbose);
+
+ % ---- now at start of fixed leader data
+
+% originally 
+% Written by Marinna Martini
+% for the U.S. Geological Survey
+% Atlantic Marine Geology, Woods Hole, MA
+% 1/7/95
+
+data=zeros(1,32);
+fld=1;  
+% make sure we're looking at the beginning of
+% the fixed leader record by testing for it's ID
+data(fld)=fread(fid,1,'ushort');
+if(data(fld)~=0),
+	disp('Fixed Leader ID not found');
+	data=[];
+	return;
+end
+fld=fld+1;
+% version number of CPU firmware
+data(fld)=fread(fid,1,'uchar');
+fld=fld+1;
+% revision number of CPU firmware
+data(fld)=fread(fid,1,'uchar');
+d.Firm_Version=data(fld-1)+data(fld)/100;
+if verbose, disp(sprintf('CPU Version %d.%d',data(fld-1),data(fld))); end;
+fld=fld+1;
+% configuration, uninterpreted
+data(fld)=fread(fid,1,'uchar');
+	b=dec2binv(data(fld));
+	freqs=[75 150 300 600 1200 2400];
+	junk=bin2decv(b(6:8));
+d.Frequency=freqs(junk+1);
+d.Up=str2num(b(1));
+if verbose, 
+	disp(sprintf('Hardware Configuration for LSB %d',data(fld))); 
+	disp(sprintf('	System Frequency = %d kHz',freqs(junk+1))); 
+	if b(5) == '0', disp('	Concave Beam'); end		
+	if b(5) == '1', disp('	Convex Beam'); end		
+	junk=bin2decv(b(3:4));
+	disp(sprintf('Sensor Configuration #%d',junk+1)); 
+	if b(2) == '0', disp('	Transducer head not attached'); end		
+	if b(2) == '1', disp('	Transducer head attached'); end		
+	if b(1) == '0', disp('	Downward facing beam orientation'); end		
+	if b(1) == '1', disp('	Upward facing beam orientation'); end		
+end;
+fld=fld+1;
+data(fld)=fread(fid,1,'uchar');
+	b=dec2binv(data(fld));
+	angles = [15 20 30 0];
+	junk=bin2decv(b(7:8));
+d.Beam_angle=angles(junk+1);
+if verbose, 
+	disp(sprintf('Hardware Configuration MSB %d',data(fld))); 
+	disp(sprintf('	Beam angle = %d degrees',angles(junk+1))); 
+	junk=bin2decv(b(1:4));
+	if junk == 4, disp('	4-beam janus configuration'); end
+	if junk == 5, disp('	5-beam janus configuration, 3 demodulators'); end
+	if junk == 15, disp('	4-beam janus configuration, 2 demodulators'); end
+end;
+fld=fld+1;
+% real (0) or simulated (1) data flag
+data(fld)=fread(fid,1,'uchar');	fld=fld+1;
+% undefined
+data(fld)=fread(fid,1,'uchar');	fld=fld+1;
+% number of beams
+data(fld)=fread(fid,1,'uchar');	fld=fld+1;
+% number of depth cells
+data(fld)=fread(fid,1,'uchar');
+d.Depth_Cells=data(fld);
+if verbose, disp(sprintf('Number of depth cells %d',data(fld))); end;
+fld=fld+1;
+% pings per ensemble
+data(fld)=fread(fid,1,'ushort');
+d.Pings_per_Ensemble=data(fld);
+if verbose, disp(sprintf('Pings per ensemble %d',data(fld))); end;
+fld=fld+1;
+% depth cell length in cm
+data(fld)=fread(fid,1,'ushort');
+d.Cell_length=data(fld);
+if verbose, disp(sprintf('Depth cell size %d cm',data(fld))); end
+fld=fld+1;
+% blanking distance (WF)
+data(fld)=fread(fid,1,'ushort');
+d.Blank=data(fld);
+if verbose, disp(sprintf('Blank after xmit distance %d cm',data(fld))); end
+fld=fld+1;
+% Profiling mode (WM)
+data(fld)=fread(fid,1,'uchar');
+d.Mode=data(fld);
+if verbose, disp(sprintf('Profiling mode %d',data(fld))); end
+fld=fld+1;
+% Minimum correlation threshold (WC)
+data(fld)=fread(fid,1,'uchar');
+d.Min_Correlation=data(fld);
+if verbose, disp(sprintf('Correlation threshold %d',data(fld))); end
+fld=fld+1;
+% number of code repetitions
+data(fld)=fread(fid,1,'uchar');
+d.Code_rep=data(fld);
+fld=fld+1;
+% Minimum percent good to output data (WG)
+data(fld)=fread(fid,1,'uchar');
+d.Min_Percgood=data(fld);
+fld=fld+1;
+% Error velocity threshold (WE)
+d.Max_Errorvel=data(fld);
+data(fld)=fread(fid,1,'ushort');
+if verbose, disp(sprintf('Error Velocity Threshold %d mm/s',data(fld))); end
+fld=fld+1;
+% time between ping groups (TP)
+data(fld)=fread(fid,1,'uchar');
+d.Time_Pings=data(fld)*60;
+fld=fld+1;
+data(fld)=fread(fid,1,'uchar');
+d.Time_Pings=d.Time_Pings+data(fld);
+fld=fld+1;
+data(fld)=fread(fid,1,'uchar');
+d.Time_Pings=d.Time_Pings+data(fld)/100;
+if verbose, disp(sprintf('Time between ping groups %d:%d.%d',...
+	data(fld-2), data(fld-1), data(fld))); end
+fld=fld+1;
+% coordinate transformation (EX)
+data(fld)=fread(fid,1,'uchar');
+	b=dec2binv(data(fld));
+	junk=bin2decv(b(4:5));
+d.Coordinates=junk;
+d.use_tilt=str2num(b(6));
+if verbose, 
+	disp(sprintf('Coordinate Transformation = %d',data(fld))); 
+	if junk == 0, disp('	Data stored coordinates = Beam'); end
+	if junk == 1, disp('	Data stored coordinates = Instrument'); end
+	if junk == 2, disp('	Data stored coordinates = Ship'); end
+	if junk == 3, disp('	Data stored coordinates = Earth'); end
+	if b(6) == '1', disp('	Tilts used in transformation'); end
+%	if b(7) == '1', disp('	3-beam solution used, this ensemble'); end
+end
+fld=fld+1;
+% Heading Alignment (EA)
+data(fld)=fread(fid,1,'uint16');
+d.headin_alignment=data(fld);
+fld=fld+1;
+% Heading Bias (EB)
+data(fld)=fread(fid,1,'uint16');
+d.headin_bias=data(fld);
+if verbose, disp(sprintf('Heading Bias: %d deg',data(fld)./100)); end
+fld=fld+1;
+% Sensor source (EZ)
+data(fld)=fread(fid,1,'uchar');
+	b=dec2binv(data(fld));
+d.sensor_source=b;
+if verbose,
+	disp(sprintf('Sensor Source = %d',data(fld))); 
+	if b(2) == '1', disp('	Sound speed computed from ED, ES, ET'); end
+	if b(3) == '1', disp('	ED taken from depth sensor'); end	
+	if b(4) == '1', disp('	EH taken from xducer heading sensor'); end	
+	if b(5) == '1', disp('	EP taken from xducer pitch sensor'); end	
+	if b(6) == '1', disp('	ER taken from xducer roll sensor'); end	
+	if b(7) == '1', disp('	ES derived from conductivity sensor'); end	
+	if b(8) == '1', disp('	ET taken from temperature sensor'); end	
+end
+fld=fld+1;
+% Sensors available
+data(fld)=fread(fid,1,'uchar');
+	b=dec2binv(data(fld));
+d.sensor_avail=b;
+if verbose,
+	disp(sprintf('Sensor Availability = %d',data(fld))); 
+	if b(3) == '1', disp('	depth sensor'); end	
+	if b(4) == '1', disp('	heading sensor'); end	
+	if b(5) == '1', disp('	pitch sensor'); end	
+	if b(6) == '1', disp('	roll sensor'); end	
+	if b(7) == '1', disp('	conductivity sensor'); end	
+	if b(8) == '1', disp('	temperature sensor'); end	
+end
+fld=fld+1;
+% Bin 1 distance
+data(fld)=fread(fid,1,'ushort');
+if verbose, disp(sprintf('Distance to center of bin 1: %d cm',data(fld))); end
+fld=fld+1;
+% xmit pulse length
+data(fld)=fread(fid,1,'ushort');
+d.Pulse_length=data(fld);
+fld=fld+1;
+% starting depth cell
+data(fld)=fread(fid,1,'uchar');
+fld=fld+1;
+% ending depth cell
+data(fld)=fread(fid,1,'uchar');
+fld=fld+1;
+% false target reject threshold
+data(fld)=fread(fid,1,'uchar');
+d.target_max=data(fld);
+fld=fld+1;
+% spare
+data(fld)=fread(fid,1,'uchar');
+fld=fld+1;
+% transmit lag distance
+data(fld)=fread(fid,1,'ushort');
+d.xmit_lag=data(fld);
+
+if length(select) == length(data),
+	data(find(select==0))=[];
+end
+
+
+%--------------------------------------
+
+
+function [nb, nt, off] = rdhead(fid, verbose);
+
+%function [nb, nt, off] = rdhead(fid, verbose);
+%	Read the header data from a raw ADCP
+%	data file opened for binary reading.
+%	fid = file handle returned by fopen
+%	nb = number of bytes in the ensemble
+%	nt = number of data types
+%	off = offset to the data for each type
+%	Set verbose = 1 for a text output.
+
+% Written by Marinna Martini
+% for the U.S. Geological Survey
+% Atlantic Marine Geology, Woods Hole, MA
+% 1/7/95
+
+data = zeros(1,2);
+fld=1;
+if ~exist('verbose','var'),
+	verbose = 0;
+end
+nb=[]; nt=[]; off=[];
+
+% make sure we're looking at the beginning of
+% the header record by testing for it's ID
+junk=fread(fid,2,'uint8');
+if((length(junk)~=2) | (ftell(fid)<0)),
+	disp('End of file found in rdhead.');
+	return;
+end
+if ((junk(1)~=127) | (junk(2)~=127)),
+	disp('Header ID not found');
+	return;
+end
+% get the number of bytes this ensemble
+nb = fread(fid,1,'uint16');
+if verbose, disp(sprintf('Number of bytes per ensemble %d',nb)); end;
+% get the number of data types
+fseek(fid,1,'cof');	% skip spare byte position
+nt=fread(fid,1,'uchar');
+if verbose, disp(sprintf('Number of data types %d',nt)); end;
+% get the type offset
+off=zeros(nt,1);
+for j=1:nt, off(j)=fread(fid,1,'uint16'); end
+
+% ---------------------------------
+
+function d = bin2decv(h)
+%BIN2DEC  BIN2DEC('X') returns the decimal number corresponding to the
+%        binary number in quotes.  
+%		 For example, BIN2DEC([1 1 0 0]) returns 12.
+
+n=length(h);
+h=fliplr(h);
+d=0;
+for i=1:n
+	if isstr(h(i)),
+		p(i) = str2num(h(i)).*(2^(i-1));
+	else
+		p(i) = h(i).*(2^(i-1));
+	end
+end
+d=sum(p);
+
+% ---------------------------------
+
+function h = dec2binv(d)
+%DEC2BIN DEC2BIN(d) returns the binary number corresponding to the decimal
+%        number d.  For example, DEC2BIN(202) returns '11001010'.
+%
+%	
+h=dec2bin(d);
+bits=length(h)/8;
+if bits ~= fix(bits),
+	% not an even multiple of 8, so pad
+	npad = 8-((bits-fix(bits))*8);
+    h0(1:npad)='0';
+	h = [h0,h];
+end
+	
+