function lidar_proc=read_CSM(fid,declination)
fseek(fid,0,'eof');
dend=ftell(fid);
frewind(fid)
C=textscan(fid,'%s %s',1);
lidar_proc.orig_filename=C{1,2};
C=textscan(fid,'%s %s %d',1);
lidar_proc.system_id=C{1,3};
C=textscan(fid,'%s %s %s %d',1);
lidar_proc.number_of_gates=C{1,4};
C=textscan(fid,'%s %s %s %s %n',1);
lidar_proc.range_gate_length=C{1,5};
C=textscan(fid,'%s %s %s %d',1);
lidar_proc.gatelengthinpts=C{1,4};
C=textscan(fid,'%s %d',1);
lidar_proc.pulses_per_ray=C{1,2};
C=textscan(fid,'%s %s %s %s %s %n',1);
lidar_proc.number_of_waypoints=C{1,6};
C=textscan(fid,'%s %s %s %s %s %s %s ',1);
lidar_proc.scan_type=[C{1,3},C{1,4},C{1,5},C{1,6},C{1,7}];
C=textscan(fid,'%s %s %d',1);
lidar_proc.focus_range=C{1,3};
C=textscan(fid,'%s %s %s %s',1);
temp=[char(C{1,3}),' ',char(C{1,4})];
lidar_proc.start_time=datenum(char(temp),'yyyymmdd HH:MM:SS');
C=textscan(fid,'%s %s %n',1);
lidar_proc.resolution=C{1,3};
C=textscan(fid,'%s %s %s %s %s %s %s %s %s %s %s %s %s %s',1);
C=textscan(fid,'%s %s %s %s %s %s %s %s %s %s %s %s %s %s',1);
C=textscan(fid,'%s',1);
C=textscan(fid,'%s %s %s %s %s %s %s %s %s %s %s %s %s %s',1);
C=textscan(fid,'%s %s %s %s %s %s',1);
C=textscan(fid,'%s',1);
j=1;
nrays=0;
dloc=ftell(fid);
ernst=0;
j=0;
who=double(lidar_proc.number_of_gates-lidar_proc.gatelengthinpts);
if lidar_proc.number_of_gates>150
    lidar_proc.ranges=lidar_proc.range_gate_length/2+[0:lidar_proc.number_of_gates-lidar_proc.gatelengthinpts-1]*3;
else
    lidar_proc.ranges=lidar_proc.range_gate_length/2+[0:lidar_proc.number_of_gates-1]*lidar_proc.range_gate_length;
end
lidar_proc.ranges=double(lidar_proc.ranges);
AA=fscanf(fid,'%f %f %f',[5,1]);
AB=fscanf(fid,'%i %f %f %e',[4,who]);
[q,qq]=size(AB);
nr=qq;
status=fseek(fid,dloc,'bof');
while ernst==0
    j=j+1;
    AA=fscanf(fid,'%f %f %f %f %f',[5,1]);

    if ~isempty(AA)
        azimuth(j,1)=AA(2)+declination;
        elevation(j,1)=AA(3);
        pitch(j,1)=AA(4);
        roll(j,1)=AA(5);
        [AB]=fscanf(fid,'%i %f %f %e',[4,who]);
        [q,qq]=size(AB);
        if isequal(qq,nr)
            lidar_proc.lidar_decimal_time(j)=AA(1);
%             lidar_proc.azimuth(j)=AA(2)+declination;
%             lidar_proc.elevation(j)=AA(3);
            tt=datevec(lidar_proc.start_time);
            t2=datevec(lidar_proc.lidar_decimal_time(j)/24);
            lidar_proc.timestamp(j)=datenum([tt(1) tt(2) tt(3) t2(4) t2(5) t2(6)]);
            lidar_proc.RWS(j,:)=AB(2,:);
            lidar_proc.SNR(j,:)=AB(3,:);
            lidar_proc.Beta(j,:)=AB(4,:);
            nrays=nrays+1;
            disp([num2str(ftell(fid)),' / ',num2str(dend)])
        else
            ernst=1;
        end

    else
        ernst=1;
    end
end
lidar_proc.number_of_rays=nrays;
[na,nr]=size(lidar_proc.RWS);
for j=1:nr
    lidar_proc.azimuth(:,j)=azimuth;
    lidar_proc.elevation(:,j)=elevation;
    lidar_proc.pitch(:,j)=pitch;
    lidar_proc.roll(:,j)=roll;
end
lidar_proc.xd=(sin(azimuth*pi/180).*cos(elevation*pi/180))*double(lidar_proc.ranges);
lidar_proc.yd=(cos(azimuth*pi/180).*cos(elevation*pi/180))*double(lidar_proc.ranges);
lidar_proc.zd=(sin(elevation*pi/180))*double(lidar_proc.ranges);

% correct for yaw pitch and roll to bring coordinates back to ENU local
% tangent plane   NOTE: yaw is currently not set within instrument. Tis is
% for a moving platform. For the time being, yaw will be set to
% zeros(size(lidar.xd))

yaw=zeros(size(lidar_proc.xd));
[xd,yd,zd]=rpy_correction(lidar_proc.xd,lidar_proc.yd,lidar_proc.zd,yaw,lidar_proc.pitch,lidar_proc.roll);

% now correct for new azimuth and elevation
for ja=1:na
    lidar_proc.elevation(ja,1:nr)=angle(complex(sqrt(xd(ja,end).^2+yd(ja,end).^2),zd(ja,end)))*180/pi;
    
    azz=angle(complex(yd(ja,end),xd(ja,end)))*180/pi;
    if azz<0
        azz=360+azz;
    end
    lidar_proc.azimuth(ja,1:nr)=azz;
end
lidar_proc.xd=xd;
lidar_proc.yd=yd;
lidar_proc.zd=zd;

% create geo coordinates  CCNY estimated position Latitude: 40.821513,
% Longitude=-73.947575, height=61.5m

[lat,lon,h]=make_geo(xd,yd,zd,40.821513,-73.947575,90.);
lidar_proc.lat=lat;
lidar_proc.lon=lon;
lidar_proc.h=h;
return





