OSDN Git Service

c31379642944a44992ae085492856d143d776c79
[eos/base.git] / src / Tools / llData / llDataMultiCTFCompensation / src / llDataMultiCTFCompensation.c
1 /*
2 # %M% %Y% %I%
3 # The latest update : %G% at %U%
4 #
5 #%Z% llDataMultiCTFCompensation ver %I%
6 #%Z% Created by 
7 #%Z%
8 #%Z% Usage : llDataMultiCTFCompensation
9 #%Z% Attention
10 #%Z%
11 */
12 static char __sccs_id[] = "%Z%llDataMultiCTFCompensation ver%I%; Date:%D% %Z%";
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <math.h>                  
17 #define GLOBAL_DECLARATION
18 #define DEBUG
19 #include "genUtil.h"
20 #include "Memory.h"
21 #include "eosString.h"
22 #include "../inc/config.h"
23 #include "llData.h"
24 #include "ctfInfo.h"
25 #include "lllDataLowPassFiltering.h"
26 #include "lllDataFitAndAverage.h"
27 #include "lllDataCTFCompensation.h"
28
29 int
30 main(int argc, char* argv[]) 
31 {
32         int status;
33         llDataMultiCTFCompensationInfo info;
34         lllDataFitAndAverageInfo       linfo;
35         llData*  llIn;
36         llData*  llOut;
37         llData  llAve;
38         llData  llRef;
39         llDataFittedParam* paraFit;
40         llDataParamToFit   range;
41         long i, iter;
42         char s[1024];
43
44         init0(&info);
45     argCheck(&info, argc, argv);
46     init1(&info);
47
48         memoryClear(&linfo, sizeof(linfo), 0);
49         /* Set Fitting Parameter */
50         memoryClear(&range, sizeof(range), 0);
51     range.r.Min   = info.rmin;
52     range.r.Max   = info.rmax;
53     range.r.Delta = info.dr;
54     range.phi.Min = info.phimin*RADIAN;
55     range.phi.Max = info.phimax*RADIAN;
56     range.phi.Delta = info.dphi*RADIAN;
57     range.z.Min   = info.zmin;
58     range.z.Max   = info.zmax;
59     range.z.Delta = info.dz;
60         linfo.noise = info.Noise;       
61         /* Allocate paraFit */  
62         paraFit=(llDataFittedParam*)memoryAllocate(info.flagIn*sizeof(llDataFittedParam), "in main");
63         for(i=0; i<info.flagIn; i++) {
64                 paraFit[i].Para = range;
65         }
66         /* Input reference data */
67         DEBUGPRINT("----- Input Ref Data -----\n");
68         memoryClear(&llRef, sizeof(llRef), 0);
69         llDataFileRead(info.fptRef, &llRef, &status);
70         DEBUGPRINT("----- Set Weight -----\n");
71         lllDataWeightSet(info.fptllInfo, &llRef, 0.0, 0);
72         llRef.truePitch = info.truePitch;
73         llRef.Weight    = 1.0;
74         if(info.flagRmax) {     
75                 lllDataLowPassFiltering(&llRef, info.Rmax, 1);
76         }
77
78         /* Input test data*/
79         DEBUGPRINT("----- Input Data -----\n");
80         llIn  = (llData*) memoryAllocate(sizeof(llData)*info.flagIn, "in main");
81         llOut = (llData*) memoryAllocate(sizeof(llData)*info.flagIn, "in main");
82         linfo.nFile  = info.flagIn;
83         linfo.In     = info.In;
84         linfo.fptLog = info.fptOutParam;
85         linfo.flagCTF = 1;
86         linfo.ctfMode = info.mode;
87         linfo.CTF = (ctfInfo*)memoryAllocate(sizeof(ctfInfo)*info.flagIn, "in main");
88         linfo.flagWeight = 1;
89         linfo.weight = (llDataParaTypeReal*)memoryAllocate(sizeof(llDataParaTypeReal)*info.flagIn, "in main");
90         linfo.mode   = PVALUE_MODE|lllDataFitFitProcessPrint ;
91         fseek(info.fptInList, 0L, SEEK_SET);
92         for(i=0; i<info.flagIn; i++) {
93                 llDataFileReadFollowingllData(info.fptIn[i], &(llIn[i]), &llRef, &status);
94                 llDataInitWithReference(&(llOut[i]), &(llIn[i]));
95                 lllDataWeightSet(info.fptllInfo, &(llIn[i]), 0.0, 0);
96                 
97                 llIn[i].truePitch = info.truePitch;
98                 llIn[i].Weight    = 1.0;
99                 if(info.flagRmax) {     
100                         lllDataLowPassFiltering(&(llIn[i]), info.Rmax, 1);
101                 }
102                 stringGetFromFile(s, "", info.fptInList, stdout, 1);                    
103                 linfo.weight[i]                 = stringGetNthRealData(s, 2, " ,");
104                 linfo.CTF[i].defocus = stringGetNthRealData(s, 3, " ,");
105                 linfo.CTF[i].Cs                 = stringGetNthRealData(s, 4, " ,");
106                 linfo.CTF[i].kV                 = stringGetNthRealData(s, 5, " ,");
107                 linfo.CTF[i].ratioOfAmpToPhase  = stringGetNthRealData(s, 6, " ,");
108                 linfo.CTF[i].mode     = ctfInfoModePhaseAndAmpCTF;
109                 paraFit[i].Para.flagCTF = linfo.flagCTF;
110                 paraFit[i].Para.ctfCompensationMode = linfo.ctfMode;
111                 paraFit[i].Para.CTF   = linfo.CTF[i];
112         }
113         llDataInitWithReference(&llAve, &llRef);
114
115         for(iter=0; iter<info.MaxIter; iter++) {
116             LOGPRINT1(linfo.fptLog, "ITER","FIT","The %ldth Iteration\n", iter);
117                 lllDataFitAndAverage(&llAve, llOut, llIn, llRef, paraFit, linfo);
118                 lllDataCopy(&llRef, &llAve);
119                 for(i=0; i<info.flagIn; i++) {
120                         LOGPRINT7(info.fptOutParam, "ITER","FIT",
121                                 "%s %s %15.6f %15.6f %15.6f %15.6f %5d",
122                                 info.Ref,
123                                 info.In[i],
124                                 paraFit[i].Para.R*DEGREE,
125                                 paraFit[i].Para.phi.Value*DEGREE,
126                                 paraFit[i].Para.z.Value,
127                                 paraFit[i].Para.r.Value,
128                                 paraFit[i].Para.Pole);
129                 }
130         }
131         llDataFileWrite(info.fptAve, &llAve, &status);
132         if(info.flagOut) {
133                 if(info.flagOut!=info.flagIn) {
134                         fprintf(stderr, "The number of In (%d) is different from that of Out (%d) \n", 
135                                 info.flagIn, info.flagOut);
136                 }
137                 for(i=0; i<info.flagOut; i++) {
138                         llDataFileWrite(info.fptOut[i], &(llOut[i]), &status);
139                 }
140         }
141         exit(EXIT_SUCCESS);
142 }
143
144 void
145 additionalUsage()
146 {
147         ERRORPRINT("---- InputFileFormat ----\n");
148         ERRORPRINT("filename weight(NumberOfAveragedFile) deltaF[A] Cs[mm] kV[kV] ratioOfAmpToPhase\n");
149         lllDataMultiCTFCompensationModePrint(stderr);
150 }
151