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 33 - (show annotations) (download) (as text)
Wed Sep 7 04:38:51 2016 UTC (7 years, 6 months ago) by rtomiyasu
File MIME type: text/x-c++hdr
File size: 15355 byte(s)
The output format for base-centered monoclinic cells was corrected.
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 const Int4& irc_type,
149 vector<HKL_Q>& cal_hkl_tray) const;
150
151 void setDeWolffFigureOfMerit(const Int4& num_ref_figure_of_merit, const Int4& irc_type, const vector<QData>& qdata);
152
153 void setWuFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
154 const Double& min_thred_num_hkl,
155 const Double& max_thred_num_hkl);
156
157 // Return false if Qdata is not set or
158 // the number of unindexed reflections is larger max_num_false_peak.
159 void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
160 vector< VecDat3<Int4> >& closest_hkl_tray,
161 Vec_BOOL& Q_observed_flag);
162
163 inline void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata)
164 {
165 vector< VecDat3<Int4> > closest_hkl_tray;
166 Vec_BOOL Q_observed_flag;
167 setFigureOfMerit(num_ref_figure_of_merit, qdata, closest_hkl_tray, Q_observed_flag);
168 };
169
170 // true : NormM has been improved.
171 // false : NormM has not been improved.
172 pair<bool, ZErrorMessage> fitLatticeParameterLinear(const vector<QData>& qdata,
173 const vector< VecDat3<Int4> >& hkl_to_fit,
174 const vector<bool>& fix_or_fit_flag,
175 const bool& output_view_flag);
176
177 // Change the lattice constants to string.
178 inline string printOptimizedLatticeConstants(const eABCaxis& axis1,
179 const eRHaxis& axis2,
180 const Int4& precision) const;
181
182 // Output information on the lattice.
183 void printLatticeInformation(const eABCaxis& abc_axis,
184 const eRHaxis& rh_axis,
185 const Double& resol,
186 const Int4& label_start0,
187 ostream* os) const;
188
189 // Set-functions.
190 // This method assumes that S.second * S.first * Transpose(S.second) is obtuse.
191 void setLatticeConstants43(const BravaisType& brat, const SymMat43_Double& S);
192
193 ZErrorMessage setLatticeConstants(const BravaisType& brat, const SymMat<Double>& S);
194
195 Int4 checkDominantZone() const;
196
197 // Replace m_S_optimized by m_S_red.
198 // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) equals the original m_S_optimized.
199 inline void reduceLatticeConstants(NRMat<Int4>& trans_mat);
200
201 // The unit of alpha, beta, gamma is degree.
202 inline ZErrorMessage setLatticeConstantsDegree(const BravaisType& brat,
203 const VecDat3<Double>& length_axis,
204 const VecDat3<Double>& angle_axis);
205
206 static void putLatticeConstantsDegree(const BravaisType& brat,
207 const SymMat<Double>& S,
208 const eABCaxis& axis1,
209 const eRHaxis& axis2,
210 VecDat3<Double>& length, VecDat3<Double>& angle);
211
212 // Put-functions (Returns a value.)
213 inline void putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
214 const eRHaxis& axis2,
215 VecDat3<Double>& length, VecDat3<Double>& angle) const;
216
217 inline void putReducedLatticeConstantsDegree(const eABCaxis& axis1,
218 const eRHaxis& axis2,
219 VecDat3<Double>& length, VecDat3<Double>& angle) const;
220
221 inline Double putLatticeVolume() const { return 1.0 / sqrt(m_determ_S_red); };
222
223 // Put-functions (Returns a constant reference.)
224 inline const Double& putCriticalValueSquare() const { return m_cv2; };
225
226 inline const ePointGroup& enumLaueGroup() const { return m_brat.enumLaueGroup(); };
227 inline const eCentringType& enumCentringType() const { return m_brat.enumCentringType(); };
228 inline const eBravaisType& enumBravaisType() const { return m_brat.enumBravaisType(); };
229 inline const BravaisType& putBravaisType() const { return m_brat; };
230
231 // The returned matrix is Buerger-reduced matrix equivalent with m_S_red_optimized.
232 inline const SymMat<Double>& putInverseOfBuergerReducedForm() const { return m_S_red; };
233
234 inline const SymMat43_Double& putOptimizedForm() const { return m_S_optimized; };
235 inline SymMat<Double> putSellingReducedForm() const { return transform_sym_matrix(m_S_optimized.second, m_S_optimized.first); };
236
237 inline const Double& putDeterminantOfGramMatrix() const { return m_determ_S_red; };
238 inline const SetOfFigureOfMerit& putFiguresOfMerit() const { return m_figures_of_merit; };
239
240 // Put-functions (Returns a non-constant reference.)
241 // Returns almost equivalent unit-cell parameters of different centring-types.
242 void putEquivalentLatticeConstantsDegreeWithOtherCentring(const eABCaxis& abc_axis,
243 const eRHaxis& rh_axis,
244 const Double& resol,
245 vector< pair< eBravaisType, pair< VecDat3<Double>, VecDat3<Double> > > >& ans) const;
246
247 static bool cmpFOMdeWolff(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
248 {
249 return lhs.m_figures_of_merit.putFigureOfMeritWolff() > rhs.m_figures_of_merit.putFigureOfMeritWolff();
250 }
251
252 static bool cmpFOMWu(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
253 {
254 return lhs.m_figures_of_merit.putFigureOfMeritWu() > rhs.m_figures_of_merit.putFigureOfMeritWu();
255 }
256
257 static bool cmpFOMReversed(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
258 {
259 return lhs.m_figures_of_merit.putReversedFigureOfMerit() > rhs.m_figures_of_merit.putReversedFigureOfMerit();
260 }
261
262 static bool cmpFOMSymmetric(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
263 {
264 return lhs.m_figures_of_merit.putSymmetricFigureOfMerit() > rhs.m_figures_of_merit.putSymmetricFigureOfMerit();
265 }
266
267 // For GUI
268 const BravaisType &getref_m_brat() const {return m_brat;}
269 BravaisType &getref_m_brat() {return m_brat;}
270 const SetOfFigureOfMerit &getref_m_figures_of_merit() const {return m_figures_of_merit;}
271 SetOfFigureOfMerit &getref_m_figures_of_merit() {return m_figures_of_merit;}
272 const SymMat43_Double &getref_m_S_red_optimized() const {return m_S_optimized;}
273 SymMat43_Double &getref_m_S_red_optimized() {return m_S_optimized;}
274 const Double &getref_m_determ_S_red() const {return m_determ_S_red;}
275 Double &getref_m_determ_S_red() {return m_determ_S_red;}
276 const SymMat<Double> &getref_m_S_red() const {return m_S_red;}
277 SymMat<Double> &getref_m_S_red() {return m_S_red;}
278
279 };
280
281
282 inline string LatticeFigureOfMerit::printOptimizedLatticeConstants(const eABCaxis& axis1,
283 const eRHaxis& axis2,
284 const Int4& precision) const
285 {
286 VecDat3<Double> length_axis, angle_axis;
287 putOptimizedLatticeConstantsDegree(axis1, axis2, length_axis, angle_axis);
288 return chToString(length_axis, angle_axis, precision);
289 }
290
291
292 inline void LatticeFigureOfMerit::putOptimizedLatticeConstantsDegree(const eABCaxis& axis1,
293 const eRHaxis& axis2,
294 VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
295 {
296 putLatticeConstantsDegree( m_brat, m_S_optimized.first, axis1, axis2, length_axis, angle_axis );
297 }
298
299
300 inline void LatticeFigureOfMerit::putReducedLatticeConstantsDegree(
301 const eABCaxis& axis1,
302 const eRHaxis& axis2, VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
303 {
304 putLatticeConstantsDegree( m_brat, this->putInverseOfBuergerReducedForm(),
305 axis1, axis2, length_axis, angle_axis );
306 }
307
308
309
310 inline ZErrorMessage LatticeFigureOfMerit::setLatticeConstantsDegree(const BravaisType& brat,
311 const VecDat3<Double>& length,
312 const VecDat3<Double>& angle)
313 {
314 LaueGroup lg(brat.enumLaueGroup());
315 ZErrorMessage zerr = lg->checkLatticeConstantError(length, angle);
316 if( zerr.putErrorType() != ZErrorNoError ) return zerr;
317
318 SymMat<Double> Sval(3);
319 calCoParameter(length, angle, Sval);
320
321 return this->setLatticeConstants(brat, Sval);
322 }
323
324 inline void LatticeFigureOfMerit::reduceLatticeConstants(NRMat<Int4>& trans_mat)
325 {
326 // trans_mat * m_S_red * transpose(trans_mat) = m_S_optimized.first(old).
327 setInverseOfBuergerReducedForm(trans_mat);
328 // m_S_optimized.first(new) = m_S_red.
329 m_S_optimized.first = m_S_red;
330
331 // m_S_optimized.second(new) * m_S_optimized.first(new) * transpose(m_S_optimized.second(new))
332 // = m_S_optimized.second(old) * m_S_optimized.first(old) * transpose(m_S_optimized.second(old)) is Delone reduced.
333 m_S_optimized.second = mprod(m_S_optimized.second, trans_mat);
334 }
335
336
337 template<class T>
338 inline T norm(const VecDat3<Int4>& lhs, const SymMat<T>& rhs)
339 {
340 assert( rhs.size() >= 3 );
341
342 return rhs(0,0)*(lhs[0]*lhs[0]) + rhs(1,1)*(lhs[1]*lhs[1]) + rhs(2,2)*(lhs[2]*lhs[2])
343 + ( rhs(0,1)*(lhs[0]*lhs[1]) + rhs(0,2)*(lhs[0]*lhs[2]) + rhs(1,2)*(lhs[1]*lhs[2]) )*2.0;
344 }
345
346
347 inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
348 {
349 return lhs.m_determ_S_red < rhs.m_determ_S_red;
350 }
351
352 void putTransformMatrixToBuergerReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);
353
354 #endif /*LATTICEFIGUREOFMERIT_HH_*/

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