OSDN Git Service

772453c84541c11c59696339de9b1aa3c785c1b5
[eos/hostdependX86LINUX64.git] / src / Objects / DataManip / mrcImage / inc / mrcImage.h
1 #ifndef MRC_IMAGE_H
2 #define MRC_IMAGE_H
3 /*
4 # %M% %Y% %I%
5 # The latest update : %G% at %U%
6 #
7 #%Z% mrcImage.h ver %I%
8 #%Z% Created by tacyas
9 #%Z%
10 #%Z% Usage : mrcImage.h 
11 #%Z% Attention
12 #%Z%
13 */
14
15 /* mrcImage.h
16 *    Language:   C or CC(c++)
17 *    Editor  :   tacyas.tkyemg.u_tokyo
18 *    Date    :   1990-1992
19 *    Modified:   2012 for CCP4(2000) 
20 */
21
22 /*        
23 *       Header File for MRC Format
24 *       Edited by Tac
25 */
26
27 #include <stdio.h>
28 #include <math.h>
29 #include "genUtil.h"
30
31 /* struct begin */
32
33 /* Status Mask */
34 #ifdef M68
35 typedef unsigned int mrcStatusMask;  
36 #else
37 typedef unsigned int mrcStatusMask;
38 #endif
39
40 /* Status */
41 #ifdef M68
42 typedef unsigned int mrcStatusType;
43 #else
44 typedef unsigned int mrcStatusType;
45 #endif
46
47 /* struct end */
48
49 /* constant begin */
50
51 #define  mrcStatusMask_ExitFailure  ((mrcStatusMask)0x80000000L)
52 #define  mrcStatusMask_Warning      ((mrcStatusMask)0x40000000L)
53 #define  mrcStatusMask_Information  ((mrcStatusMask)0x20000000L)
54 #define  mrcStatusMask_Message      ((mrcStatusMask)0x10000000L)
55 #define  mrcStatusMask_1B           ((mrcStatusMask)0x08000000L)
56 #define  mrcStatusMask_1A           ((mrcStatusMask)0x04000000L)
57 #define  mrcStatusMask_19           ((mrcStatusMask)0x02000000L)
58 #define  mrcStatusMask_18           ((mrcStatusMask)0x01000000L)
59 #define  mrcStatusMask_17           ((mrcStatusMask)0x00800000L)
60 #define  mrcStatusMask_16           ((mrcStatusMask)0x00400000L)
61 #define  mrcStatusMask_15           ((mrcStatusMask)0x00200000L)
62 #define  mrcStatusMask_14           ((mrcStatusMask)0x00100000L)
63 #define  mrcStatusMask_ReferMRCInfo ((mrcStatusMask)0x00080000L)
64 #define  mrcStatusMask_Mode         ((mrcStatusMask)0x00040000L)
65 #define  mrcStatusMask_ReferMemory  ((mrcStatusMask)0x00020000L)
66 #define  mrcStatusMask_ReferFile    ((mrcStatusMask)0x00010000L)
67
68 #define  MRC_Status_OK              ((mrcStatusType)0x00000000L)
69
70 #define  MRC_FileCanNotOpened       ((mrcStatusType)0x00000000L|mrcStatusMask_ReferFile)
71 #define  MRC_ImageHeaderCanNotRead  ((mrcStatusType)0x00000001L|mrcStatusMask_ReferFile)
72 #define  MRC_ImageDataCanNotRead    ((mrcStatusType)0x00000002L|mrcStatusMask_ReferFile)
73 #define  MRC_ImageHeaderCanNotWrite ((mrcStatusType)0x00000003L|mrcStatusMask_ReferFile)
74 #define  MRC_ImageDataCanNotWrite   ((mrcStatusType)0x00000004L|mrcStatusMask_ReferFile)
75 #define  MRC_FileCanNotClosed       ((mrcStatusType)0x00000005L|mrcStatusMask_ReferFile)
76
77 #define  MRC_MemoryNotAllocate      ((mrcStatusType)0x00000000L|mrcStatusMask_ReferMemory)
78
79 #define  MRC_ModeNotSupported       ((mrcStatusType)0x00000000L|mrcStatusMask_Mode)
80 #define  MRC_ModeZNot1FFTMode       ((mrcStatusType)0x00000001L|mrcStatusMask_Mode)
81
82 #define  MRC_SizeOfZero             ((mrcStatusType)0x00000000L|mrcStatusMask_ReferMRCInfo)
83
84
85 extern char* mrcImageGeneralTypeList[];
86
87 /* constant end */
88
89 /* struct begin */
90 typedef union MRC_Status_t {
91     mrcStatusType all;
92     struct Content {
93 #ifdef M68
94         unsigned char level;
95         unsigned char category;
96         short detail;
97 #else
98         short detail;
99         unsigned char category;
100         unsigned char level;
101 #endif
102         } status;
103 } MRC_Status_t;
104
105 #ifdef M68
106 typedef int mrcImageParaTypeInteger;
107 #else
108 typedef int mrcImageParaTypeInteger;
109 #endif
110
111 typedef float mrcImageParaTypeReal;
112 typedef unsigned char mrcImageParaTypeCharacter;
113
114 typedef struct mrcImageParaTypeIntegerCoord {
115         mrcImageParaTypeInteger x;
116         mrcImageParaTypeInteger y;
117         mrcImageParaTypeInteger z;
118 } mrcImageParaTypeIntegerCoord;
119
120 typedef struct mrcImageParaTypeRealCoord {
121         mrcImageParaTypeReal x;
122         mrcImageParaTypeReal y;
123         mrcImageParaTypeReal z;
124 } mrcImageParaTypeRealCoord;
125 /* struct end */
126
127 /* 
128 *  MRC Image Header
129 *  Edited by Tac
130 */
131 /* Header Size */
132 /* constant begin */
133 #define MRC_HEADER (1024)
134 #define MRC_TAILER (1024)
135
136 /* Image Data Type */
137 /* for compatibility */
138 typedef mrcImageParaTypeInteger mrcImageMode;
139 #define MRC_char_image           ((mrcImageMode)0)
140 #define MRC_short_image          ((mrcImageMode)1)
141 #define MRC_float_image          ((mrcImageMode)2)
142 #define MRC_complex_short_ft     ((mrcImageMode)3)
143 #define MRC_complex_float_ft     ((mrcImageMode)4)
144 #define MRC_long_image           ((mrcImageMode)101)
145 #define MRC_double_image             ((mrcImageMode)102)
146 #define MRC_complex_long_ft      ((mrcImageMode)103)
147 #define MRC_complex_double_ft    ((mrcImageMode)104)
148 #define MRC_complex_short_fft    ((mrcImageMode)1003)
149 #define MRC_complex_float_fft    ((mrcImageMode)1004)
150 #define MRC_complex_long_fft     ((mrcImageMode)1103)
151 #define MRC_complex_double_fft   ((mrcImageMode)1104)
152 #define MRC_NotSuppotedMode      ((mrcImageMode)0xffffffffL)
153
154 #define mrcCharImage             ((mrcImageMode)0)
155 #define mrcShortImage            ((mrcImageMode)1)
156 #define mrcFloatImage            ((mrcImageMode)2)
157 #define mrcComplexShortFT        ((mrcImageMode)3)
158 #define mrcComplexFloatFT        ((mrcImageMode)4)
159 #define mrcComplexFloatOneDimFT  ((mrcImageMode)5)
160 // Change of IMOD 
161 #define mrcUShortImage           ((mrcImageMode)6)
162 #define mrcCharImageRGB          ((mrcImageMode)16)
163 // Change for IMOD: (6,7) -> (26,27) 
164 #define mrcFloatRadonImage       ((mrcImageMode)26)
165 #define mrcFloatRadonFT          ((mrcImageMode)27)
166 #define mrcLongImage             ((mrcImageMode)101)
167 #define mrcDoubleImage           ((mrcImageMode)102)
168 #define mrcComplexLongFT         ((mrcImageMode)103)
169 #define mrcComplexDoubleFT       ((mrcImageMode)104)
170 #define mrcComplexShortFFT       ((mrcImageMode)1003)
171 #define mrcComplexFloatFFT       ((mrcImageMode)1004)
172 #define mrcComplexLongFFT        ((mrcImageMode)1103)
173 #define mrcComplexDoubleFFT      ((mrcImageMode)1104)
174 #define mrcNotSuppotedMode       ((mrcImageMode)0xffffffffL)
175
176 #define MRC_MAX_LABEL_N    (10)
177 #define MRC_MAX_LABEL_LEN  (80)
178 #define MRC_MAX_EXTRA      (29)
179 #define MRC_MAX_EXTRA_CCP4 (15)
180 /* constant end */
181
182 /* struct begin */
183
184 /* Image Header */
185 typedef struct _mrcImageHeader {
186         mrcImageParaTypeIntegerCoord        N;      /* Data Numbers */
187         mrcImageMode                        Mode;   /* Data Type */
188         mrcImageParaTypeIntegerCoord        StartN; /* First in map */
189         mrcImageParaTypeIntegerCoord        M;      /* Number of Intervals */
190         mrcImageParaTypeRealCoord           Length; /* Cell Dimensions : Angstrom */
191         mrcImageParaTypeReal                Alpha;  /* Cell Angle : Degree */
192         mrcImageParaTypeReal                Beta;
193         mrcImageParaTypeReal                Gamma;
194         mrcImageParaTypeInteger             MAPC;   /* Which Axis Corresponds to Columns */
195         mrcImageParaTypeInteger             MAPR;   /* Which Axis Corresponds to Rows */
196         mrcImageParaTypeInteger             MAPS;   /* Which Axis Corresponds to Sections */
197         mrcImageParaTypeReal                AMin;   /* Minimum Density Value */
198         mrcImageParaTypeReal                AMax;   /* Maximum Density Value */
199         mrcImageParaTypeReal                AMean;  /* Mean Density Value */
200         mrcImageParaTypeInteger             ISPG;   /* Space Group */
201         mrcImageParaTypeInteger             NSYMBT; /* Number of bytes */
202         mrcImageParaTypeReal                EXTRA[MRC_MAX_EXTRA]; /* Extra, user defined storage space */
203     mrcImageParaTypeReal                OriginX;
204     mrcImageParaTypeReal                OriginY;
205     mrcImageParaTypeInteger             LabelN;
206     char                                Label[MRC_MAX_LABEL_N][MRC_MAX_LABEL_LEN];
207 } _mrcImageHeader;
208
209 /* For CCP4 2000 : Current New */
210 typedef struct _mrcImageHeaderCCP4 {
211         mrcImageParaTypeIntegerCoord        N;      /* Data Numbers */
212         mrcImageMode                        Mode;   /* Data Type */
213         mrcImageParaTypeIntegerCoord        StartN; /* First in map */
214         mrcImageParaTypeIntegerCoord        NI;     /* Number of Intervals */
215         mrcImageParaTypeRealCoord           Length; /* Cell Dimensions : Angstrom */
216         mrcImageParaTypeReal                Alpha;  /* Cell Angle : Degree */
217         mrcImageParaTypeReal                Beta;
218         mrcImageParaTypeReal                Gamma;
219         mrcImageParaTypeInteger             MAPC;   /* Which Axis Corresponds to Columns */
220         mrcImageParaTypeInteger             MAPR;   /* Which Axis Corresponds to Rows */
221         mrcImageParaTypeInteger             MAPS;   /* Which Axis Corresponds to Sections */
222         mrcImageParaTypeReal                AMin;   /* Minimum Density Value */
223         mrcImageParaTypeReal                AMax;   /* Maximum Density Value */
224         mrcImageParaTypeReal                AMean;  /* Mean Density Value */
225         mrcImageParaTypeInteger             ISPG;   /* Space Group */
226         mrcImageParaTypeInteger             NSYMBT; /* Number of bytes used for storing symmetry operators */
227         mrcImageParaTypeInteger             LSKFLG; /* Flag for Skew transformation */
228         mrcImageParaTypeReal                            SKWMAT[9]; /* Skew matrix S */
229         mrcImageParaTypeReal                            SKWTRN[3]; /* Skew translation */
230         mrcImageParaTypeReal                EXTRA[MRC_MAX_EXTRA_CCP4]; /* Extra, user defined storage space */
231     mrcImageParaTypeCharacter                   MAP[4];
232     mrcImageParaTypeInteger                     MARCHST;
233     mrcImageParaTypeReal                ARMS;
234     mrcImageParaTypeInteger             LabelN;
235     char                                Label[MRC_MAX_LABEL_N][MRC_MAX_LABEL_LEN];
236 } _mrcImageHeaderCCP4;
237
238 /* For IMOD: Current New */
239 typedef struct _mrcImageHeaderIMOD {
240         mrcImageParaTypeIntegerCoord        N;      /* Data Numbers */
241         mrcImageMode                        Mode;   /* Data Type */
242         mrcImageParaTypeIntegerCoord        StartN; /* First in map */
243         mrcImageParaTypeIntegerCoord        M;      /* Number of Intervals */
244         mrcImageParaTypeRealCoord           Length; /* PixelSize=Len/M: Angstrom */
245         mrcImageParaTypeReal                Alpha;  /* Cell Angle : Degree */
246         mrcImageParaTypeReal                Beta;
247         mrcImageParaTypeReal                Gamma;
248         mrcImageParaTypeInteger             MAPC;   /* Which Axis Corresponds to Columns */
249         mrcImageParaTypeInteger             MAPR;   /* Which Axis Corresponds to Rows */
250         mrcImageParaTypeInteger             MAPS;   /* Which Axis Corresponds to Sections */
251         mrcImageParaTypeReal                AMin;   /* Minimum Density Value */
252         mrcImageParaTypeReal                AMax;   /* Maximum Density Value */
253         mrcImageParaTypeReal                AMean;  /* Mean Density Value */
254         mrcImageParaTypeInteger             ISPG;   /* Space Group */
255         mrcImageParaTypeInteger             NSYMBT; /* Number of bytes used for extended header */
256         short                               creatid; /* Flag for Skew transformation */
257         short                               extra1[15]; /* Flag for Skew transformation */
258         short                               nint;
259         short                               nreal; /*l Skew matrix S */
260         mrcImageParaTypeReal                extra2[5]; /* Extra, user defined storage space */
261         mrcImageParaTypeInteger             imodStamp;   
262         mrcImageParaTypeInteger             imodFlags;   
263         short                               idtype;   
264         short                               lnes;   
265         short                               nd1;   
266         short                               nd2;   
267         short                               vd1;   
268         short                               vd2;   
269         mrcImageParaTypeReal                tiltangles[6]; /* Extra, user defined storage space */
270         mrcImageParaTypeReal                xorg; /* Extra, user defined storage space */
271         mrcImageParaTypeReal                yorg; /* Extra, user defined storage space */
272         mrcImageParaTypeReal                zorg; /* Extra, user defined storage space */
273     mrcImageParaTypeCharacter                   MAP[4];
274     mrcImageParaTypeInteger                     MARCHST;
275     mrcImageParaTypeReal                ARMS;
276     mrcImageParaTypeInteger             LabelN;
277     char                                Label[MRC_MAX_LABEL_N][MRC_MAX_LABEL_LEN];
278 } _mrcImageHeaderIMOD;
279
280
281 typedef union mrcImageHeader {
282   unsigned char           All[MRC_HEADER];
283   mrcImageParaTypeInteger Int[MRC_HEADER/4];
284   mrcImageParaTypeReal    Real[MRC_HEADER/4];
285   _mrcImageHeader         Cont;
286   _mrcImageHeaderCCP4     ContCCP4;
287   _mrcImageHeaderIMOD     ContIMOD;
288 } mrcImageHeader;
289
290
291 #define FEI_EXTENDED_HEADER_EACH (128) 
292
293 typedef struct _FEIextendedHeader {
294         mrcImageParaTypeReal aTilt;   // Alpha tilt, in degrees
295         mrcImageParaTypeReal bTilt;   // Beta tilt, in degrees 
296         mrcImageParaTypeReal xStage;  // Stage x position. 
297                                                                   // Normally in SI units (meters), 
298                                                                   // but some older files may be in micrometers. 
299                                                                   // Check by looking at values for x,y,z. 
300                                                                   // If one of these exceeds 1, it will be micrometers.
301         mrcImageParaTypeReal yStage;  // Stage y position. For testing of units see x_stage.
302         mrcImageParaTypeReal zStage;  // Stage z position. For testing of units see x_stage.
303         mrcImageParaTypeReal xShift;  // Image shift x. For testing of units see x_stage.
304         mrcImageParaTypeReal yShift;  // Image shift y. For testing of units see x_stage.
305         mrcImageParaTypeReal defocus;  
306         mrcImageParaTypeReal expTime;  
307         mrcImageParaTypeReal mean;  
308         mrcImageParaTypeReal tiltAxis;  
309         mrcImageParaTypeReal pixelSize;  
310         mrcImageParaTypeReal magnification;  
311         mrcImageParaTypeReal ht;  
312         mrcImageParaTypeReal binning;  
313         mrcImageParaTypeReal appliedDefocus;  
314         mrcImageParaTypeReal reminder[FEI_EXTENDED_HEADER_EACH/4-16];  
315 } _FEIextendedHeader;
316
317 typedef union FEIextendedHeader {
318         mrcImageParaTypeReal Real[FEI_EXTENDED_HEADER_EACH/4];
319         _FEIextendedHeader   Cont;
320 } FEIextendedHeader;
321
322
323 /* struct end */
324
325 /*
326         Tailer
327 */
328 /* constant begin */
329 #define  mrcImageTailerMode2DProjection 0
330 /* constant end */
331
332 /* struct begin */
333 typedef struct _mrcImageTailer {
334         char                            Code[4]; 
335         mrcImageParaTypeInteger         Mode;  
336         char                        EulerAngleMode[4];
337         mrcImageParaTypeReal            Rot1;   
338         mrcImageParaTypeReal            Rot2;
339         mrcImageParaTypeReal            Rot3;
340         mrcImageParaTypeInteger         Mirror;
341 } _mrcImageTailer;
342
343
344 typedef union mrcImageTailer {
345   unsigned char           All[MRC_TAILER];
346   mrcImageParaTypeInteger Int[MRC_TAILER/4];
347   mrcImageParaTypeReal    Real[MRC_TAILER/4];
348   _mrcImageTailer         Cont;
349 } mrcImageTailer;
350
351
352 typedef char mrcImageSymmetryOperator;
353
354 /* 
355 mrcImage Structure 
356 */
357 typedef struct mrcImage {
358     mrcImageHeader          Header;
359     size_t BytePerImage;
360     mrcImageParaTypeInteger BytePerBand;
361     mrcImageParaTypeInteger BandPerPixel;
362     size_t PixelPerImage;
363     mrcStatusType           status;
364     char*           Image;
365     unsigned char*  ImageCharImage;
366     unsigned short* ImageShortImage;
367     unsigned long*  ImageLongImage;
368     float*          ImageFloatImage;
369     double*         ImageDoubleImage;
370
371         /* Tailer */
372         mrcImageTailer*         Tailer; 
373         mrcImageParaTypeInteger numTailer;
374
375         /* FEIextendedHeader */
376         FEIextendedHeader*      FEIHeader;
377         mrcImageParaTypeInteger numFEIHeader;
378
379         /* Dummy */
380         char*     dummyHeader;
381         mrcImageParaTypeInteger dummyHeaderByte;
382
383         /* Swap Bytes */
384         mrcImageParaTypeInteger flagByteSwap;
385
386         /* flag CCP4-2000 */
387         mrcImageParaTypeInteger   flagCCP4;
388         mrcImageParaTypeInteger   ImageOffset; 
389         mrcImageSymmetryOperator* SymmetryOperator;
390 } mrcImage;
391
392 typedef struct mrcImageInformation {
393     double mean;
394     double rootMeanSquare;
395     double meanOfSphereSurface;
396     double sdOfSphereSurface;
397     double seOfSphereSurface;
398     double meanOfCylinderSurface;
399     double sdOfCylinderSurface;
400     double seOfCylinderSurface;
401     double meanOfEdge;
402     double sdOfEdge;
403     double seOfEdge;
404     double max;
405         mrcImageParaTypeRealCoord maxCoord;
406     double min;
407         mrcImageParaTypeRealCoord minCoord;
408     double sd;
409     double se;
410         double rmax;
411         long flagrmax;
412         double RMS; /* Root mean square */
413         int mode;
414
415         /* For Search Area */
416         int flagXrange;
417         int flagYrange;
418         int flagZrange;
419         double XrangeMin; 
420         double XrangeMax; 
421         double YrangeMin; 
422         double YrangeMax; 
423         double ZrangeMin; 
424         double ZrangeMax; 
425
426         int flagCentre;
427         double CentreX;
428         double CentreY;
429         double CentreZ;
430 } mrcImageInformation;
431
432 /* struct end */
433
434 /* constant begin */
435 typedef enum mrcImageInformationMode {
436         meanOfAll             = 0,
437     meanOfSphereSurface   = 1,
438     meanOfCylinderSurface = 2,
439     meanOfEdge            = 3, 
440     meanOfCentre          = 4,
441     meanOfSparse          = 5,
442         meanOf2DEdgeY         = 6,
443         RMSofAllPixels       = 7
444 } mrcImageInformationMode;
445
446 /* 
447 *  Define
448 */
449 #define HeaderN       Header.Cont.N       
450 #define HeaderMode    Header.Cont.Mode    
451 #define HeaderStartN  Header.Cont.StartN  
452 #define HeaderM       Header.Cont.M       
453 #define HeaderLength  Header.Cont.Length  
454 #define HeaderAlpha   Header.Cont.Alpha   
455 #define HeaderBeta    Header.Cont.Beta    
456 #define HeaderGamma   Header.Cont.Gamma   
457 #define HeaderMAPC    Header.Cont.MAPC    
458 #define HeaderMAPR    Header.Cont.MAPR    
459 #define HeaderMAPS    Header.Cont.MAPS    
460 #define HeaderAMin    Header.Cont.AMin    
461 #define HeaderAMax    Header.Cont.AMax    
462 #define HeaderAMean   Header.Cont.AMean   
463 #define HeaderISPG    Header.Cont.ISPG    
464 #define HeaderNSYMBT  Header.Cont.NSYMBT  
465 #define HeaderLSKFLG  Header.ContCCP4.LSKFLG
466 #define HeaderEXTRA   Header.Cont.EXTRA
467 #define HeaderOriginX Header.Cont.OriginX 
468 #define HeaderOriginY Header.Cont.OriginY  
469 #define HeaderLabelN  Header.Cont.LabelN
470 #define HeaderLabel   Header.Cont.Label
471
472 typedef enum mrcPixelDataType {
473     mrcPixelRePart = 0,
474     mrcPixelImPart,
475     mrcPixelMag,
476     mrcPixelPow,
477     mrcPixelLogMag,
478     mrcPixelLogPow,
479     mrcPixelPhase
480 } mrcPixelDataType;
481
482 typedef enum mrcPixelDataHowToGet {
483     mrcPixelHowNearest = 0,
484     mrcPixelHowLinear,
485     mrcPixelHowCubicConv,
486     mrcPixelHowPolySig
487 } mrcPixelDataHowToGet;
488
489 /* constant end */
490
491 /* struct begin */
492 typedef struct lmrcImageSmoothingInfo  {
493         long mode;
494         mrcImageParaTypeReal sx; /* Filter kernel size */
495         mrcImageParaTypeReal sy;
496         mrcImageParaTypeReal sz;
497         double sigma;            /* for Lee-Sigma filter  */
498 } lmrcImageSmoothingInfo;
499
500 typedef struct lmrcImageCVEInfo {
501         long sx; /* CVE domain size. */
502         long sy; /* Apr.30,1996 */
503         long sz;
504 } lmrcImageCVEInfo;
505
506 typedef struct lmrcImageTfunctionInfo {
507         long sx; /* Tfunction domain size. */
508         long sy; /* June 11,1996 */
509         long sz;
510 } lmrcImageTfunctionInfo;
511
512 typedef struct lmrcImageHighlightInfo {
513         long mode;
514         float Bias; /* May 1,1996 */
515         float Grad;
516 } lmrcImageHighlightInfo;
517
518 typedef struct lmrcImageLowPassFilterInfo 
519 {
520         long mode; /* June 4,1996 */
521         float hvp, width;
522 } lmrcImageLowPassFilterInfo;
523
524 typedef struct lmrcImageHighPassFilterInfo 
525 {
526         long mode; /* June 5,1996 */
527         float hvp, width;
528         float pathWindowLow;
529         float pathWindowHigh;
530 } lmrcImageHighPassFilterInfo;
531
532 typedef struct lmrcImageBandPassFilterInfo 
533 {
534         long mode; /* June 5,1996 */
535         float hvl, hvh, wl, wh;
536         int flagLowWeight;
537         double lowWeight;
538 } lmrcImageBandPassFilterInfo;
539
540 /* struct end */
541 /* Utility Routines */
542 #ifdef __cplusplus
543 extern "C" {
544 #endif
545 /* prototype begin */
546 /* in mrcInit.c */
547 extern mrcStatusType mrcInit(mrcImage* mrc, char* filaname);
548 extern mrcStatusType mrcDefaultHeaderValueSet(mrcImage* mrc);
549 extern mrcStatusType mrcDefaultHeaderValueSetOnlyFixedValue(mrcImage* mrc);
550 extern mrcStatusType mrcHiddenDataSet(mrcImage* mrc, long mode);
551 extern void mrcImageFree(mrcImage* mrc, char* message);
552 /* in mrcTailer.c */
553 extern void mrcTailerInit(mrcImage* mrc, long mode);
554 extern void mrcTailerCopy(mrcImage* dst, mrcImage* src, long mode); 
555   /* mode 1: Tailer Memory Allocation */
556 /* in mrcRead.c */
557 extern mrcStatusType mrcFileReadGeneral  (mrcImage* mrc, char* filename, char* type, char* message, long mode);
558 extern mrcStatusType mrcImageReadGeneral  (mrcImage* mrc, char* filename, char* type, char* message, long mode);
559 extern mrcStatusType mrcHeaderReadGeneral(mrcImage* mrc, char* filename, char* type, char* message, long mode);
560 extern mrcStatusType mrcTailerReadGeneral(mrcImage* mrc, char* filename, char* type, char* message, long mode);
561 extern mrcStatusType mrcFileGeneralListPrint(FILE* fpt); 
562
563 extern mrcStatusType mrcFileRead  (mrcImage* mrc, char* filename, char* message, long mode);
564 extern mrcStatusType mrcImageRead (mrcImage* mrc, char* filename, char* message, long mode);
565 extern mrcStatusType mrcHeaderRead(mrcImage* mrc, char* filename, char* message, long mode);
566 extern mrcStatusType mrcTailerRead(mrcImage* mrc, char* filename, char* message, long mode);
567
568 extern mrcStatusType mrcFileReadFEIextendedMRC  (mrcImage* mrc, char* filename, char* message, long mode);
569 extern mrcStatusType mrcImageReadFEIextendedMRC (mrcImage* mrc, char* filename, char* message, long mode);
570 extern mrcStatusType mrcHeaderReadFEIextendedMRC(mrcImage* mrc, char* filename, char* message, long mode);
571 extern mrcStatusType mrcTailerReadFEIextendedMRC(mrcImage* mrc, char* filename, char* message, long mode);
572
573 extern mrcStatusType mrcFileReadIMODextendedMRC  (mrcImage* mrc, char* filename, char* message, long mode);
574 extern mrcStatusType mrcImageReadIMODextendedMRC (mrcImage* mrc, char* filename, char* message, long mode);
575 extern mrcStatusType mrcHeaderReadIMODextendedMRC(mrcImage* mrc, char* filename, char* message, long mode);
576 extern mrcStatusType mrcTailerReadIMODextendedMRC(mrcImage* mrc, char* filename, char* message, long mode);
577
578 extern int mrcImageByteSwap(mrcImage* mrc, long mode);
579 /* in mrcWrite.c */
580 #define mrcFileWriteModeGet(x)     BYTE4GETBYTE(x,0)
581 #define mrcImageWriteModeGet(x)    BYTE4GETBYTE(x,1)
582 #define mrcHeaderWriteModeGet(x)   BYTE4GETBYTE(x,2)
583 #define mrcTailerWriteModeGet(x)   BYTE4GETBYTE(x,3)
584
585 #define mrcFileWriteMode_InfoPrint         1
586 #define mrcFileWriteMode_NoCallForStatData 2
587
588 extern mrcStatusType mrcFileWrite  (mrcImage* mrc, char* filename, char* message, long mode);
589 extern mrcStatusType mrcImageWrite (mrcImage* mrc, char* filename, char* message, long mode);
590 extern mrcStatusType mrcHeaderWrite(mrcImage* mrc, char* filename, char* message, long mode);
591 extern mrcStatusType mrcTailerWrite(mrcImage* mrc, char* filename, char* message, long mode);
592 /* in mrcWrite.c */
593 extern mrcStatusType mrcFileWriteLowerResolution(mrcImage* mrc, char* filename, char* message, long sample , long mode);
594 /* in mrcGet.c */
595 extern double mrcImageDataGetbyAU(mrcImage* mrc,
596                               mrcImageParaTypeReal x /* Angstrom */,
597                               mrcImageParaTypeReal y /* Angstrom */,
598                               mrcImageParaTypeReal z /* Angstrom */,
599                               double* data,
600                               mrcPixelDataType mode,
601                               mrcPixelDataHowToGet how);
602 extern double mrcPixelDataGet(mrcImage* mrc,
603                               mrcImageParaTypeReal x /* Pixel Unit */,
604                               mrcImageParaTypeReal y /* Pixel Unit */, 
605                               mrcImageParaTypeReal z /* Pixel Unit */,
606                               double* data,
607                               mrcPixelDataType mode,
608                               mrcPixelDataHowToGet how);
609
610 static inline double mrcPixelDataGetFloatImage(mrcImage* img, 
611                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z)
612 {
613         return img->ImageFloatImage[x + y*img->HeaderN.x + z*img->HeaderN.x*img->HeaderN.y];
614 }
615
616 static inline double mrcPixelDataGetFloatFTRe(mrcImage* fft, 
617                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z)
618 {
619         return fft->ImageFloatImage[2*(x + y*(fft->HeaderN.x/2+1) + z*(fft->HeaderN.x/2+1)*fft->HeaderN.y)];
620 }
621 static inline double mrcPixelDataGetFloatFTIm(mrcImage* fft, 
622                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z)
623 {
624         return fft->ImageFloatImage[2*(x + y*(fft->HeaderN.x/2+1) + z*(fft->HeaderN.x/2+1)*fft->HeaderN.y)+1];
625 }
626
627 /* in mrcImageSet.c */
628 extern void mrcInfoSet(mrcImage* mrc, FILE* fptIn, FILE* fptOut, mrcImageParaTypeInteger mode);
629
630 /* prototype end */
631
632 /* struct begin */
633 /* in mrcImageDataSet.c */
634 typedef enum mrcImageDataSetMode {
635         mrcImageDataSetModeCentre = 0,
636         mrcImageDataSetModeOrigin = 1
637 } mrcImageDataSetMode;
638 /* struct end */
639
640 /* prototype begin */
641 extern void mrcImageDataSet(mrcImage* out, 
642                                                         mrcImage* in, 
643                                                         mrcImageParaTypeReal x,
644                                                         mrcImageParaTypeReal y,
645                                                         mrcImageParaTypeReal z,
646                                                         float phi,
647                                                         mrcImageDataSetMode  mode);
648
649 /* in mrcSet.c */
650 extern double mrcImageDataSetbyAU(mrcImage* mrc,
651                               mrcImageParaTypeReal x /* Angstrom */,
652                               mrcImageParaTypeReal y /* Angstrom */,
653                               mrcImageParaTypeReal z /* Angstrom */,
654                               double data,
655                               mrcPixelDataType mode);
656 extern double mrcPixelDataSet(mrcImage* mrc,
657                               mrcImageParaTypeReal x /* Pixel Unit */,
658                               mrcImageParaTypeReal y /* Pixel Unit */,
659                               mrcImageParaTypeReal z /* Pixel Unit */,
660                               double data,
661                               mrcPixelDataType mode);
662
663 static inline void mrcPixelDataSetFloatImage(mrcImage* img, 
664                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z, double data)
665 {
666         img->ImageFloatImage[x + y*img->HeaderN.x + z*img->HeaderN.x*img->HeaderN.y] = (float)data;
667 }
668
669 static inline void mrcPixelDataSetFloatFTRe(mrcImage* fft, 
670                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z, double data)
671 {
672         fft->ImageFloatImage[2*(x + y*(fft->HeaderN.x/2+1) + z*(fft->HeaderN.x/2+1)*fft->HeaderN.y)] = (float)data;
673 }
674
675 static inline void mrcPixelDataSetFloatFTIm(mrcImage* fft, 
676                 mrcImageParaTypeInteger x, mrcImageParaTypeInteger y, mrcImageParaTypeInteger z, double data)
677 {
678         fft->ImageFloatImage[2*(x + y*(fft->HeaderN.x/2+1) + z*(fft->HeaderN.x/2+1)*fft->HeaderN.y)+1] = (float)data;
679 }
680
681
682 extern void mrcStatDataSet(mrcImage* mrc, mrcImageParaTypeInteger mode);
683
684
685
686 /* in mrcImageInfo.c */
687 extern void lmrcImageXSection(mrcImage* proj, mrcImage* img, double Y);
688 extern void lmrcImageYSection(mrcImage* proj, mrcImage* img, double X);
689 extern void lmrcImageXProjection(mrcImage* proj, mrcImage* img);
690 extern void lmrcImageYProjection(mrcImage* proj, mrcImage* img);
691 extern void lmrcImageZProjection(mrcImage* proj, mrcImage* img);
692 extern void lmrcImageXYProjection(mrcImage* proj, mrcImage* img);
693 extern void lmrcImageYZProjection(mrcImage* proj, mrcImage* img);
694 extern void lmrcImageZXProjection(mrcImage* proj, mrcImage* img);
695         /* Histgram */
696         /* Frequecy max -> 1 */ 
697 extern void lmrcImageHistgram(double** hist, unsigned long nlevel, mrcImage* img);
698 extern void lmrcImageHistgram2(double** hist, double delta, mrcImage* img);
699 extern void lmrcImageHistgram5(double** hist, unsigned long nlevel, double Low, double High, mrcImage* img);
700         /* Frequency */ 
701 extern void lmrcImageHistgram3(double** hist, unsigned long nlevel, mrcImage* img);
702 extern void lmrcImageHistgram4(double** hist, double delta, mrcImage* img);
703 extern void lmrcImageHistgram6(double** hist, unsigned long nlevel, double Low, double High, mrcImage* img);
704 extern void lmrcImageInformation(mrcImageInformation* info, mrcImage* img);
705
706
707 /* in mrcImageCopy.c */
708 extern void lmrcImageCopy(mrcImage* dst, mrcImage* src, mrcImageParaTypeRealCoord to);
709
710 /* in mrcUtil.c */
711 extern int IsFloatImage(mrcImage* mrc, char* message, mrcImageParaTypeInteger mode);
712 extern int IsFloatFT(mrcImage* mrc, char* message, mrcImageParaTypeInteger mode);
713 extern int IsImage(mrcImage* mrc, char* message, mrcImageParaTypeInteger mode);
714 extern int IsFT(mrcImage* mrc, char* message, mrcImageParaTypeInteger mode);
715 extern int IsFFT(mrcImage* mrc, char* message, mrcImageParaTypeInteger mode);
716 extern void mrcImageInfoSet(mrcImage* mrc, FILE* fptIn, FILE* fptOut, long mode);
717
718 /* in mrcImageOperation.c */
719 extern void lmrcImageDevidedByImage(mrcImage* img, mrcImage* i1, mrcImage* i2);
720 extern void lmrcImagetMapForZero(mrcImage* t, mrcImage* avg, mrcImage* se);
721 extern void lmrcImageSN(mrcImage* sn, mrcImage* avg, mrcImage* sig);
722 extern void lmrcImageDevidedByReal(mrcImage* img, double d);
723 extern void lmrcImageDevidedByRealForOnlyPositive(mrcImage* img, double d);
724 extern void lmrcImageAddedByReal(mrcImage* img, double d);
725 extern void lmrcImageStdDev(mrcImage* sig, mrcImage* avg, mrcImage* avg2, long num);
726 extern void lmrcImageStdErr(mrcImage* sig, mrcImage* avg, mrcImage* avg2, long num);
727 extern void lmrcImageAdd(mrcImage* img2, mrcImage* img1, long* num);
728 extern void lmrcSQRImageAdd(mrcImage* img2, mrcImage* img1, long* num);
729 extern void lmrcImageSquare(mrcImage* in);
730 extern void lmrcImageRoot(mrcImage* in ,double eps);
731 extern void lmrcImageAbs(mrcImage* out, mrcImage* in);
732 extern void lmrcImageConvolution(mrcImage* out, mrcImage* in,  mrcImage* kernel, int mode);
733
734 /* in mrcImageToIntImage.c */
735 extern void lmrcImageToIntImage(mrcImage* dst, mrcImage* src, mrcImageParaTypeInteger mode);
736
737
738 extern void lfft2d(mrcImage* fft, mrcImage* img);
739
740 extern void lmrcImageFFT(mrcImage* fft, mrcImage* img, long mode);
741 extern void lmrcImageFFTFirstDimensionOnly(mrcImage* fft, mrcImage* img, long mode);
742 #ifdef FFTW
743 extern void lmrcImageFFTWFlagSet(unsigned int flag);
744 #endif
745 extern void lmrcFFTFGconj(mrcImage* out, mrcImage* in1, mrcImage* in2);
746 extern void lmrcFFTFxG(mrcImage* out, mrcImage* in1, mrcImage* in2);
747 extern void lmrcImageCorrelation(mrcImage* out, mrcImage* in, mrcImage* ref, long mode);
748 extern void lmrcImageCorrelationModePrint(FILE* fpt);
749
750 #include "ctfInfo.h"
751 extern void lmrcImageCorrelationWithCTFCompensation(mrcImage* out, mrcImage* in, ctfInfo* inctf, mrcImage* ref, ctfInfo* refctf, long mode);
752
753
754 /* in mrcError.c */
755 extern mrcStatusType mrcError(char* message, char* inRtnName, char* callRtnName, mrcStatusType status);
756 extern mrcStatusType mrcErrorMsg(FILE* fpt, char* message, char* inRtnName, char* callRtnName, mrcStatusType status);
757 /* in lmrcFFTInfo.c */
758 #include "Vector.h"
759 extern floatVector* lmrcFSInfoXAxisMag(mrcImage* fft);
760 extern floatVector* lmrcFSInfoXAxisPhase(mrcImage* fft);
761 extern floatVector* lmrcFSInfoYAxisMag(mrcImage* fft);
762 extern floatVector* lmrcFSInfoYAxisPhase(mrcImage* fft);
763 /* The returned values are not magnitudes but powers */
764 extern floatVector* lmrcFSInfoScatteringAngularDistribution(mrcImage* fft);
765 extern floatVector* lmrcFSInfoScatteringAngularDistributionAverage(mrcImage* fft);
766 extern floatVector* lmrcFSInfoScatteringAngularDistributionSD(mrcImage* fft);
767 extern floatVector* lmrcFSInfoSpacing(mrcImage* fft);
768
769 /* in mrcImageCheckSameSize.c */
770 extern void lmrcImageCheckSameSize(mrcImage* in, mrcImage* ref);
771
772 /* in mrcImageCheckFFT.c */
773 extern void lmrcImageCheckFFT(mrcImage* in, mrcImage* ref);
774
775 /* in lmrcImageSmoothing */
776 extern void lmrcImageSmoothingModeInfo(FILE* fpt);
777 extern void lmrcImageSmoothing(mrcImage* dst, mrcImage* src, lmrcImageSmoothingInfo* info, long mode);
778
779 /* in lmrcImageCVE */
780 extern void lmrcImageCVE(mrcImage* dst, mrcImage* src, lmrcImageCVEInfo* info);
781
782 /* in lmrcImageTfunction */
783 extern void lmrcImageTfunction(mrcImage* dst, mrcImage* src, lmrcImageTfunctionInfo* info, long mode);
784
785 /* in lmrcImageHighlighting */
786 extern void lmrcImageHighlightingInfoPrint(FILE* fpt);
787 extern void lmrcImageHighlighting(mrcImage* dst, mrcImage* src, lmrcImageHighlightInfo* info);
788
789 /* in lmrcImageLowPassFilter */
790 extern void lmrcImageLowPassFilter(mrcImage* dst, mrcImage* src, lmrcImageLowPassFilterInfo* info, long mode);
791
792 /* in lmrcImageHighPassFilter */
793 extern void lmrcImageHighPassFilter(mrcImage* dst, mrcImage* src, lmrcImageHighPassFilterInfo* info, long mode);
794
795 /* in lmrcImageBandPassFilter */
796 extern void lmrcImageBandPassFilter(mrcImage* dst, mrcImage* src, lmrcImageBandPassFilterInfo* info, long mode);
797
798 /* in lmrcImageShrink */
799 extern void lmrcImageShrink(mrcImage* dst, mrcImage* src, mrcImageParaTypeIntegerCoord S, long mode);
800
801 /* in lmrcImageShift */
802 extern void lmrcImageShift(mrcImage* out, mrcImage* in, mrcImageParaTypeRealCoord shift, mrcPixelDataHowToGet mode);
803 extern void lmrcImageShiftFollowingGC(mrcImage* out, mrcImage* in, int mode);
804
805 /* in mrcImagePrint */
806 extern  void mrcInfoPrint(FILE* fpt, mrcImage* mrc, mrcImageParaTypeInteger mode);
807
808
809 /* prototype end */
810
811 /* in lmrcImageMultiCTFCompensation.c */
812 /* struct begin */
813 #include "ctfInfo.h"
814 typedef enum lmrcImageMultiCTFCompensationSolventFlatteningMode {
815         lmrcImageMultiCTFCompensationSolventFlatteningModeDensityPeakIsSolvent=0,
816         lmrcImageMultiCTFCompensationSolventFlatteningModeDefinedSTDIsSolvent=1
817 } lmrcImageMultiCTFCompensationSolventFlatteningMode;
818
819 typedef struct lmrcImageMultiCTFCompensationInfo {
820         long   maxiteration;
821         double okrms;
822         long   diversefactor;
823         double z;
824         long   nhist;
825         FILE*  logfile;
826         lmrcImageMultiCTFCompensationSolventFlatteningMode solventMode;
827         float  definedSTD;              
828 } lmrcImageMultiCTFCompensationInfo;
829 /* struct end */
830
831 #include "ctfInfo.h"
832
833 /* prototype begin */
834
835 extern void lmrcImageMultiCTFCompensationInfoInit(lmrcImageMultiCTFCompensationInfo* info);
836 extern void lmrcImageMultiCTFCompensationInfoSet(lmrcImageMultiCTFCompensationInfo* info);
837 extern void lmrcImageMultiCTFCompensation(mrcImage* dst, mrcImage* src, ctfInfo* ctf, long nfile, lmrcImageMultiCTFCompensationInfo info, long mode);
838
839 /* in lmrcImageCTFObservation.c */
840 extern void lmrcImageCTFObservation(mrcImage* dst, mrcImage* src, ctfInfo* ctf, long mode);
841 extern void lmrcImagesCTFObservation(mrcImage* dst, mrcImage* src, ctfInfo* ctf, long mode);
842
843 /* in lmrcImageCTFCompensation.c */
844 extern void lmrcImageCTFCompensation(mrcImage* src, ctfInfo* ctf, long mode);
845
846 /* prototype end */
847
848
849 /* in lmrcImageCTFSN.c */
850 /* struct begin */
851 typedef struct lmrcImageCTFSNInfo
852 {
853         long mode, deg1, deg2;
854         ctfInfo ctf;
855 } lmrcImageCTFSNInfo;
856 /* struct end */
857
858 /* prototype begin */
859 extern void lmrcImageCTFSN(mrcImage *outMrc, const mrcImage *inMrc, lmrcImageCTFSNInfo *info, long mode);
860 /* prototype end */
861
862 /* in lmrcImageFourierPowerSpectrum.c */
863 /* struct begin */
864 typedef struct mrcImageFourierPowerSpectrum
865 {
866         long n;
867         double d, *h;
868 } mrcImageFourierPowerSpectrum;
869
870 typedef struct lmrcImageFourierPowerSpectrumInfo
871 {
872         double dX, dY, dZ;
873 } lmrcImageFourierPowerSpectrumInfo;
874 /* struct end */
875
876 /* prototype begin */
877
878 extern mrcImageFourierPowerSpectrum lmrcImageFourierPowerSpectrumMakeSpectrum(const mrcImage *inFFT, lmrcImageFourierPowerSpectrumInfo *info);
879 extern void lmrcImageFourierPowerSpectrumDeleteSpectrum(mrcImageFourierPowerSpectrum theSpectrum);
880 extern mrcImageFourierPowerSpectrum lmrcImageFourierPowerSpectrum(const mrcImage *inMrc, lmrcImageFourierPowerSpectrumInfo *info, long mode);
881
882 extern void lmrcImageRotation3DModePrint(FILE* fpt);
883 extern void lmrcImageRotation3DFollowingEulerAngle(mrcImage* dst, mrcImage* src, const char* m, 
884         mrcImageParaTypeReal rot1, mrcImageParaTypeReal rot2, mrcImageParaTypeReal rot3, mrcPixelDataHowToGet mode, int mode2);
885
886 #include "Matrix3D.h"
887 extern void lmrcImageRotation3DFollowingMatrix3D(mrcImage* dst, mrcImage* src, Matrix3D mat, mrcPixelDataHowToGet mode, int mode2);
888
889 extern void lmrcImageRotation3DZXY(mrcImage* dst, mrcImage* src,  
890         mrcImageParaTypeReal rotx, mrcImageParaTypeReal roty, mrcImageParaTypeReal rotz, mrcPixelDataHowToGet mode, int mode2);
891
892 extern void lmrcImageRotation2D(mrcImage* dst, mrcImage* src, double angle, mrcPixelDataHowToGet mode);
893 extern void lmrcImageRotation2DPeriodicBoundary(mrcImage* dst, mrcImage* src, double angle, mrcPixelDataHowToGet mode);
894
895 /* in mrcImageSectionGet.c */
896 extern char* mrcImageSectionGetModeDescription(long mode);
897 extern void mrcImageSectionGet(mrcImage* dst, mrcImage* src, mrcImageParaTypeReal z, long mode);
898
899 /* in mrcImageSectionSet.c */
900 extern void mrcImageSectionSet(mrcImage* dst, mrcImage* src, mrcImageParaTypeReal z, long mode);
901
902
903 extern double lmrcImageMaxDataGet(mrcImage* src, long mode);
904
905 /* prototype end */
906
907 #ifdef __cplusplus
908 };
909 #endif
910
911 #endif  /* MRC_IMAGE_H */