-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathsg_fread_mrcheader.m
118 lines (95 loc) · 4.63 KB
/
sg_fread_mrcheader.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function [fid,header] = sg_fread_mrcheader(fid)
%% sg_fread_mrcheader
% A function to read the header from an opened mrc file.
%
% WW 06-2018
%% Read header
header = struct();
% Dimensions (Colums, Rows, Sections)
header.nx = fread(fid,1,'int=>int'); %integer: 4 bytes
header.ny = fread(fid,1,'int=>int'); %integer: 4 bytes
header.nz = fread(fid,1,'int=>int'); %integer: 4 bytes
% Data mode
header.mode = fread(fid,1,'int=>int'); %integer: 4 bytes
% Starting point of sub-image (not used in IMOD)
header.nxstart= fread(fid,1,'int=>int'); %integer: 4 bytes
header.nystart= fread(fid,1,'int=>int'); %integer: 4 bytes
header.nzstart= fread(fid,1,'int=>int'); %integer: 4 bytes
% Grid size in x,y,z
header.mx= fread(fid,1,'int=>int'); %integer: 4 bytes
header.my= fread(fid,1,'int=>int'); %integer: 4 bytes
header.mz= fread(fid,1,'int=>int'); %integer: 4 bytes
% Cell size in Angstroms. (pixel spacing = xlen/mx ylen/my, zlen/mz)
header.xlen= fread(fid,1,'float=>float'); %float: 4 bytes
header.ylen= fread(fid,1,'float=>float'); %float: 4 bytes
header.zlen= fread(fid,1,'float=>float'); %float: 4 bytes
% Cell angles (ignored in IMOD)
header.alpha= fread(fid,1,'float=>float'); %float: 4 bytes
header.beta= fread(fid,1,'float=>float'); %float: 4 bytes
header.gamma= fread(fid,1,'float=>float'); %float: 4 bytes
% Map Column, row, and section. Must be set to 1,2,3 for correct pixel spacing.
header.mapc= fread(fid,1,'int=>int'); %integer: 4 bytes
header.mapr= fread(fid,1,'int=>int'); %integer: 4 bytes
header.maps= fread(fid,1,'int=>int'); %integer: 4 bytes
% Data value info (must be set for proper scaling)
header.amin= fread(fid,1,'float=>float'); %float: 4 bytes
header.amax= fread(fid,1,'float=>float'); %float: 4 bytes
header.amean= fread(fid,1,'float=>float'); %float: 4 bytes
% Space group. In IMOD: 0 for stack, 1 for volume.
header.ispg= fread(fid,1,'short=>short'); %integer: 2 bytes
header.nsymbt = fread(fid,1,'short=>short'); %integer: 2 bytes
% Number of bytes in extended header
header.next = fread(fid,1,'int=>int'); %integer: 4 bytes
% Old ID number, set as 0
header.creatid = fread(fid,1,'short=>short'); %integer: 2 bytes
% header.unused1 = fread(fid,30); %not used: 30 bytes
fseek(fid,30,'cof');
% Number of integers per section (FEI/Agard format) or number of bytes per
% section (SerialEM format)
header.nint = fread(fid,1,'short=>short'); %integer: 2 bytes
% Number of reals per section (FEI/Agard format) or bit flags for which
% types of short data (Serial EM format):
% 1 = Tilt angle in degrees * 100 (2 bytes)
% 2 = X, Y, Z, peice coordinates for montage (6 bytes)
% 4 = X, Y stage position in microns * 25 (4 bytes)
% 8 = Magnification / 100 (2 bytes)
% 16 = Intensity * 25000 (2 bytes)
% 32 = Exposure dose in e-/A2, a float in 4 bytes
% 128, 512: Reserved for 4-byte items
% 64, 256, 1024: Reserved for 2-byte items
% If the number of bytes implied by these flags does
% not add up to the value in nint, then nint and nreal
% are interpreted as ints and reals per section
header.nreal = fread(fid,1,'short=>short'); %integer: 2 bytes
% Extra data and IMOD bitflags
% header.unused2 = fread(fid,28); %not used: 28 bytes
fseek(fid,28,'cof');
% Some data type stuff
header.idtype= fread(fid,1,'short=>short'); %integer: 2 bytes
header.lens=fread(fid,1,'short=>short'); %integer: 2 bytes
header.nd1=fread(fid,1,'short=>short'); %integer: 2 bytes
header.nd2 = fread(fid,1,'short=>short'); %integer: 2 bytes
header.vd1 = fread(fid,1,'short=>short'); %integer: 2 bytes
header.vd2 = fread(fid,1,'short=>short'); %integer: 2 bytes
for i=1:6 %24 bytes in total
header.tiltangles(i)=fread(fid,1,'float=>float');%float: 4 bytes
end
% New-style MRC format (IMOD 2.6.20 and above)
% Origin of image
header.xorg = fread(fid,1,'float=>float'); %float: 4 bytes
header.yorg = fread(fid,1,'float=>float'); %float: 4 bytes
header.zorg = fread(fid,1,'float=>float'); %float: 4 bytes
% Should say "MAP "
header.cmap = fread(fid,4,'char=>char'); %Character: 4 bytes
% First two byptes of 17,17 for big-endian and 68,65 for little endian.
header.stamp = fread(fid,4,'char=>char'); %Character: 4 bytes
% RMS deviation of densities from mean. Set to -1 if not computed.
header.rms=fread(fid,1,'float=>float'); %float: 4 bytes
% Number of labels
header.nlabl = fread(fid,1,'int=>int'); %integer: 4 bytes
% Labels
labl = fread(fid,800,'char=>char'); %Character: 800 bytes
%% Parse labels
labl = reshape(labl,[80,10])';
labl_cell = cellstr(labl);
header.labl = labl_cell(1:header.nlabl);