Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 25 - (show 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 /*
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/SymMatNplus1N.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_NbyN.hh"
37 #include "../centring_type/enumCentringType.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 "check_equiv.hh"
46
47
48 // Class for outputting information about a lattice in index file.
49 class LatticeFigureOfMerit
50 {
51 friend inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs);
52
53 public:
54 class SetOfFigureOfMerit
55 {
56 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
64 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
69 public:
70 SetOfFigureOfMerit(){ this->reset(); }
71 ~SetOfFigureOfMerit(){}
72
73 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
83 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
87 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
91 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
95 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
99 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
104 inline Double putSymmetricFigureOfMerit() const { return m_reversed_figure_of_merit * m_figure_of_merit_Wolff; };
105 };
106
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 // The inverse of m_S_red is Buerger-reduced.
121 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 // 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
131 // 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 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 void putMillerIndicesInRange(const Double& qrange_end,
148 vector<HKL_Q>& cal_hkl_tray) const;
149
150 void setDeWolffFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata);
151
152 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
162 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 const Double& resol,
185 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 inline const ePointGroup& enumLaueGroup() const { return m_brat.enumLaueGroup(); };
226 inline const eCentringType& enumCentringType() const { return m_brat.enumCentringType(); };
227 inline const eBravaisType& enumBravaisType() const { return m_brat.enumBravaisType(); };
228 inline const BravaisType& putBravaisType() const { return m_brat; };
229
230 // 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
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 // 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
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 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 };
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 putLatticeConstantsDegree( m_brat, this->putInverseOfBuergerReducedForm(),
304 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 LaueGroup lg(brat.enumLaueGroup());
314 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 setInverseOfBuergerReducedForm(trans_mat);
326 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 void putTransformMatrixToBuergerReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);
359
360 #endif /*LATTICEFIGUREOFMERIT_HH_*/

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