OSDN Git Service

63b17c446bf7f43d047e306504a13eff4fe97f01
[eos/base.git] / src / Tools / mrcImage / mrcImageEdgeImageGet / src / mrcImageEdgeImageGet.c
1 /*
2 # mrcImageEdgeImageGet : $Revision$  
3 # $Date$ 
4 # Created by $Author$
5 # Usage : mrcImageEdgeImageGet
6 # Attention
7 #   $Loccker$
8 #       $State$ 
9 #
10 */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>                  
15 #define GLOBAL_DECLARATION
16 #include "../inc/config.h"
17
18 #undef DEBUG
19 #include "genUtil.h"
20 #include "Memory.h"
21 #include "eosString.h"
22 #include "mrcImage.h"
23
24 typedef struct lmrcImageEdgeImageGetInfo {
25         int   Size;
26         int   numImage;
27 } lmrcImageEdgeImageGetInfo;
28
29 typedef enum lmrcImageEdgeImageGetMode {
30         lmrcImageEdgeImageGetModeFour=0,
31         lmrcImageEdgeImageGetModeNine=1
32 } lmrcImageEdgeImageGetMode;
33
34 extern void lmrcImageEdgeImageGet(
35         mrcImage* in, 
36         mrcImage** out, 
37         lmrcImageEdgeImageGetInfo* linfo, 
38         lmrcImageEdgeImageGetMode mode
39         ); 
40
41 extern void lmrcImageEdgeImageGetFour(
42         mrcImage* in, 
43         mrcImage** out, 
44         lmrcImageEdgeImageGetInfo* linfo, 
45         lmrcImageEdgeImageGetMode mode
46         ); 
47
48 extern void lmrcImageEdgeImageGetNine (
49         mrcImage* in, 
50         mrcImage** out, 
51         lmrcImageEdgeImageGetInfo* linfo, 
52         lmrcImageEdgeImageGetMode mode
53         ); 
54
55 extern void lmrcImageEdgeImageGetInit(
56         mrcImage* in, 
57         mrcImage** out, 
58         lmrcImageEdgeImageGetInfo* linfo, 
59         lmrcImageEdgeImageGetMode mode
60         );
61
62 int
63 main(int argc, char* argv[]) 
64 {
65         mrcImageEdgeImageGetInfo info;
66         lmrcImageEdgeImageGetInfo linfo;
67
68         mrcImage in;
69         mrcImage* out;
70         int i;
71         char filename[STRING_MAX_LENGTH];
72
73         init0(&info);
74     argCheck(&info, argc, argv);
75     init1(&info);
76
77         DEBUGPRINT("Program Start\n");
78         linfo.Size = info.Size;
79
80         mrcFileRead(&in, info.In, "in main", 0);
81
82         DEBUGPRINT2("%p %p\n", &out, out);
83         lmrcImageEdgeImageGet(&in, &out, &linfo, info.mode);
84         DEBUGPRINT2("%p %p\n", &out, out);
85
86         DEBUGPRINT1("numImage: %d\n", linfo.numImage);
87         DEBUGPRINT1("out: %p\n", out);
88         for(i=0; i<linfo.numImage; i++) {
89                 sprintf(filename, "%s.%03d", info.Out, i);
90
91                 DEBUGPRINT2("out[%03d]: %d\n", i, out[i].HeaderMode);
92                 mrcFileWrite(&(out[i]), filename, "in main", 0);
93         }
94         return EXIT_SUCCESS;
95 }
96
97 void
98 additionalUsage()
99 {
100         fprintf(stderr, "----- Additional Usage -----\n");
101         fprintf(stderr, "mode: \n");
102         fprintf(stderr, "    %4d: 4 Edge (x-y plane) from Image(0-3)\n", lmrcImageEdgeImageGetModeFour);
103         fprintf(stderr, "    %4d: 8 Edge (x-y plane) + centre from Image(0-8)\n", lmrcImageEdgeImageGetModeNine);
104 }
105
106
107 void 
108 lmrcImageEdgeImageGet(mrcImage* in, mrcImage** out, lmrcImageEdgeImageGetInfo* linfo, lmrcImageEdgeImageGetMode mode)
109 {
110         DEBUGPRINT1("lmrcImageEdgeImageGet Mode: %d\n", mode);
111         switch(mode) {
112                 case lmrcImageEdgeImageGetModeFour: {
113                         lmrcImageEdgeImageGetFour(in, out, linfo, mode);
114                         break;
115                 }
116                 case lmrcImageEdgeImageGetModeNine: {
117                         lmrcImageEdgeImageGetNine(in, out, linfo, mode);
118                         break;
119                 }
120                 default: {
121                         fprintf(stderr, "Not supported Mode: %d\n", mode);
122                         exit(EXIT_FAILURE);
123                 }
124         }
125 }
126
127 void
128 lmrcImageEdgeImageGetInit(mrcImage* in, mrcImage** out, lmrcImageEdgeImageGetInfo* linfo, lmrcImageEdgeImageGetMode mode)
129 {
130         int i;
131         mrcImage* pout;
132
133         DEBUGPRINT1("numImage: %d\n", linfo->numImage);
134         DEBUGPRINT2("p: %p %p\n", out, *out);
135         *out = (mrcImage*)memoryAllocate(sizeof(mrcImage)*linfo->numImage, "in lmrcImageEdgeImageGetInit");
136         DEBUGPRINT2("p: %p %p\n", out, *out);
137         pout = *out;
138         DEBUGPRINT3("p: out %p *out %p pout %p\n", out, *out, pout);
139         for(i=0; i<linfo->numImage; i++) {
140                 DEBUGPRINT3("p: out %p *out %p pout %p\n", out, *out, pout);
141                 mrcDefaultHeaderValueSet(&(pout[i]));
142                 pout[i].HeaderN.x = MIN(in->HeaderN.x, linfo->Size);
143                 pout[i].HeaderN.y = MIN(in->HeaderN.y, linfo->Size);
144                 pout[i].HeaderN.z = MIN(in->HeaderN.z, linfo->Size);
145                 pout[i].HeaderMode = in->HeaderMode;
146                 DEBUGPRINT1("%d\n", pout[i].HeaderMode);
147                 DEBUGPRINT4("%d: %d %d %d\n", i, in->HeaderN.x, in->HeaderN.y, in->HeaderN.z);
148                 DEBUGPRINT4("%d: %d %d %d\n", i, pout[i].HeaderN.x, pout[i].HeaderN.y, pout[i].HeaderN.z);
149                 mrcInit(&(pout[i]), NULL);
150         }
151 }
152
153 void 
154 lmrcImageEdgeImageGetFour(mrcImage* in, mrcImage** out, lmrcImageEdgeImageGetInfo* linfo, lmrcImageEdgeImageGetMode mode)
155 {
156         mrcImageParaTypeReal srcx, srcy, srcz;
157         mrcImageParaTypeReal dstx, dsty, dstz;
158         mrcImageParaTypeReal offsetx, offsety, offsetz;
159         int i;
160         double data;
161         mrcImage* pout;
162
163         linfo->numImage = 4;
164
165         lmrcImageEdgeImageGetInit(in, out, linfo, mode); 
166
167         pout = *out;
168         DEBUGPRINT("ROI Get \n");
169         for(i=0; i<linfo->numImage; i++) {
170                 DEBUGPRINT2("i: %d p: %p\n", i, &(pout[i]));
171         }
172         for(i=0; i<linfo->numImage; i++) {
173                 DEBUGPRINT2("i: %d p: %p\n", i, &(pout[i]));
174                 offsetx = (i%2)?MAX(in->HeaderN.x - linfo->Size, 0):(0);
175                 offsety = (i/2)?MAX(in->HeaderN.y - linfo->Size, 0):(0);
176                 offsetz = MAX(pout[i].HeaderN.z, pout[i].HeaderN.z/2 - linfo->Size/2);
177
178                 DEBUGPRINT1("%d\n", out[i]->HeaderMode);
179                 DEBUGPRINT4("%d: %d %d %d\n", i, pout[i].HeaderN.x, pout[i].HeaderN.y, pout[i].HeaderN.z);
180
181                 for(dstz=0; dstz<pout[i].HeaderN.z; dstz++) { 
182                 for(dsty=0; dsty<pout[i].HeaderN.y; dsty++) {
183                 for(dstx=0; dstx<pout[i].HeaderN.x; dstx++) {
184                         srcx = offsetx + dstx;
185                         srcy = offsety + dsty;
186                         srcz = offsetz + dstz;
187                         mrcPixelDataGet(in, srcx, srcy, srcz, &data, mrcPixelRePart, mrcPixelHowNearest);
188                         mrcPixelDataSet(&(pout[i]), dstx, dsty, dstz, data, mrcPixelRePart); 
189                 }
190                 }
191                 }
192         }
193 }
194
195 void 
196 lmrcImageEdgeImageGetNine(mrcImage* in, mrcImage** out, lmrcImageEdgeImageGetInfo* linfo, lmrcImageEdgeImageGetMode mode)
197 {
198         mrcImageParaTypeReal srcx, srcy, srcz;
199         mrcImageParaTypeReal dstx, dsty, dstz;
200         mrcImageParaTypeReal offsetx, offsety, offsetz;
201         int i;
202         double data;
203         mrcImage* pout;
204
205         linfo->numImage = 9;
206
207         lmrcImageEdgeImageGetInit(in, out, linfo, mode); 
208
209         pout = *out;
210         DEBUGPRINT("ROI Get \n");
211         for(i=0; i<linfo->numImage; i++) {
212                 switch(i%3) {
213                         case 0:
214                                 offsetx = 0;
215                                 break;
216                         case 1:
217                                 offsetx = MAX((in->HeaderN.x - linfo->Size)/2, 0); 
218                                 break;
219                         case 2: 
220                                 offsetx = MAX( in->HeaderN.x - linfo->Size,    0);
221                                 break;
222                         default:
223                                 offsetx = 0;
224                                 fprintf(stderr, "Something wrong: mod(%d,3)=%d \n", i, i%3);
225                                 break;
226                 }
227                 switch(i/3) {
228                         case 0:
229                                 offsety = 0;
230                                 break;
231                         case 1:
232                                 offsety = MAX((in->HeaderN.y - linfo->Size)/2, 0); 
233                                 break;
234                         case 2:
235                                 offsety = MAX( in->HeaderN.y - linfo->Size,    0);
236                                 break;
237                         default:
238                                 offsety = 0;
239                                 fprintf(stderr, "Something wrong: %d/3=%d\n", i, i/3); 
240                                 break;
241                 }
242
243                 offsetz = MAX(pout[i].HeaderN.z, pout[i].HeaderN.z/2 - linfo->Size/2);
244
245                 DEBUGPRINT1("%d\n", pout[i].HeaderMode);
246                 DEBUGPRINT4("%d: %d %d %d\n", i, pout[i].HeaderN.x, pout[i].HeaderN.y, pout[i].HeaderN.z);
247
248                 for(dstz=0; dstz<pout[i].HeaderN.z; dstz++) { 
249                 for(dsty=0; dsty<pout[i].HeaderN.y; dsty++) {
250                 for(dstx=0; dstx<pout[i].HeaderN.x; dstx++) {
251                         srcx = offsetx + dstx;
252                         srcy = offsety + dsty;
253                         srcz = offsetz + dstz;
254                         mrcPixelDataGet(in, srcx, srcy, srcz, &data, mrcPixelRePart, mrcPixelHowNearest);
255                         mrcPixelDataSet(&(pout[i]), dstx, dsty, dstz, data, mrcPixelRePart); 
256                 }
257                 }
258                 }
259         }
260 }