This file is indexed.

/usr/include/InsightToolkit/Review/itkMRCHeaderObject.h is in libinsighttoolkit3-dev 3.20.1+git20120521-6build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    itkMRCHeaderObject.h
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#ifndef __itkMRCHeaderObject_h
#define __itkMRCHeaderObject_h


#include "itkLightObject.h"
#include "itkByteSwapper.h"
#include "itkIntTypes.h"

namespace itk
{

/** \fixme This is a very easy way to declare a string constant */
const char * const magicMAP = "MAP ";


/** \class MRCHeaderObject
 * \brief This class is a light wrapper for a couple of plain old data
 * structures, so that they can be utilized in a MetaDataDictionary.
 *
 * The class is designed to be intialized from a chuck of bytes that
 * are read in from a file. Verification is performed to ensure that
 * the bytes appear to be the correct format for the headers.
 *
 * The POD structures a publicly avaible without access methods.
 *
 * \sa MetaDataDictionary
 */
class ITK_EXPORT MRCHeaderObject :
  public itk::LightObject
{
public:
  /** Standard class typedefs. */
  typedef MRCHeaderObject               Self;
  typedef LightObject                   Superclass;
  typedef SmartPointer<Self>            Pointer;
  typedef SmartPointer<const Self>      ConstPointer;


  /** plain old data structure of the MRC header as used by IMOD. This
   * header must be 1024 bytes.
   *
   * The structure of the MRC header taken from:
   * http://bio3d.colorado.edu/imod/doc/mrc_format.txt with permision
   * from David Mastronarde on 8/21/2009
   */
  struct Header
    {
    int32_t nx;            /**< Number of Columns */
    int32_t ny;            /**< Number of Rows */
    int32_t nz;            /**< Number of Sections */

    /** Types of pixel in image.  Values used by IMOD:
     * 0 = unsigned bytes,
     * 1 = signed short integers (16 bits),
     * 2 = float,
     * 3 = short * 2, (used for complex data)
     * 4 = float * 2, (used for complex data)
     * 6 = unsigned 16-bit integers (non-standard)
     * 16 = unsigned char * 3 (for rgb data, non-standard)
    */
    int32_t mode;

    /**  Starting point of sub image. (ignored) */
    int32_t nxstart;
    int32_t nystart;
    int32_t nzstart;


    /** Grid size in X, Y, and Z */
    int32_t mx;
    int32_t my;
    int32_t mz;

    /** Cell size; pixel spacing = xlen/mx */
    float   xlen;
    float   ylen;
    float   zlen;


    /**cell angles (ignored) */
    float   alpha;
    float   beta;
    float   gamma;


    int32_t     mapc;       /**< map column  1=x,2=y,3=z. (ignored)  */
    int32_t     mapr;       /**< map row     1=x,2=y,3=z. (ignored)  */
    int32_t     maps;       /**< map section 1=x,2=y,3=z. (ignored)  */


    // These need to be set for proper scaling of
    // non byte data.
    float   amin;             /**< Minimum pixel value.  */
    float   amax;             /**< Maximum pixel value.  */
    float   amean;            /**< Mean pixel value.  */

    int16_t   ispg;         /**< image type  */
    int16_t   nsymbt;       /**< space group number  */

    int32_t   next;         /**< number of bytes in extended header */
    int16_t   creatid;      /**< Creator ID  */

    int8_t notused1[30];     /**<     extra data (not used)  */

    // These two values specify the structure of data in the
    // extended header; their meaning depend on whether the
    // extended header has the Agard format, a series of
    // 4-byte integers then real numbers, or has data
    // produced by SerialEM, a series of short integers.
    // SerialEM stores a float as two shorts, s1 and s2, by:
    // value = (sign of s1)*(|s1|*256 + (|s2| modulo 256))
    // * 2**((sign of s2) * (|s2|/256))

    int16_t   nint;        // Number of integers per section (Agard format) or
                           // number of bytes per section (SerialEM format)
    int16_t   nreal;       // Number of reals per section (Agard format) or
      // flags for which types of short data (SerialEM format):
    // 1 = tilt angle * 100  (2 bytes)
    // 2 = piece coordinates for montage  (6 bytes)
    // 4 = Stage position * 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

    /** extra data (not used) */
    int8_t    notused2[28];

    // Explanation of type of data.
    int16_t   idtype;      // ( 0 = mono, 1 = tilt, 2 = tilts, 3 = lina, 4 = lins)
    int16_t   lens;
    int16_t   nd1;         // for idtype = 1, nd1 = axis (1, 2, or 3)
    int16_t   nd2;
    int16_t   vd1;         // vd1 = 100. * tilt increment
    int16_t   vd2;         // vd2 = 100. * starting angle

    // Used to rotate model to match new rotated image.
    float   tiltangles[6];   // 0,1,2 = original:  3,4,5 = current


    // NEW-STYLE MRC image2000 HEADER - IMOD 2.6.20 and above:
    float   xorg;            // Origin of image.  Used to auto translate model
    float   yorg;            // to match a new image that has been translated.
    float   zorg;


    char    cmap[4];         /**< Contains "MAP "  */
    char    stamp[4];        /**< First byte has 17 for big- or 68 for little-endian  */
    float   rms;

    // ALL HEADERS:
    int32_t nlabl;         /**< Number of labels with useful data.  */
    char label[10][80];    /**< 10 labels of 80 charactors.  */
    };

  /** Fei/Agard extended header */
  struct FeiExtendedHeader
    {
    float atilt;        /**< alpha tilt  */
    float btilt;        /**< beta tilt  */
    float xstage;       /**< Stage x position  (unit=m, huh if > 1)  */
    float ystage;       /**< Stage y position  (unit=m, huh if > 1)  */
    float zstage;       /**< Stage z position  (unit=m, huh if > 1)  */
    float xshift;       /**< Image shift x (unit=m, huh if > 1)  */
    float yshift;       /**< Image shift y (unit=m, huh if > 1)  */
    float defocus;      /**< (unit=m, huh if > 1)  */
    float exptime;      /**< time is seconds  */
    float meanint;      /**< mean value  */
    float tiltaxis;     /**< tilt axis in degree  */
    float pixelsize;    /**< pixel size (unit=m, huh if > 1)  */
    float magnification; 
    char  notused[76];  /**< fill up 128 bytes  */
    };

  /** pixel type enumeration */
  enum {MRCHEADER_MODE_UINT8 = 0,
        MRCHEADER_MODE_IN16 = 1,
        MRCHEADER_MODE_FLOAT = 2,
        MRCHEADER_MODE_COMPLEX_INT16 = 3,
        MRCHEADER_MODE_COMPLEX_FLOAT = 4,
        MRCHEADER_MODE_UINT16 = 6,
        MRCHEADER_MODE_RGB_BYTE = 16};

  /** map enumeration */
  enum {MRCHEADER_MAP_X = 1,
        MRCHEADER_MAP_Y = 2,
        MRCHEADER_MAP_Z = 3};

public:


  /** Method for creation through the object factory. */
  itkNewMacro(Self);


  /** Run-time type information (and related methods). */
  itkTypeMacro(MRCHeaderObject, LightObject);


  void DeepCopy(ConstPointer h);

  /** \param buffer is assumed to point to a 1024 block of memory
   * which has the header
   *
   * The return value indicates if buffer appears valid. If
   * false is returned then the header member varible is in an undefined
   * state.
   *
   * If the byte order of the header then byte swapping will be
   * performed.
   */
  bool SetHeader(const Header *buffer);
  const Header & GetHeader() const;

  /** After SetHeader is called GetExtendedHeaderSize contains the
   * extected size of the buffer argument. This buffer is expected to
   * be the bytes which follow the header in the file.
   *
   * The return value indicates if the extended header buffer is valid
   * and known. If false is returned then extended header information
   * is not available.
   */
  bool SetExtendedHeader(const void *buffer);


  /** the expected number of bytes in the extended header, this is only
   * valid after a successful call to SetHeader.
   */
  size_t GetExtendedHeaderSize(void) const;

  /** the expected number of bytes in the header */
  size_t GetHeaderSize(void) const { return sizeof(Header); }

  /** returns true if the original header from SetHeader was big
   * endian.
   */
  bool IsOriginalHeaderBigEndian(void) const;

  /** Public avaiable data : FIXME : NO MEMBER VARIABLES SHOULD BE PUBLIC. */
  Header                  m_Header;   // FIXME : This should be private and should have Get/Set Methods.

protected:

  MRCHeaderObject(void);
  ~MRCHeaderObject(void);

  /** Methods to fix the order of a set header */
  void swapHeader(bool bigEndian);

  /** Prints loads of information from the header */
  void PrintSelf(std::ostream& os, Indent indent) const;

private:
  MRCHeaderObject(const Self&); //purposely not implemented
  void operator=(const Self&); //purposely not implemented

  size_t                  m_ExtendedHeaderSize;
  void                *   m_ExtendedHeader;

  FeiExtendedHeader   *   m_ExtendedFeiHeader;

  bool                    m_BigEndianHeader;

};

} // namespace itk

#endif