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 25 - (hide annotations) (download) (as text)
Mon Jul 7 02:35:51 2014 UTC (9 years, 8 months ago) by rtomiyasu
File MIME type: text/x-c++hdr
File size: 15347 byte(s)
Source codes of version 0.9.99
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 rtomiyasu 25 #include "../utility_data_structure/SymMatNplus1N.hh"
32 rtomiyasu 3 #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 rtomiyasu 25 #include "../utility_lattice_reduction/matrix_NbyN.hh"
37     #include "../centring_type/enumCentringType.hh"
38 rtomiyasu 3 #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 rtomiyasu 25 #include "check_equiv.hh"
46 rtomiyasu 3
47    
48 rtomiyasu 25 // Class for outputting information about a lattice in index file.
49     class LatticeFigureOfMerit
50 rtomiyasu 3 {
51 rtomiyasu 25 friend inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs);
52 rtomiyasu 3
53     public:
54 rtomiyasu 25 class SetOfFigureOfMerit
55 rtomiyasu 3 {
56 rtomiyasu 25 private:
57     Int4 m_num_ref_figure_of_merit;
58     Int4 m_num_q_observed;
59     Double m_num_total_hkl;
60     Double m_figure_of_merit_Wolff;
61     Double m_figure_of_merit_Wu;
62     Double m_reversed_figure_of_merit;
63 rtomiyasu 3
64 rtomiyasu 25 static string putStrFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCM) + num2str(num_ref_fom); };
65     static string putStrFigureOfMeritWu(const Int4& num_ref_fom){ return putLabel(SCWuM) + 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 rtomiyasu 3
69 rtomiyasu 25 public:
70     SetOfFigureOfMerit(){ this->reset(); }
71     ~SetOfFigureOfMerit(){}
72 rtomiyasu 3
73 rtomiyasu 25 inline void reset()
74     {
75     m_num_ref_figure_of_merit = 0;
76     m_num_q_observed = 0;
77     m_num_total_hkl = 0.0;
78     m_figure_of_merit_Wolff = 0.0;
79     m_figure_of_merit_Wu = 0.0;
80     m_reversed_figure_of_merit = 0.0;
81     }
82 rtomiyasu 3
83 rtomiyasu 25 inline Int4& putNumberOfReflectionsForFigureOfMerit() { return m_num_ref_figure_of_merit; };
84     inline Int4& putNumQobsAssociatedWithCloseHKL() { return m_num_q_observed; };
85     inline Double& putContinuousNumberOfHKLInRange() { return m_num_total_hkl; };
86 rtomiyasu 3
87 rtomiyasu 25 inline const Int4& putNumQobsAssociatedWithCloseHKL() const { return m_num_q_observed; };
88     inline const Int4& putNumberOfReflectionsForFigureOfMerit() const { return m_num_ref_figure_of_merit; };
89     inline const Double& putContinuousNumberOfHKLInRange() const { return m_num_total_hkl; };
90 rtomiyasu 3
91 rtomiyasu 25 inline Double& putFigureOfMeritWolff() { return m_figure_of_merit_Wolff; };
92     inline Double& putFigureOfMeritWu() { return m_figure_of_merit_Wu; };
93     inline Double& putReversedFigureOfMerit() { return m_reversed_figure_of_merit; };
94 rtomiyasu 3
95 rtomiyasu 25 inline const Double& putFigureOfMeritWolff() const { return m_figure_of_merit_Wolff; };
96     inline const Double& putFigureOfMeritWu() const { return m_figure_of_merit_Wu; };
97     inline const Double& putReversedFigureOfMerit() const { return m_reversed_figure_of_merit; };
98 rtomiyasu 3
99 rtomiyasu 25 inline string putLabel_FigureOfMeritWolff() const { return putStrFigureOfMeritWolff(m_num_ref_figure_of_merit); };
100     inline string putLabel_FigureOfMeritWu() const { return putStrFigureOfMeritWu(m_num_ref_figure_of_merit); };
101     inline string putLabel_ReversedFigureOfMeritWolff() const { return putStrReversedFigureOfMeritWolff(m_num_ref_figure_of_merit); };
102     inline string putLabel_SymmetricFigureOfMeritWolff() const { return putStrSymmetricFigureOfMeritWolff(m_num_ref_figure_of_merit); };
103 rtomiyasu 3
104 rtomiyasu 25 inline Double putSymmetricFigureOfMerit() const { return m_reversed_figure_of_merit * m_figure_of_merit_Wolff; };
105     };
106 rtomiyasu 3
107     private:
108     static const NRMat<Int4> m_tmat_prim_to_face;
109     static const NRMat<Int4> m_tmat_prim_to_body;
110     static const NRMat<Int4> m_tmat_prim_to_rhomhex;
111     static const NRMat<Int4> m_tmat_prim_to_base[3];
112     static const NRMat<Int4> m_tmat_prim_to_prim;
113    
114     BravaisType m_brat;
115    
116     // This matrix is a result of optimization, therefore, it may be not reduced.
117     // m_S_optimized.second * m_S_optimized.first * Transpose(m_S_optimized.second) is obtuse.
118     SymMat43_Double m_S_optimized;
119    
120 rtomiyasu 25 // The inverse of m_S_red is Buerger-reduced.
121 rtomiyasu 3 SymMat<Double> m_S_red;
122    
123     Double m_determ_S_red;
124    
125     SetOfFigureOfMerit m_figures_of_merit;
126    
127     // Sets m_S_red from m_S_optimized.
128 rtomiyasu 25 // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) = m_S_optimized.first.
129     void setInverseOfBuergerReducedForm(NRMat<Int4>& trans_mat);
130 rtomiyasu 3
131 rtomiyasu 25 // Returns unit-cell parameters with other centrings using m_S_red.
132     void putEquivalentLatticeConstantsDegreeWithOtherCentring(const eABCaxis& abc_axis,
133     const eRHaxis& rh_axis,
134     const Double& resol,
135     vector< pair< eBravaisType, SymMat<Double> > >& ans) const;
136    
137 rtomiyasu 3 protected:
138     static const Double m_cv2;
139    
140     public:
141     LatticeFigureOfMerit();
142     LatticeFigureOfMerit(const Double& rhs); // Sets only m_determ_GramMat = rhs;
143     LatticeFigureOfMerit(const BravaisType& ebrat,
144     const SymMat43_Double& S_red);
145     virtual ~LatticeFigureOfMerit(){};
146    
147 rtomiyasu 25 void putMillerIndicesInRange(const Double& qrange_end,
148 rtomiyasu 3 vector<HKL_Q>& cal_hkl_tray) const;
149    
150 rtomiyasu 25 void setDeWolffFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata);
151    
152 rtomiyasu 3 void setWuFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
153     const Double& min_thred_num_hkl,
154     const Double& max_thred_num_hkl);
155    
156     // Return false if Qdata is not set or
157     // the number of unindexed reflections is larger max_num_false_peak.
158     void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
159     vector< VecDat3<Int4> >& closest_hkl_tray,
160     Vec_BOOL& Q_observed_flag);
161 rtomiyasu 25
162 rtomiyasu 3 inline void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata)
163     {
164     vector< VecDat3<Int4> > closest_hkl_tray;
165     Vec_BOOL Q_observed_flag;
166     setFigureOfMerit(num_ref_figure_of_merit, qdata, closest_hkl_tray, Q_observed_flag);
167     };
168    
169     // true : NormM has been improved.
170     // false : NormM has not been improved.
171     pair<bool, ZErrorMessage> fitLatticeParameterLinear(const vector<QData>& qdata,
172     const vector< VecDat3<Int4> >& hkl_to_fit,
173     const vector<bool>& fix_or_fit_flag,
174     const bool& output_view_flag);
175    
176     // Change the lattice constants to string.
177     inline string printOptimizedLatticeConstants(const eABCaxis& axis1,
178     const eRHaxis& axis2,
179     const Int4& precision) const;
180    
181     // Output information on the lattice.
182     void printLatticeInformation(const eABCaxis& abc_axis,
183     const eRHaxis& rh_axis,
184 rtomiyasu 25 const Double& resol,
185 rtomiyasu 3 const Int4& label_start0,
186     ostream* os) const;
187    
188     // Set-functions.
189     // This method assumes that S.second * S.first * Transpose(S.second) is obtuse.
190     void setLatticeConstants43(const BravaisType& brat, const SymMat43_Double& S);
191    
192     ZErrorMessage setLatticeConstants(const BravaisType& brat, const SymMat<Double>& S);
193    
194     Int4 checkDominantZone() const;
195    
196     // Replace m_S_optimized by m_S_red.
197     // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) equals the original m_S_optimized.
198     inline void reduceLatticeConstants(NRMat<Int4>& trans_mat);
199    
200     // The unit of alpha, beta, gamma is degree.
201     inline ZErrorMessage setLatticeConstantsDegree(const BravaisType& brat,
202     const VecDat3<Double>& length_axis,
203     const VecDat3<Double>& angle_axis);
204    
205     static void putLatticeConstantsDegree(const BravaisType& brat,
206     const SymMat<Double>& S,
207     const eABCaxis& axis1,
208     const eRHaxis& axis2,
209     VecDat3<Double>& length, VecDat3<Double>& angle);
210    
211     // Put-functions (Returns a value.)
212     inline void putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
213     const eRHaxis& axis2,
214     VecDat3<Double>& length, VecDat3<Double>& angle) const;
215    
216     inline void putReducedLatticeConstantsDegree(const eABCaxis& axis1,
217     const eRHaxis& axis2,
218     VecDat3<Double>& length, VecDat3<Double>& angle) const;
219    
220     inline Double putLatticeVolume() const { return 1.0 / sqrt(m_determ_S_red); };
221    
222     // Put-functions (Returns a constant reference.)
223     inline const Double& putCriticalValueSquare() const { return m_cv2; };
224    
225 rtomiyasu 17 inline const ePointGroup& enumLaueGroup() const { return m_brat.enumLaueGroup(); };
226 rtomiyasu 25 inline const eCentringType& enumCentringType() const { return m_brat.enumCentringType(); };
227     inline const eBravaisType& enumBravaisType() const { return m_brat.enumBravaisType(); };
228 rtomiyasu 3 inline const BravaisType& putBravaisType() const { return m_brat; };
229    
230 rtomiyasu 25 // The returned matrix is Buerger-reduced matrix equivalent with m_S_red_optimized.
231     inline const SymMat<Double>& putInverseOfBuergerReducedForm() const { return m_S_red; };
232 rtomiyasu 3
233     inline const SymMat43_Double& putOptimizedForm() const { return m_S_optimized; };
234     inline SymMat<Double> putSellingReducedForm() const { return transform_sym_matrix(m_S_optimized.second, m_S_optimized.first); };
235    
236     inline const Double& putDeterminantOfGramMatrix() const { return m_determ_S_red; };
237     inline const SetOfFigureOfMerit& putFiguresOfMerit() const { return m_figures_of_merit; };
238    
239     // Put-functions (Returns a non-constant reference.)
240 rtomiyasu 25 // Returns almost equivalent unit-cell parameters of different centring-types.
241     void putEquivalentLatticeConstantsDegreeWithOtherCentring(const eABCaxis& abc_axis,
242     const eRHaxis& rh_axis,
243     const Double& resol,
244     vector< pair< eBravaisType, pair< VecDat3<Double>, VecDat3<Double> > > >& ans) const;
245 rtomiyasu 3
246     static bool cmpFOMdeWolff(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
247     {
248     return lhs.m_figures_of_merit.putFigureOfMeritWolff() > rhs.m_figures_of_merit.putFigureOfMeritWolff();
249     }
250    
251     static bool cmpFOMWu(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
252     {
253     return lhs.m_figures_of_merit.putFigureOfMeritWu() > rhs.m_figures_of_merit.putFigureOfMeritWu();
254     }
255    
256     static bool cmpFOMReversed(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
257     {
258     return lhs.m_figures_of_merit.putReversedFigureOfMerit() > rhs.m_figures_of_merit.putReversedFigureOfMerit();
259     }
260    
261     static bool cmpFOMSymmetric(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
262     {
263     return lhs.m_figures_of_merit.putSymmetricFigureOfMerit() > rhs.m_figures_of_merit.putSymmetricFigureOfMerit();
264     }
265    
266     // For GUI
267     const BravaisType &getref_m_brat() const {return m_brat;}
268     BravaisType &getref_m_brat() {return m_brat;}
269     const SetOfFigureOfMerit &getref_m_figures_of_merit() const {return m_figures_of_merit;}
270     SetOfFigureOfMerit &getref_m_figures_of_merit() {return m_figures_of_merit;}
271     const SymMat43_Double &getref_m_S_red_optimized() const {return m_S_optimized;}
272     SymMat43_Double &getref_m_S_red_optimized() {return m_S_optimized;}
273     const Double &getref_m_determ_S_red() const {return m_determ_S_red;}
274     Double &getref_m_determ_S_red() {return m_determ_S_red;}
275 rtomiyasu 16 const SymMat<Double> &getref_m_S_red() const {return m_S_red;}
276     SymMat<Double> &getref_m_S_red() {return m_S_red;}
277    
278 rtomiyasu 3 };
279    
280    
281     inline string LatticeFigureOfMerit::printOptimizedLatticeConstants(const eABCaxis& axis1,
282     const eRHaxis& axis2,
283     const Int4& precision) const
284     {
285     VecDat3<Double> length_axis, angle_axis;
286     putOptimizedLatticeConstantsDegree(axis1, axis2, length_axis, angle_axis);
287     return chToString(length_axis, angle_axis, precision);
288     }
289    
290    
291     inline void LatticeFigureOfMerit::putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
292     const eRHaxis& axis2,
293     VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
294     {
295     putLatticeConstantsDegree( m_brat, m_S_optimized.first, axis1, axis2, length_axis, angle_axis );
296     }
297    
298    
299     inline void LatticeFigureOfMerit::putReducedLatticeConstantsDegree(
300     const eABCaxis& axis1,
301     const eRHaxis& axis2, VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
302     {
303 rtomiyasu 25 putLatticeConstantsDegree( m_brat, this->putInverseOfBuergerReducedForm(),
304 rtomiyasu 3 axis1, axis2, length_axis, angle_axis );
305     }
306    
307    
308    
309     inline ZErrorMessage LatticeFigureOfMerit::setLatticeConstantsDegree(const BravaisType& brat,
310     const VecDat3<Double>& length,
311     const VecDat3<Double>& angle)
312     {
313 rtomiyasu 17 LaueGroup lg(brat.enumLaueGroup());
314 rtomiyasu 3 ZErrorMessage zerr = lg->checkLatticeConstantError(length, angle);
315     if( zerr.putErrorType() != ZErrorNoError ) return zerr;
316    
317     SymMat<Double> Sval(3);
318     calCoParameter(length, angle, Sval);
319    
320     return this->setLatticeConstants(brat, Sval);
321     }
322    
323     inline void LatticeFigureOfMerit::reduceLatticeConstants(NRMat<Int4>& trans_mat)
324     {
325 rtomiyasu 25 setInverseOfBuergerReducedForm(trans_mat);
326 rtomiyasu 3 m_S_optimized.first = m_S_red;
327     m_S_optimized.second = mprod(m_S_optimized.second, trans_mat);
328     }
329    
330    
331     inline VecDat3<Int4> product_hkl(const VecDat3<Int4>& lhs, const NRMat<Int4>& rhs)
332     {
333     assert( rhs.nrows() >= 3 && rhs.ncols() == 3 );
334    
335     VecDat3<Int4> ans;
336     ans[0] = lhs[0]*rhs[0][0] + lhs[1]*rhs[1][0] + lhs[2]*rhs[2][0];
337     ans[1] = lhs[0]*rhs[0][1] + lhs[1]*rhs[1][1] + lhs[2]*rhs[2][1];
338     ans[2] = lhs[0]*rhs[0][2] + lhs[1]*rhs[1][2] + lhs[2]*rhs[2][2];
339     return ans;
340     }
341    
342    
343     template<class T>
344     inline T norm(const VecDat3<Int4>& lhs, const SymMat<T>& rhs)
345     {
346     assert( rhs.size() >= 3 );
347    
348     return rhs(0,0)*(lhs[0]*lhs[0]) + rhs(1,1)*(lhs[1]*lhs[1]) + rhs(2,2)*(lhs[2]*lhs[2])
349     + ( rhs(0,1)*(lhs[0]*lhs[1]) + rhs(0,2)*(lhs[0]*lhs[2]) + rhs(1,2)*(lhs[1]*lhs[2]) )*2.0;
350     }
351    
352    
353     inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
354     {
355     return lhs.m_determ_S_red < rhs.m_determ_S_red;
356     }
357    
358 rtomiyasu 25 void putTransformMatrixToBuergerReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);
359 rtomiyasu 3
360     #endif /*LATTICEFIGUREOFMERIT_HH_*/

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