Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 17 by rtomiyasu, Tue Apr 30 05:04:41 2013 UTC revision 25 by rtomiyasu, Mon Jul 7 02:35:51 2014 UTC
# Line 28  THE SOFTWARE. Line 28  THE SOFTWARE.
28  #define LATTICEFIGUREOFMERIT_HH_  #define LATTICEFIGUREOFMERIT_HH_
29    
30  #include "../utility_data_structure/nrutil_nr.hh"  #include "../utility_data_structure/nrutil_nr.hh"
31  #include "../utility_data_structure/SymMat43.hh"  #include "../utility_data_structure/SymMatNplus1N.hh"
32  #include "../utility_data_structure/VecDat3.hh"  #include "../utility_data_structure/VecDat3.hh"
33  #include "../utility_func/transform_sym_matrix.hh"  #include "../utility_func/transform_sym_matrix.hh"
34  #include "../utility_func/lattice_constant.hh"  #include "../utility_func/lattice_constant.hh"
35  #include "../utility_func/chToDouble.hh"  #include "../utility_func/chToDouble.hh"
36  #include "../utility_lattice_reduction/matrix_4by4.hh"  #include "../utility_lattice_reduction/matrix_NbyN.hh"
37  #include "../bravais_lattice/enumBravaisLattice.hh"  #include "../centring_type/enumCentringType.hh"
38  #include "../point_group/enumPointGroup.hh"  #include "../point_group/enumPointGroup.hh"
39  #include "../laue_group/LaueGroup.hh"  #include "../laue_group/LaueGroup.hh"
40  #include "../zparam/ZParawError.hh"  #include "../zparam/ZParawError.hh"
# Line 42  THE SOFTWARE. Line 42  THE SOFTWARE.
42  #include "../bravais_type/BravaisType.hh"  #include "../bravais_type/BravaisType.hh"
43  #include "enumSortCriterion.hh"  #include "enumSortCriterion.hh"
44  #include "HKL_Q.hh"  #include "HKL_Q.hh"
45  #include "lattice_symmetry.hh"  #include "check_equiv.hh"
46    
47    
48  class SetOfFigureOfMerit  // Class for outputting information about a lattice in index file.
49    class LatticeFigureOfMerit
50  {  {
51  private:          friend inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs);
         Int4 m_num_ref_figure_of_merit;  
         Int4 m_num_q_observed;  
         Double m_num_total_hkl;  
         //      Int4 m_num_total_hkl_disc;  
         Double m_figure_of_merit_Wolff;  
         Double m_figure_of_merit_Wu;  
 //      Double m_normalized_figure_of_merit_Wolff;  
         Double m_reversed_figure_of_merit;  
   
 //      Double m_figure_of_merit_Wolff_original;  
 //      Double m_figure_of_merit_Wu_original;  
   
         static string putStrFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCM) + num2str(num_ref_fom); };  
         static string putStrFigureOfMeritWu(const Int4& num_ref_fom){ return putLabel(SCWuM) + num2str(num_ref_fom); };  
 //      static string putStrNormalizedFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCNormM) + num2str(num_ref_fom); };  
         static string putStrReversedFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCRevM) + num2str(num_ref_fom); };  
         static string putStrSymmetricFigureOfMeritWolff(const Int4& num_ref_fom){ return putLabel(SCSymM) + num2str(num_ref_fom); };  
   
 //      static string putStrFigureOfMeritWolff_Original(const Int4& num_ref_fom){ return "M" + num2str(num_ref_fom) + "(Original)"; };  
 //      static string putStrFigureOfMeritWu_Original(const Int4& num_ref_fom){ return "Mwu" + num2str(num_ref_fom) + "(Original)"; };  
52    
53  public:  public:
54          SetOfFigureOfMerit(){ this->reset(); }          class SetOfFigureOfMerit
         ~SetOfFigureOfMerit(){}  
   
         inline void reset()  
55          {          {
56                  m_num_ref_figure_of_merit = 0;          private:
57                  m_num_q_observed = 0;                  Int4 m_num_ref_figure_of_merit;
58                  m_num_total_hkl = 0.0;                  Int4 m_num_q_observed;
59  //              m_num_total_hkl_disc = 0;                  Double m_num_total_hkl;
60                  m_figure_of_merit_Wolff = 0.0;                  Double m_figure_of_merit_Wolff;
61                  m_figure_of_merit_Wu = 0.0;                  Double m_figure_of_merit_Wu;
62  //              m_normalized_figure_of_merit_Wolff = 0.0;                  Double m_reversed_figure_of_merit;
63                  m_reversed_figure_of_merit = 0.0;  
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                  //              m_figure_of_merit_Wolff_original = 0.0;                  inline Double putSymmetricFigureOfMerit() const { return m_reversed_figure_of_merit * m_figure_of_merit_Wolff; };
105  //              m_figure_of_merit_Wu_original = 0.0;          };
         }  
   
         inline Int4& putNumberOfReflectionsForFigureOfMerit() { return m_num_ref_figure_of_merit; };  
         inline Int4& putNumQobsAssociatedWithCloseHKL() { return m_num_q_observed; };  
         inline Double& putContinuousNumberOfHKLInRange() { return m_num_total_hkl; };  
 //      inline Int4& putDiscreteNumberOfHKLInRange() { return m_num_total_hkl_disc; };  
   
         inline const Int4& putNumQobsAssociatedWithCloseHKL() const { return m_num_q_observed; };  
         inline const Int4& putNumberOfReflectionsForFigureOfMerit() const { return m_num_ref_figure_of_merit; };  
         inline const Double& putContinuousNumberOfHKLInRange() const { return m_num_total_hkl; };  
 //      inline const Int4& putDiscreteNumberOfHKLInRange() const { return m_num_total_hkl_disc; };  
   
         inline Double& putFigureOfMeritWolff() { return m_figure_of_merit_Wolff; };  
         inline Double& putFigureOfMeritWu() { return m_figure_of_merit_Wu; };  
 //      inline Double& putNormalizedFigureOfMeritWolff() { return m_normalized_figure_of_merit_Wolff; };  
         inline Double& putReversedFigureOfMerit() { return m_reversed_figure_of_merit; };  
   
         inline const Double& putFigureOfMeritWolff() const { return m_figure_of_merit_Wolff; };  
         inline const Double& putFigureOfMeritWu() const { return m_figure_of_merit_Wu; };  
 //      inline const Double& putNormalizedFigureOfMeritWolff() const { return m_normalized_figure_of_merit_Wolff; };  
         inline const Double& putReversedFigureOfMerit() const { return m_reversed_figure_of_merit; };  
   
         inline string putLabel_FigureOfMeritWolff() const { return putStrFigureOfMeritWolff(m_num_ref_figure_of_merit); };  
         inline string putLabel_FigureOfMeritWu() const { return putStrFigureOfMeritWu(m_num_ref_figure_of_merit); };  
 //      inline string putLabel_NormalizedFigureOfMeritWolff() const { return putStrNormalizedFigureOfMeritWolff(m_num_ref_figure_of_merit); };  
         inline string putLabel_ReversedFigureOfMeritWolff() const { return putStrReversedFigureOfMeritWolff(m_num_ref_figure_of_merit); };  
         inline string putLabel_SymmetricFigureOfMeritWolff() const { return putStrSymmetricFigureOfMeritWolff(m_num_ref_figure_of_merit); };  
   
         inline Double putSymmetricFigureOfMerit() const { return m_reversed_figure_of_merit * m_figure_of_merit_Wolff; };  
   
 //      inline Double& putFigureOfMeritWolff_Original() { return m_figure_of_merit_Wolff_original; };  
 //      inline const Double& putFigureOfMeritWolff_Original() const { return m_figure_of_merit_Wolff_original; };  
 //      inline Double& putFigureOfMeritWu_Original() { return m_figure_of_merit_Wu_original; };  
 //      inline const Double& putFigureOfMeritWu_Original() const { return m_figure_of_merit_Wu_original; };  
 };  
   
   
 // Class for outputting information about a lattice in index file.  
 class LatticeFigureOfMerit  
 {  
         friend inline bool operator<(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs);  
106    
107  private:  private:
108          static const NRMat<Int4> m_tmat_prim_to_face;          static const NRMat<Int4> m_tmat_prim_to_face;
# Line 141  private: Line 117  private:
117          // m_S_optimized.second * m_S_optimized.first * Transpose(m_S_optimized.second) is obtuse.          // m_S_optimized.second * m_S_optimized.first * Transpose(m_S_optimized.second) is obtuse.
118          SymMat43_Double m_S_optimized;          SymMat43_Double m_S_optimized;
119    
120          // The inverse of m_S_red is Minkowski-reduced.          // The inverse of m_S_red is Buerger-reduced.
121          SymMat<Double> m_S_red;          SymMat<Double> m_S_red;
122    
123          Double m_determ_S_red;          Double m_determ_S_red;
# Line 149  private: Line 125  private:
125          SetOfFigureOfMerit m_figures_of_merit;          SetOfFigureOfMerit m_figures_of_merit;
126                    
127          // Sets m_S_red from m_S_optimized.          // 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) equals the original m_S_optimized.          // On output, trans_mat gives the matrix such that trans_mat * m_S_red * transpose(trans_mat) = m_S_optimized.first.
129          void setInverseOfMinkowskiReducedForm(NRMat<Int4>& trans_mat);          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:  protected:
138          static const Double m_cv2;          static const Double m_cv2;
# Line 162  public: Line 144  public:
144                                                          const SymMat43_Double& S_red);                                                          const SymMat43_Double& S_red);
145          virtual ~LatticeFigureOfMerit(){};          virtual ~LatticeFigureOfMerit(){};
146                    
147          void putMillerIndicesInRange(const Double& qrange_begin, const Double& qrange_end,          void putMillerIndicesInRange(const Double& qrange_end,
148                                                                          vector<HKL_Q>& cal_hkl_tray) const;                                                                          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,          void setWuFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
153                                          const Double& min_thred_num_hkl,                                          const Double& min_thred_num_hkl,
154                                          const Double& max_thred_num_hkl);                                          const Double& max_thred_num_hkl);
# Line 174  public: Line 158  public:
158          void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,          void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata,
159                                                          vector< VecDat3<Int4> >& closest_hkl_tray,                                                          vector< VecDat3<Int4> >& closest_hkl_tray,
160                                                          Vec_BOOL& Q_observed_flag);                                                          Vec_BOOL& Q_observed_flag);
161    
162          inline void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata)          inline void setFigureOfMerit(const Int4& num_ref_figure_of_merit, const vector<QData>& qdata)
163          {          {
164                  vector< VecDat3<Int4> > closest_hkl_tray;                  vector< VecDat3<Int4> > closest_hkl_tray;
# Line 196  public: Line 181  public:
181          // Output information on the lattice.          // Output information on the lattice.
182          void printLatticeInformation(const eABCaxis& abc_axis,          void printLatticeInformation(const eABCaxis& abc_axis,
183                                                  const eRHaxis& rh_axis,                                                  const eRHaxis& rh_axis,
184                                                    const Double& resol,
185                                                  const Int4& label_start0,                                                  const Int4& label_start0,
186                                                  ostream* os) const;                                                  ostream* os) const;
187    
# Line 237  public: Line 223  public:
223          inline const Double& putCriticalValueSquare() const { return m_cv2; };          inline const Double& putCriticalValueSquare() const { return m_cv2; };
224    
225          inline const ePointGroup& enumLaueGroup() const { return m_brat.enumLaueGroup(); };          inline const ePointGroup& enumLaueGroup() const { return m_brat.enumLaueGroup(); };
226          inline const eBravaisLattice& enumBravaisLattice() const { return m_brat.enumBravaisLattice(); };          inline const eCentringType& enumCentringType() const { return m_brat.enumCentringType(); };
227          inline const eCrystalSystem& enumCrystalSystem() const { return m_brat.enumCrystalSystem(); };          inline const eBravaisType& enumBravaisType() const { return m_brat.enumBravaisType(); };
228          inline const BravaisType& putBravaisType() const { return m_brat; };          inline const BravaisType& putBravaisType() const { return m_brat; };
229    
230          // The returned matrix is Minkowski-reduced matrix equivalent with m_S_red_optimized.          // The returned matrix is Buerger-reduced matrix equivalent with m_S_red_optimized.
231          inline const SymMat<Double>& putInverseOfMinkowskiReducedForm() const { return m_S_red; };          inline const SymMat<Double>& putInverseOfBuergerReducedForm() const { return m_S_red; };
232    
 //      inline const SymMat<Double>& putOptimizedForm() const { return m_S_red_optimized.first; };  
233          inline const SymMat43_Double& putOptimizedForm() const { return m_S_optimized; };          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); };          inline SymMat<Double> putSellingReducedForm() const { return transform_sym_matrix(m_S_optimized.second, m_S_optimized.first); };
235    
# Line 252  public: Line 237  public:
237          inline const SetOfFigureOfMerit& putFiguresOfMerit() const { return m_figures_of_merit; };          inline const SetOfFigureOfMerit& putFiguresOfMerit() const { return m_figures_of_merit; };
238    
239          // Put-functions (Returns a non-constant reference.)          // Put-functions (Returns a non-constant reference.)
240          inline SetOfFigureOfMerit& putFiguresOfMerit() { return m_figures_of_merit; };          // 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)          static bool cmpFOMdeWolff(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
247          {          {
# Line 264  public: Line 253  public:
253                  return lhs.m_figures_of_merit.putFigureOfMeritWu() > rhs.m_figures_of_merit.putFigureOfMeritWu();                  return lhs.m_figures_of_merit.putFigureOfMeritWu() > rhs.m_figures_of_merit.putFigureOfMeritWu();
254          }          }
255    
 //      static bool cmpFOM(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)  
 //      {  
 //              return lhs.m_figures_of_merit.putNormalizedFigureOfMeritWolff() > rhs.m_figures_of_merit.putNormalizedFigureOfMeritWolff();  
 //      }  
   
256          static bool cmpFOMReversed(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)          static bool cmpFOMReversed(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)
257          {          {
258                  return lhs.m_figures_of_merit.putReversedFigureOfMerit() > rhs.m_figures_of_merit.putReversedFigureOfMerit();                  return lhs.m_figures_of_merit.putReversedFigureOfMerit() > rhs.m_figures_of_merit.putReversedFigureOfMerit();
# Line 279  public: Line 263  public:
263                  return lhs.m_figures_of_merit.putSymmetricFigureOfMerit() > rhs.m_figures_of_merit.putSymmetricFigureOfMerit();                  return lhs.m_figures_of_merit.putSymmetricFigureOfMerit() > rhs.m_figures_of_merit.putSymmetricFigureOfMerit();
264          }          }
265    
 //      static bool cmpFOMdeWolff_Original(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)  
 //      {  
 //              return lhs.m_figures_of_merit.putFigureOfMeritWolff_Original() > rhs.m_figures_of_merit.putFigureOfMeritWolff_Original();  
 //      }  
 //  
 //      static bool cmpFOMWu_Original(const LatticeFigureOfMerit& lhs, const LatticeFigureOfMerit& rhs)  
 //      {  
 //              return lhs.m_figures_of_merit.putFigureOfMeritWu_Original() > rhs.m_figures_of_merit.putFigureOfMeritWu_Original();  
 //      }  
   
   
266          // For GUI          // For GUI
267          const BravaisType            &getref_m_brat()             const {return m_brat;}          const BravaisType            &getref_m_brat()             const {return m_brat;}
268                BravaisType            &getref_m_brat()                   {return m_brat;}                BravaisType            &getref_m_brat()                   {return m_brat;}
# Line 327  inline void LatticeFigureOfMerit::putRed Line 300  inline void LatticeFigureOfMerit::putRed
300                  const eABCaxis& axis1,                  const eABCaxis& axis1,
301                  const eRHaxis& axis2, VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const                  const eRHaxis& axis2, VecDat3<Double>& length_axis, VecDat3<Double>& angle_axis) const
302  {  {
303          putLatticeConstantsDegree( m_brat, this->putInverseOfMinkowskiReducedForm(),          putLatticeConstantsDegree( m_brat, this->putInverseOfBuergerReducedForm(),
304                                                                  axis1, axis2, length_axis, angle_axis );                                                                  axis1, axis2, length_axis, angle_axis );
305  }  }
306    
# Line 349  inline ZErrorMessage LatticeFigureOfMeri Line 322  inline ZErrorMessage LatticeFigureOfMeri
322    
323  inline void LatticeFigureOfMerit::reduceLatticeConstants(NRMat<Int4>& trans_mat)  inline void LatticeFigureOfMerit::reduceLatticeConstants(NRMat<Int4>& trans_mat)
324  {  {
325          setInverseOfMinkowskiReducedForm(trans_mat);          setInverseOfBuergerReducedForm(trans_mat);
326          m_S_optimized.first = m_S_red;          m_S_optimized.first = m_S_red;
327          m_S_optimized.second = mprod(m_S_optimized.second, trans_mat);          m_S_optimized.second = mprod(m_S_optimized.second, trans_mat);
328  }  }
# Line 382  inline bool operator<(const LatticeFigur Line 355  inline bool operator<(const LatticeFigur
355          return lhs.m_determ_S_red < rhs.m_determ_S_red;          return lhs.m_determ_S_red < rhs.m_determ_S_red;
356  }  }
357    
358  void putTransformMatrixToMinkowskiReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);  void putTransformMatrixToBuergerReduced(const SymMat<Double>& S, NRMat<Int4>& trans_mat);
359    
360  #endif /*LATTICEFIGUREOFMERIT_HH_*/  #endif /*LATTICEFIGUREOFMERIT_HH_*/

Legend:
Removed from v.17  
changed lines
  Added in v.25

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