3 # The latest update : %G% at %U%
12 static char __sccs_id[] = "%Z%mrc2Dto3D ver%I%; Date:%D% %Z%";
17 #define GLOBAL_DECLARATION
19 #include "../inc/config.h"
22 #include "eosString.h"
25 #include "eosPThread.h"
26 #include "lmrcImageRhoFiltering.h"
27 #include "lmrc2Dto3D.h"
29 extern void lmrc2Dto2DMulti(mrcImage* out, char** filename, int number, FILE* fptInfo, int mode);
30 extern void lmrc2Dto2DEach(lmrc2Dto3DInfo* linfo, char** filename, int number, FILE* fptInfo, int mode);
33 main(int argc, char* argv[])
36 static lmrc2Dto3DInfo linfo;
37 static lmrc2Dto3DSIRTInfo llinfo;
42 argCheck(&info, argc, argv);
45 linfo.Rmax = info.Rmax;
46 linfo.mode = info.mode;
47 linfo.singleTiltMode = info.single;
48 linfo.singleFilterMode = info.singleFilter;
49 linfo.flagDouble = info.Double;
50 linfo.flagPlusXrot = info.PlusXrot;
51 linfo.InterpolationMode = info.InterpolationMode;
52 linfo.rhoInfo.counterThreshold = info.CounterThreshold;
53 linfo.rhoInfo.counterThresholdMode = info.CounterThresholdMode;
54 linfo.rhoInfo.weightMode = info.WeightMode;
55 linfo.rhoInfo.SubSampling = info.SubSampling;
56 linfo.rhoInfo.flagThicknessWeight = info.thicknessWeight;
57 __eosPThread__ = info.flagpthreadMax;
58 __eosPThreadNum__ = info.pthreadMax;
61 linfo.flagOutputSize = 1;
67 llinfo.maxIter = info.maxIter;
68 llinfo.rms = info.rms;
74 mrcFileRead(&In, info.In, "in main", 0);
75 } else if (info.flagIn2) {
77 lmrc2Dto2DEach(&linfo, info.In2, info.flagIn2, info.fptIn2List, 0);
79 lmrc2Dto2DMulti(&In, info.In2, info.flagIn2, info.fptIn2List, 0);
82 fprintf(stderr, "-i or -I is required\n");
87 lmrc2Dto3DSIRT(&Out, &In, &linfo, &llinfo, 0);
90 lmrc2Dto3D(&Out, NULL, &linfo, 0);
92 lmrc2Dto3D(&Out, &In, &linfo, 0);
96 mrcFileWrite(&Out, info.Out, "in main", 0);
98 mrcFileWrite(&In, info.Out2, "in main", 0);
100 if(info.Double && info.flagDoubleCounter) {
101 if(NULL!=linfo.CounterForWeight) {
102 mrcFileWrite(linfo.CounterForWeight, info.DoubleCounter, "in main", 0);
111 fprintf(stderr, "----- Additional Usage -----\n");
112 fprintf(stderr, "-m Option\n");
113 fprintf(stderr, " %d:SimpleBackProjection\n", mrc2Dto3DModeSimpleBackProjection);
114 fprintf(stderr, " %d:FilteredBackProjection(Fourier Space)\n", mrc2Dto3DModeFilteredBackProjection);
115 fprintf(stderr, " %d:WeightedBackProjection(Real Space)\n", mrc2Dto3DModeWeightedBackProjection);
116 fprintf(stderr, "-single 0|1 \n");
117 fprintf(stderr, " 0: tilt axis is parallel to x-axis\n");
118 fprintf(stderr, " 1: tilt axis is parallel to y-axis\n");
119 fprintf(stderr, "-singleFilter 0|1|2 \n");
120 fprintf(stderr, " 0: simple rho filter\n");
121 fprintf(stderr, " 1: Ram-Lak Filter\n");
122 fprintf(stderr, " 2: Shepp-Logan Filter\n");
123 fprintf(stderr, "-Double \n");
124 fprintf(stderr, " Double Tilt \n");
125 fprintf(stderr, "-WeightMode \n");
126 fprintf(stderr, " 1 : RealSpace: Circle(same density)\n");
127 fprintf(stderr, " 2 : RealSpace: Circle(weighted density)\n");
128 fprintf(stderr, " 3 : RealSpace: Square(weighted density) \n");
129 fprintf(stderr, " 4 : Fourier Space : Plane(same density) -CounterThreshold 0.5\n");
130 fprintf(stderr, " 5 : Fourier Space : Plane(Linear Gradient)-CounterThreshold 0.5\n");
131 fprintf(stderr, " 6 : Fourier Space : Plane(Cosine Gradient) Current Recommende using -CounterThreshold 0.5\n");
132 fprintf(stderr, "-------------------------------\n");
133 fprintf(stderr, "-I Option file format\n");
134 fprintf(stderr, "filename0 RotationOrder0 rot1 rot2 rot3\n");
135 fprintf(stderr, "filename1 RotationOrder1 rot1 rot2 rot3\n");
136 fprintf(stderr, ".......................................\n");
137 fprintf(stderr, ">>> RotationOrder : Eular Angle Expression <<< \n");
138 fprintf(stderr, "Example: YOYS : RotY(rot3)RotX(rot2)RotY(rot1)*v\n");
139 fprintf(stderr, "First Rotation : y-axis : Y: Y : [X|Y|Z] Axis used initially\n");
140 fprintf(stderr, "Second Rotation : x-axis : O: Odd : [O|E] Parity of axis permutation\n");
141 fprintf(stderr, "Last Rotation : z-axis : Y: Yes : [Y|N] Repetition of initial axis as last\n");
142 fprintf(stderr, "v1 = A v0 : S: Staic : [S|R] Frame from which axes are taken\n");
147 lmrc2Dto2DMulti(mrcImage* out, char** filename, int number, FILE* fptInfo, int mode)
151 mrcImageParaTypeInteger Nx, Ny;
152 mrcImageParaTypeReal Length;
153 mrcImageParaTypeReal srcx, srcy, srcz;
154 mrcImageParaTypeReal dstx, dsty, dstz;
158 in = (mrcImage*)memoryAllocate(sizeof(mrcImage)*number, "in lmrc2Dto2DMulti");
162 for(i=0; i<number; i++) {
163 DEBUGPRINT1("Opening:%s\n", filename[i]);
164 mrcFileRead(&(in[i]), filename[i], "in lmrc2Dto2DMulti", 0);
165 if(Nx < in[i].HeaderN.x) {
166 Nx = in[i].HeaderN.x;
168 if(Ny < in[i].HeaderN.y) {
169 Ny = in[i].HeaderN.y;
171 if(in[i].HeaderLength.x < Length) {
172 Length = in[i].HeaderLength.x;
174 if(in[i].HeaderLength.y < Length) {
175 Length = in[i].HeaderLength.y;
180 out->HeaderN.z = number;
181 out->HeaderMode = mrcFloatImage;
182 out->HeaderLength.x = Length;
183 out->HeaderLength.y = Length;
184 out->HeaderLength.z = Length;
187 for(dstz=0; dstz<number; dstz++) {
188 for(dstx=0; dstx<in->HeaderN.x; dstx++) {
189 for(dsty=0; dsty<in->HeaderN.y; dsty++) {
190 srcx = dstx - (out->HeaderN.x - in->HeaderN.x)/2.0;
191 srcy = dsty - (out->HeaderN.y - in->HeaderN.y)/2.0;
192 mrcPixelDataGet(&(in[(int)dstz]), srcx, srcy, srcz, &data, mrcPixelRePart, mrcPixelHowLinear);
193 mrcPixelDataSet(out, dstx, dsty, dstz, data, mrcPixelRePart);
197 out->numTailer = number;
198 out->Tailer = (mrcImageTailer*)memoryAllocate(sizeof(mrcImageTailer)*number, "in lmrc2Dto2DMulti");
199 fseek(fptInfo, 0L, SEEK_SET);
200 for(i=0; i<number; i++) {
201 stringGetFromFile(s, "", fptInfo, stdout, 3);
202 out->Tailer[i].Cont.Mode = mrcImageTailerMode2DProjection;
203 stringCopy(out->Tailer[i].Cont.EulerAngleMode, stringGetNthWord(s, 2, " \t,"), 4);
204 out->Tailer[i].Cont.Rot1 = stringGetNthRealData(s, 3, " ,\t")*RADIAN;
205 out->Tailer[i].Cont.Rot2 = stringGetNthRealData(s, 4, " ,\t")*RADIAN;
206 out->Tailer[i].Cont.Rot3 = stringGetNthRealData(s, 5, " ,\t")*RADIAN;
208 for(i=0; i<number; i++) {
209 mrcImageFree(&(in[i]), "in lmrc2Dto2DMulti");
215 lmrc2Dto2DEach(lmrc2Dto3DInfo* linfo, char** filename, int number, FILE* fptInfo, int mode)
220 linfo->inFileNum = number;
221 linfo->inFileList= filename;
222 linfo->Tailer = (mrcImageTailer*)memoryAllocate(sizeof(mrcImageTailer)*number, "in lmrc2Dto2DEach");
223 fseek(fptInfo, 0L, SEEK_SET);
224 for(i=0; i<number; i++) {
225 stringGetFromFile(s, "", fptInfo, stdout, 3);
226 linfo->Tailer[i].Cont.Mode = mrcImageTailerMode2DProjection;
227 stringCopy(linfo->Tailer[i].Cont.EulerAngleMode, stringGetNthWord(s, 2, " \t,"), 4);
228 linfo->Tailer[i].Cont.Rot1 = stringGetNthRealData(s, 3, " ,\t")*RADIAN;
229 linfo->Tailer[i].Cont.Rot2 = stringGetNthRealData(s, 4, " ,\t")*RADIAN;
230 linfo->Tailer[i].Cont.Rot3 = stringGetNthRealData(s, 5, " ,\t")*RADIAN;