Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Conograph/trunk/src/lattice_symmetry/LatticeFigureOfMerit.hh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (hide annotations) (download) (as text)
Fri Apr 26 08:50:24 2013 UTC (10 years, 10 months ago) by rtomiyasu
File MIME type: text/x-c++hdr
File size: 17139 byte(s)
Modifications for GUI development.

1 rtomiyasu 3 /*
2     * The MIT License
3    
4     Conograph (powder auto-indexing program)
5    
6     Copyright (c) <2012> <Ryoko Oishi-Tomiyasu, KEK>
7    
8     Permission is hereby granted, free of charge, to any person obtaining a copy
9     of this software and associated documentation files (the "Software"), to deal
10     in the Software without restriction, including without limitation the rights
11     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12     copies of the Software, and to permit persons to whom the Software is
13     furnished to do so, subject to the following conditions:
14    
15     The above copyright notice and this permission notice shall be included in
16     all copies or substantial portions of the Software.
17    
18     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24     THE SOFTWARE.
25     *
26     */
27     #ifndef LATTICEFIGUREOFMERIT_HH_
28     #define LATTICEFIGUREOFMERIT_HH_
29    
30     #include "../utility_data_structure/nrutil_nr.hh"
31     #include "../utility_data_structure/SymMat43.hh"
32     #include "../utility_data_structure/VecDat3.hh"
33     #include "../utility_func/transform_sym_matrix.hh"
34     #include "../utility_func/lattice_constant.hh"
35     #include "../utility_func/chToDouble.hh"
36     #include "../utility_lattice_reduction/matrix_4by4.hh"
37     #include "../bravais_lattice/enumBravaisLattice.hh"
38     #include "../point_group/enumPointGroup.hh"
39     #include "../laue_group/LaueGroup.hh"
40     #include "../zparam/ZParawError.hh"
41     #include "../model_function/profile_function/global_function/enumPeakShiftFunctionType.hh"
42     #include "../bravais_type/BravaisType.hh"
43     #include "enumSortCriterion.hh"
44     #include "HKL_Q.hh"
45     #include "lattice_symmetry.hh"
46    
47    
48     class SetOfFigureOfMerit
49     {
50     private:
51     Int4 m_num_ref_figure_of_merit;
52     Int4 m_num_q_observed;
53     Double m_num_total_hkl;
54     // Int4 m_num_total_hkl_disc;
55     Double m_figure_of_merit_Wolff;
56     Double m_figure_of_merit_Wu;
57     // Double m_normalized_figure_of_merit_Wolff;
58     Double m_reversed_figure_of_merit;
59    
60     // Double m_figure_of_merit_Wolff_original;
61     // Double m_figure_of_merit_Wu_original;
62    
63     static string putStrFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCM) + num2str(num_ref_fom); };
64     static string putStrFigureOfMeritWu(const Int4& num_ref_fom){ return putLabel(SCWuM) + num2str(num_ref_fom); };
65     // static string putStrNormalizedFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCNormM) + num2str(num_ref_fom); };
66     static string putStrReversedFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCRevM) + num2str(num_ref_fom); };
67     static string putStrSymmetricFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCSymM) + num2str(num_ref_fom); };
68    
69     // static string putStrFigureOfMeritWolff_Original(const Int4& num_ref_fom){ return "M" + num2str(num_ref_fom) + "(Original)"; };
70     // static string putStrFigureOfMeritWu_Original(const Int4& num_ref_fom){ return "Mwu" + num2str(num_ref_fom) + "(Original)"; };
71    
72     public:
73     SetOfFigureOfMerit(){ this->reset(); }
74     ~SetOfFigureOfMerit(){}
75    
76     inline void reset()
77     {
78     m_num_ref_figure_of_merit = 0;
79     m_num_q_observed = 0;
80     m_num_total_hkl = 0.0;
81     // m_num_total_hkl_disc = 0;
82     m_figure_of_merit_Wolff = 0.0;
83     m_figure_of_merit_Wu = 0.0;
84     // m_normalized_figure_of_merit_Wolff = 0.0;
85     m_reversed_figure_of_merit = 0.0;
86    
87     // m_figure_of_merit_Wolff_original = 0.0;
88     // m_figure_of_merit_Wu_original = 0.0;
89     }
90    
91     inline Int4& putNumberOfReflectionsForFigureOfMerit() { return m_num_ref_figure_of_merit; };
92     inline Int4& putNumQobsAssociatedWithCloseHKL() { return m_num_q_observed; };
93     inline Double& putContinuousNumberOfHKLInRange() { return m_num_total_hkl; };
94     // inline Int4& putDiscreteNumberOfHKLInRange() { return m_num_total_hkl_disc; };
95    
96     inline const Int4& putNumQobsAssociatedWithCloseHKL() const { return m_num_q_observed; };
97     inline const Int4& putNumberOfReflectionsForFigureOfMerit() const { return m_num_ref_figure_of_merit; };
98     inline const Double& putContinuousNumberOfHKLInRange() const { return m_num_total_hkl; };
99     // inline const Int4& putDiscreteNumberOfHKLInRange() const { return m_num_total_hkl_disc; };
100    
101     inline Double& putFigureOfMeritWolff() { return m_figure_of_merit_Wolff; };
102     inline Double& putFigureOfMeritWu() { return m_figure_of_merit_Wu; };
103     // inline Double& putNormalizedFigureOfMeritWolff() { return m_normalized_figure_of_merit_Wolff; };
104     inline Double& putReversedFigureOfMerit() { return m_reversed_figure_of_merit; };
105    
106     inline const Double& putFigureOfMeritWolff() const { return m_figure_of_merit_Wolff; };
107     inline const Double& putFigureOfMeritWu() const { return m_figure_of_merit_Wu; };
108     // inline const Double& putNormalizedFigureOfMeritWolff() const { return m_normalized_figure_of_merit_Wolff; };
109     inline const Double& putReversedFigureOfMerit() const { return m_reversed_figure_of_merit; };
110    
111     inline string putLabel_FigureOfMeritWolff() const { return putStrFigureOfMeritWolff(m_num_ref_figure_of_merit); };
112     inline string putLabel_FigureOfMeritWu() const { return putStrFigureOfMeritWu(m_num_ref_figure_of_merit); };
113     // inline string putLabel_NormalizedFigureOfMeritWolff() const { return putStrNormalizedFigureOfMeritWolff(m_num_ref_figure_of_merit); };
114     inline string putLabel_ReversedFigureOfMeritWolff() const { return putStrReversedFigureOfMeritWolff(m_num_ref_figure_of_merit); };
115     inline string putLabel_SymmetricFigureOfMeritWolff() const { return putStrSymmetricFigureOfMeritWolff(m_num_ref_figure_of_merit); };
116    
117     inline Double putSymmetricFigureOfMerit() const { return m_reversed_figure_of_merit * m_figure_of_merit_Wolff; };
118    
119     // inline Double& putFigureOfMeritWolff_Original() { return m_figure_of_merit_Wolff_original; };
120     // inline const Double& putFigureOfMeritWolff_Original() const { return m_figure_of_merit_Wolff_original; };
121     // inline Double& putFigureOfMeritWu_Original() { return m_figure_of_merit_Wu_original; };
122     // inline const Double& putFigureOfMeritWu_Original() const { return m_figure_of_merit_Wu_original; };
123     };
124    
125    
126     // Class for outputting information about a lattice in index file.
127     class LatticeFigureOfMerit
128     {
129     friend inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs);
130    
131     private:
132     static const NRMat<Int4> m_tmat_prim_to_face;
133     static const NRMat<Int4> m_tmat_prim_to_body;
134     static const NRMat<Int4> m_tmat_prim_to_rhomhex;
135     static const NRMat<Int4> m_tmat_prim_to_base[3];
136     static const NRMat<Int4> m_tmat_prim_to_prim;
137    
138     BravaisType m_brat;
139    
140     // This matrix is a result of optimization, therefore, it may be not reduced.
141     // m_S_optimized.second * m_S_optimized.first * Transpose(m_S_optimized.second) is obtuse.
142     SymMat43_Double m_S_optimized;
143    
144     // The inverse of m_S_red is Minkowski-reduced.
145     SymMat<Double> m_S_red;
146    
147     Double m_determ_S_red;
148    
149     SetOfFigureOfMerit m_figures_of_merit;
150    
151     // Sets m_S_red from m_S_optimized.
152     // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) equals the original m_S_optimized.
153     void setInverseOfMinkowskiReducedForm(NRMat<Int4>& trans_mat);
154    
155     protected:
156     static const Double m_cv2;
157    
158     public:
159     LatticeFigureOfMerit();
160     LatticeFigureOfMerit(const Double& rhs); // Sets only m_determ_GramMat = rhs;
161     LatticeFigureOfMerit(const BravaisType& ebrat,
162     const SymMat43_Double& S_red);
163     virtual ~LatticeFigureOfMerit(){};
164    
165     void putMillerIndicesInRange(const Double& qrange_begin, const Double& qrange_end,
166     vector<HKL_Q>& cal_hkl_tray) const;
167    
168     void setWuFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
169     const Double& min_thred_num_hkl,
170     const Double& max_thred_num_hkl);
171    
172     // Return false if Qdata is not set or
173     // the number of unindexed reflections is larger max_num_false_peak.
174     void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
175     vector< VecDat3<Int4> >& closest_hkl_tray,
176     Vec_BOOL& Q_observed_flag);
177     inline void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata)
178     {
179     vector< VecDat3<Int4> > closest_hkl_tray;
180     Vec_BOOL Q_observed_flag;
181     setFigureOfMerit(num_ref_figure_of_merit, qdata, closest_hkl_tray, Q_observed_flag);
182     };
183    
184     // true : NormM has been improved.
185     // false : NormM has not been improved.
186     pair<bool, ZErrorMessage> fitLatticeParameterLinear(const vector<QData>& qdata,
187     const vector< VecDat3<Int4> >& hkl_to_fit,
188     const vector<bool>& fix_or_fit_flag,
189     const bool& output_view_flag);
190    
191     // Change the lattice constants to string.
192     inline string printOptimizedLatticeConstants(const eABCaxis& axis1,
193     const eRHaxis& axis2,
194     const Int4& precision) const;
195    
196     // Output information on the lattice.
197     void printLatticeInformation(const eABCaxis& abc_axis,
198     const eRHaxis& rh_axis,
199     const Int4& label_start0,
200     ostream* os) const;
201    
202     // Set-functions.
203     // This method assumes that S.second * S.first * Transpose(S.second) is obtuse.
204     void setLatticeConstants43(const BravaisType& brat, const SymMat43_Double& S);
205    
206     ZErrorMessage setLatticeConstants(const BravaisType& brat, const SymMat<Double>& S);
207    
208     Int4 checkDominantZone() const;
209    
210     // Replace m_S_optimized by m_S_red.
211     // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) equals the original m_S_optimized.
212     inline void reduceLatticeConstants(NRMat<Int4>& trans_mat);
213    
214     // The unit of alpha, beta, gamma is degree.
215     inline ZErrorMessage setLatticeConstantsDegree(const BravaisType& brat,
216     const VecDat3<Double>& length_axis,
217     const VecDat3<Double>& angle_axis);
218    
219     static void putLatticeConstantsDegree(const BravaisType& brat,
220     const SymMat<Double>& S,
221     const eABCaxis& axis1,
222     const eRHaxis& axis2,
223     VecDat3<Double>& length, VecDat3<Double>& angle);
224    
225     // Put-functions (Returns a value.)
226     inline void putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
227     const eRHaxis& axis2,
228     VecDat3<Double>& length, VecDat3<Double>& angle) const;
229    
230     inline void putReducedLatticeConstantsDegree(const eABCaxis& axis1,
231     const eRHaxis& axis2,
232     VecDat3<Double>& length, VecDat3<Double>& angle) const;
233    
234     inline Double putLatticeVolume() const { return 1.0 / sqrt(m_determ_S_red); };
235    
236     // Put-functions (Returns a constant reference.)
237     inline const Double& putCriticalValueSquare() const { return m_cv2; };
238    
239     inline const ePointGroup& enumPointGroup() const { return m_brat.enumPointGroup(); };
240     inline const eBravaisLattice& enumBravaisLattice() const { return m_brat.enumBravaisLattice(); };
241     inline const eCrystalSystem& enumCrystalSystem() const { return m_brat.enumCrystalSystem(); };
242     inline const BravaisType& putBravaisType() const { return m_brat; };
243    
244     // The returned matrix is Minkowski-reduced matrix equivalent with m_S_red_optimized.
245     inline const SymMat<Double>& putInverseOfMinkowskiReducedForm() const { return m_S_red; };
246    
247     // inline const SymMat<Double>& putOptimizedForm() const { return m_S_red_optimized.first; };
248     inline const SymMat43_Double& putOptimizedForm() const { return m_S_optimized; };
249     inline SymMat<Double> putSellingReducedForm() const { return transform_sym_matrix(m_S_optimized.second, m_S_optimized.first); };
250    
251     inline const Double& putDeterminantOfGramMatrix() const { return m_determ_S_red; };
252     inline const SetOfFigureOfMerit& putFiguresOfMerit() const { return m_figures_of_merit; };
253    
254     // Put-functions (Returns a non-constant reference.)
255     inline SetOfFigureOfMerit& putFiguresOfMerit() { return m_figures_of_merit; };
256    
257     static bool cmpFOMdeWolff(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
258     {
259     return lhs.m_figures_of_merit.putFigureOfMeritWolff() > rhs.m_figures_of_merit.putFigureOfMeritWolff();
260     }
261    
262     static bool cmpFOMWu(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
263     {
264     return lhs.m_figures_of_merit.putFigureOfMeritWu() > rhs.m_figures_of_merit.putFigureOfMeritWu();
265     }
266    
267     // static bool cmpFOM(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
268     // {
269     // return lhs.m_figures_of_merit.putNormalizedFigureOfMeritWolff() > rhs.m_figures_of_merit.putNormalizedFigureOfMeritWolff();
270     // }
271    
272     static bool cmpFOMReversed(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
273     {
274     return lhs.m_figures_of_merit.putReversedFigureOfMerit() > rhs.m_figures_of_merit.putReversedFigureOfMerit();
275     }
276    
277     static bool cmpFOMSymmetric(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
278     {
279     return lhs.m_figures_of_merit.putSymmetricFigureOfMerit() > rhs.m_figures_of_merit.putSymmetricFigureOfMerit();
280     }
281    
282     // static bool cmpFOMdeWolff_Original(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
283     // {
284     // return lhs.m_figures_of_merit.putFigureOfMeritWolff_Original() > rhs.m_figures_of_merit.putFigureOfMeritWolff_Original();
285     // }
286     //
287     // static bool cmpFOMWu_Original(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
288     // {
289     // return lhs.m_figures_of_merit.putFigureOfMeritWu_Original() > rhs.m_figures_of_merit.putFigureOfMeritWu_Original();
290     // }
291    
292    
293     // For GUI
294     const BravaisType &getref_m_brat() const {return m_brat;}
295     BravaisType &getref_m_brat() {return m_brat;}
296     const SetOfFigureOfMerit &getref_m_figures_of_merit() const {return m_figures_of_merit;}
297     SetOfFigureOfMerit &getref_m_figures_of_merit() {return m_figures_of_merit;}
298     const SymMat43_Double &getref_m_S_red_optimized() const {return m_S_optimized;}
299     SymMat43_Double &getref_m_S_red_optimized() {return m_S_optimized;}
300     const Double &getref_m_determ_S_red() const {return m_determ_S_red;}
301     Double &getref_m_determ_S_red() {return m_determ_S_red;}
302 rtomiyasu 16 const SymMat<Double> &getref_m_S_red() const {return m_S_red;}
303     SymMat<Double> &getref_m_S_red() {return m_S_red;}
304    
305 rtomiyasu 3 };
306    
307    
308     inline string LatticeFigureOfMerit::printOptimizedLatticeConstants(const eABCaxis& axis1,
309     const eRHaxis& axis2,
310     const Int4& precision) const
311     {
312     VecDat3<Double> length_axis, angle_axis;
313     putOptimizedLatticeConstantsDegree(axis1, axis2, length_axis, angle_axis);
314     return chToString(length_axis, angle_axis, precision);
315     }
316    
317    
318     inline void LatticeFigureOfMerit::putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
319     const eRHaxis& axis2,
320     VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
321     {
322     putLatticeConstantsDegree( m_brat, m_S_optimized.first, axis1, axis2, length_axis, angle_axis );
323     }
324    
325    
326     inline void LatticeFigureOfMerit::putReducedLatticeConstantsDegree(
327     const eABCaxis& axis1,
328     const eRHaxis& axis2, VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
329     {
330     putLatticeConstantsDegree( m_brat, this->putInverseOfMinkowskiReducedForm(),
331     axis1, axis2, length_axis, angle_axis );
332     }
333    
334    
335    
336     inline ZErrorMessage LatticeFigureOfMerit::setLatticeConstantsDegree(const BravaisType& brat,
337     const VecDat3<Double>& length,
338     const VecDat3<Double>& angle)
339     {
340     LaueGroup lg(brat.enumPointGroup());
341     ZErrorMessage zerr = lg->checkLatticeConstantError(length, angle);
342     if( zerr.putErrorType() != ZErrorNoError ) return zerr;
343    
344     SymMat<Double> Sval(3);
345     calCoParameter(length, angle, Sval);
346    
347     return this->setLatticeConstants(brat, Sval);
348     }
349    
350     inline void LatticeFigureOfMerit::reduceLatticeConstants(NRMat<Int4>& trans_mat)
351     {
352     setInverseOfMinkowskiReducedForm(trans_mat);
353     m_S_optimized.first = m_S_red;
354     m_S_optimized.second = mprod(m_S_optimized.second, trans_mat);
355     }
356    
357    
358     inline VecDat3<Int4> product_hkl(const VecDat3<Int4>& lhs, const NRMat<Int4>& rhs)
359     {
360     assert( rhs.nrows() >= 3 && rhs.ncols() == 3 );
361    
362     VecDat3<Int4> ans;
363     ans[0] = lhs[0]*rhs[0][0] + lhs[1]*rhs[1][0] + lhs[2]*rhs[2][0];
364     ans[1] = lhs[0]*rhs[0][1] + lhs[1]*rhs[1][1] + lhs[2]*rhs[2][1];
365     ans[2] = lhs[0]*rhs[0][2] + lhs[1]*rhs[1][2] + lhs[2]*rhs[2][2];
366     return ans;
367     }
368    
369    
370     template<class T>
371     inline T norm(const VecDat3<Int4>& lhs, const SymMat<T>& rhs)
372     {
373     assert( rhs.size() >= 3 );
374    
375     return rhs(0,0)*(lhs[0]*lhs[0]) + rhs(1,1)*(lhs[1]*lhs[1]) + rhs(2,2)*(lhs[2]*lhs[2])
376     + ( rhs(0,1)*(lhs[0]*lhs[1]) + rhs(0,2)*(lhs[0]*lhs[2]) + rhs(1,2)*(lhs[1]*lhs[2]) )*2.0;
377     }
378    
379    
380     inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
381     {
382     return lhs.m_determ_S_red < rhs.m_determ_S_red;
383     }
384    
385     void putTransformMatrixToMinkowskiReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);
386    
387     #endif /*LATTICEFIGUREOFMERIT_HH_*/

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26