FOX/ObjCryst++  2022
Indexing.h
1 /* ObjCryst++ Object-Oriented Crystallographic Library
2  (c) 2006- Vincent Favre-Nicolin vincefn@users.sourceforge.net
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 /*
19 * source file for Indexing classes & functions
20 *
21 */
22 #ifndef _OBJCRYST_INDEXING_H_
23 #define _OBJCRYST_INDEXING_H_
24 
25 #include <math.h>
26 #include <fstream>
27 #include <iostream>
28 #include <vector>
29 #include <list>
30 #include <time.h>
31 #include "ObjCryst/RefinableObj/RefinableObj.h"
32 #include "ObjCryst/RefinableObj/LSQNumObj.h"
33 #include "ObjCryst/ObjCryst/PowderPattern.h"
34 namespace ObjCryst
35 {
40 { TRICLINIC, MONOCLINIC, ORTHOROMBIC, HEXAGONAL, RHOMBOEDRAL, TETRAGONAL, CUBIC};
41 
42 enum CrystalCentering
43 { LATTICE_P,LATTICE_I,LATTICE_A,LATTICE_B,LATTICE_C,LATTICE_F};
44 
52 float EstimateCellVolume(const float dmin, const float dmax, const float nbrefl,
53  const CrystalSystem system,const CrystalCentering centering,const float kappa=1);
54 
60 {
61  public:
62  RecUnitCell(const float zero=0,const float par0=0,const float par1=0,const float par2=0,
63  const float par3=0,const float par4=0,const float par5=0,CrystalSystem lattice=CUBIC,
64  const CrystalCentering cent=LATTICE_P, const unsigned int nbspurious=0);
65  RecUnitCell(const RecUnitCell &old);
66  void operator=(const RecUnitCell &rhs);
67  // access to ith parameter
68  //float operator[](const unsigned int i);
73  float hkl2d(const float h,const float k,const float l,REAL *derivpar=NULL,const unsigned int derivhkl=0) const;
79  void hkl2d_delta(const float h,const float k,const float l,const RecUnitCell &delta, float & dmin, float &dmax) const;
86  std::vector<float> DirectUnitCell(const bool equiv=false)const;
105  REAL par[7];
106  CrystalSystem mlattice;
107  CrystalCentering mCentering;
109  unsigned int mNbSpurious;
110 };
111 
116 class PeakList
117 {
118  public:
119  PeakList();
120  PeakList(const PeakList &old);
121  void operator=(const PeakList &rhs);
122  ~PeakList();
123  void ImportDhklDSigmaIntensity(std::istream &is,float defaultsigma=.001);
124  void ImportDhklIntensity(std::istream &is);
125  void ImportDhkl(std::istream &is);
126  void Import2ThetaIntensity(std::istream &is, const float wavelength=1.5418);
139  float Simulate(float zero, float a, float b, float c,
140  float alpha, float beta, float gamma,
141  bool deg, unsigned int nb=20, unsigned int nbspurious=0,
142  float sigma=0, float percentMissing=0, const bool verbose=false);
143  void ExportDhklDSigmaIntensity(std::ostream &out)const;
146  void AddPeak(const float d, const float iobs=1.0,const float dobssigma=0.0,const float iobssigma=0.0,
147  const int h=0,const int k=0, const int l=0,const float d2calc=0);
148  void RemovePeak(unsigned int i);
149  void Print(std::ostream &os) const;
151  struct hkl0
152  {
153  hkl0(const int h=0,const int k=0, const int l=0);
155  int h,k,l;
156  };
160  struct hkl
161  {
162  hkl(const float dobs=1.0,const float iobs=0.0,const float dobssigma=0.0,const float iobssigma=0.0,
163  const int h=0,const int k=0, const int l=0,const float d2calc=0);
165  float dobs;
167  float dobssigma;
169  float d2obs;
171  float d2obsmin;
173  float d2obsmax;
175  float iobs;
177  float iobssigma;
179  mutable int h,k,l;
181  mutable std::list<hkl0> vDicVolHKL;
183  mutable bool isIndexed;
185  mutable bool isSpurious;
187  mutable unsigned long stats;
189  mutable float d2calc;
191  mutable float d2diff;
192  };
194  vector<hkl> & GetPeakList();
196  const vector<hkl> & GetPeakList()const ;
200  mutable vector<hkl>mvHKL;
203  mutable list<hkl> mvPredictedHKL;
204 };
205 
207 float Score(const PeakList &dhkl, const RecUnitCell &ruc, const unsigned int nbSpurious=0,
208  const bool verbose=false,const bool storehkl=false,
209  const bool storePredictedHKL=false);
210 
215 {
216  public:
217  CellExplorer(const PeakList &dhkl, const CrystalSystem lattice, const unsigned int nbSpurious);
218  void Evolution(unsigned int ng,const bool randomize=true,const float f=0.7,const float cr=0.5,unsigned int np=100);
219  void SetLengthMinMax(const float min,const float max);
220  void SetAngleMinMax(const float min,const float max);
221  void SetVolumeMinMax(const float min,const float max);
222  void SetNbSpurious(const unsigned int nb);
224  void SetD2Error(const float err);
225  void SetMinMaxZeroShift(const float min,const float max);
226  void SetCrystalSystem(const CrystalSystem system);
227  void SetCrystalCentering(const CrystalCentering cent);
228  virtual const string& GetClassName() const;
229  virtual const string& GetName() const;
230  virtual void Print() const;
231  virtual unsigned int GetNbLSQFunction() const;
232  virtual const CrystVector_REAL& GetLSQCalc(const unsigned int) const;
233  virtual const CrystVector_REAL & GetLSQObs(const unsigned int) const;
234  virtual const CrystVector_REAL & GetLSQWeight(const unsigned int) const;
235  virtual const CrystVector_REAL & GetLSQDeriv(const unsigned int, RefinablePar &);
236  virtual void BeginOptimization(const bool allowApproximations=false, const bool enableRestraints=false);
237  void LSQRefine(int nbCycle=1, bool useLevenbergMarquardt=true, const bool silent=false);
243  void DicVol(const float minScore=10,const unsigned int minDepth=3,const float stopOnScore=50.0,const unsigned int stopOnDepth=6);
249  void ReduceSolutions(const bool updateReportThreshold=false);
250  float GetBestScore()const;
251  const std::list<std::pair<RecUnitCell,float> >& GetSolutions()const;
252  std::list<std::pair<RecUnitCell,float> >& GetSolutions();
253  private:
254  unsigned int RDicVol(RecUnitCell uc0, RecUnitCell uc1, unsigned int depth,unsigned long &nbCalc,const float minV,const float maxV,vector<unsigned int> vdepth=vector<unsigned int>());
255  void Init();
257  std::list<std::pair<RecUnitCell,float> > mvSolution;
258  unsigned int mnpar;
259  const PeakList *mpPeakList;
260  float mLengthMin,mLengthMax;
261  float mAngleMin,mAngleMax;
262  float mVolumeMin,mVolumeMax;
263  float mZeroShiftMin,mZeroShiftMax;
265  float mMin[7];
268  float mAmp[7];
272  CrystalCentering mCentering;
273  unsigned int mNbSpurious;
274  float mD2Error;
275  LSQNumObj mLSQObj;
276  mutable CrystVector_REAL mObs;
277  mutable CrystVector_REAL mCalc;
278  mutable CrystVector_REAL mWeight;
279  mutable CrystVector_REAL mDeriv;
283  float mBestScore;
285  std::vector<unsigned int> mvNbSolutionDepth;
286  float mMinScoreReport;
287  unsigned int mMaxDicVolDepth,mDicVolDepthReport;
290  mutable float mCosAngMax;
292  unsigned int mNbLSQExcept;
293 };
294 
295 
296 }//namespace
297 #endif
The namespace which includes all objects (crystallographic and algorithmic) in ObjCryst++.
Definition: doc-main.h:25
float EstimateCellVolume(const float dmin, const float dmax, const float nbrefl, const CrystalSystem system, const CrystalCentering centering, const float kappa)
Estimate volume from number of peaks at a given dmin See J.
Definition: Indexing.cpp:46
float Score(const PeakList &dhkl, const RecUnitCell &rpar, const unsigned int nbSpurious, const bool verbose, const bool storehkl, const bool storePredictedHKL)
Compute score for a candidate RecUnitCell and a PeakList.
Definition: Indexing.cpp:937
CrystalSystem
Different lattice types.
Definition: Indexing.h:40
Lightweight class describing the reciprocal unit cell, for the fast computation of d*_hkl^2.
Definition: Indexing.h:60
void hkl2d_delta(const float h, const float k, const float l, const RecUnitCell &delta, float &dmin, float &dmax) const
Compute d*^2 for one hkl reflection: this functions computes a d*^2 range (min,max) for a given range...
Definition: Indexing.cpp:456
unsigned int mNbSpurious
The number of spurious lines used to match this RecUnitCell.
Definition: Indexing.h:109
REAL par[7]
The 6 parameters defining 1/d_hkl^2 = d*_hkl^2, for different crystal classes, from: d*_hkl^2 = zero ...
Definition: Indexing.h:105
float hkl2d(const float h, const float k, const float l, REAL *derivpar=NULL, const unsigned int derivhkl=0) const
Compute d*^2 for hkl reflection if deriv != -1, compute derivate versus the corresponding parameter.
Definition: Indexing.cpp:108
RecUnitCell(const float zero=0, const float par0=0, const float par1=0, const float par2=0, const float par3=0, const float par4=0, const float par5=0, CrystalSystem lattice=CUBIC, const CrystalCentering cent=LATTICE_P, const unsigned int nbspurious=0)
light-weight class storing the reciprocal space unitcell
Definition: Indexing.cpp:81
std::vector< float > DirectUnitCell(const bool equiv=false) const
Compute real space unit cell from reciprocal one.
Definition: Indexing.cpp:564
Class to store positions of observed reflections.
Definition: Indexing.h:117
vector< hkl > & GetPeakList()
Get peak list.
Definition: Indexing.cpp:931
list< hkl > mvPredictedHKL
Full list of calculated HKL positions for a given solution, up to a given resolution After finding a ...
Definition: Indexing.h:203
vector< hkl > mvHKL
Predict peak positions Best h,k,l for each observed peak (for least-squares refinement) This is store...
Definition: Indexing.h:200
void AddPeak(const float d, const float iobs=1.0, const float dobssigma=0.0, const float iobssigma=0.0, const int h=0, const int k=0, const int l=0, const float d2calc=0)
Add one peak.
Definition: Indexing.cpp:887
float Simulate(float zero, float a, float b, float c, float alpha, float beta, float gamma, bool deg, unsigned int nb=20, unsigned int nbspurious=0, float sigma=0, float percentMissing=0, const bool verbose=false)
Generate a list of simulated peak positions, from given lattice parameters.
Definition: Indexing.cpp:807
One set of Miller indices, a possible indexation for a reflection.
Definition: Indexing.h:152
int h
Miller indices.
Definition: Indexing.h:155
One observed diffraction line, to be indexed.
Definition: Indexing.h:161
float d2calc
Calculated position, 1/d^2.
Definition: Indexing.h:189
bool isSpurious
Is this an impurity line ?
Definition: Indexing.h:185
unsigned long stats
Indexing statistics.
Definition: Indexing.h:187
float d2obsmax
Min value for observed peak position 1/(d-disgma/2)^2.
Definition: Indexing.h:173
float dobs
Observed peak position 1/d.
Definition: Indexing.h:165
float d2diff
1/d^2 difference, obs-calc
Definition: Indexing.h:191
float d2obsmin
Min value for observed peak position 1/(d+disgma/2)^2.
Definition: Indexing.h:171
float iobs
Observed peak intensity.
Definition: Indexing.h:175
float dobssigma
Error on peak position.
Definition: Indexing.h:167
std::list< hkl0 > vDicVolHKL
Possible Miller indices, stored during a dichotomy search.
Definition: Indexing.h:181
int h
Miller indices, after line is indexed.
Definition: Indexing.h:179
bool isIndexed
Is this line indexed ?
Definition: Indexing.h:183
float d2obs
Observed peak position 1/d^2.
Definition: Indexing.h:169
float iobssigma
Error on observed peak intensity.
Definition: Indexing.h:177
Algorithm class to find the correct indexing from observed peak positions.
Definition: Indexing.h:215
unsigned int mNbLSQExcept
Number of exceptions caught during LSQ, in a given search - above 20 LSQ is disabled.
Definition: Indexing.h:292
CrystalCentering mCentering
Centering type.
Definition: Indexing.h:272
virtual const CrystVector_REAL & GetLSQObs(const unsigned int) const
Get the observed values for the LSQ function.
Definition: Indexing.cpp:1442
virtual void BeginOptimization(const bool allowApproximations=false, const bool enableRestraints=false)
This should be called by any optimization class at the begining of an optimization.
Definition: Indexing.cpp:1483
float mBestScore
Current best score.
Definition: Indexing.h:283
float mCosAngMax
Stored value of cos(max ang) for tricilinic search - we do not want to recompute the cos at every dic...
Definition: Indexing.h:290
CrystalSystem mlattice
Lattice type for which we search.
Definition: Indexing.h:270
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
Definition: Indexing.cpp:1412
virtual const string & GetName() const
Name of the object.
Definition: Indexing.cpp:1417
void SetD2Error(const float err)
Allowed error on 1/d (squared!), used for dicvol.
Definition: Indexing.cpp:1410
virtual const CrystVector_REAL & GetLSQCalc(const unsigned int) const
Get the current calculated value for the LSQ function.
Definition: Indexing.cpp:1429
virtual unsigned int GetNbLSQFunction() const
Number of LSQ functions.
Definition: Indexing.cpp:1426
virtual const CrystVector_REAL & GetLSQWeight(const unsigned int) const
Get the weight values for the LSQ function.
Definition: Indexing.cpp:1447
std::list< std::pair< RecUnitCell, float > > mvSolution
Max number of obs reflections to use.
Definition: Indexing.h:257
float mMin[7]
Min values for all parameters (7=unit cell +zero)
Definition: Indexing.h:265
std::vector< unsigned int > mvNbSolutionDepth
Number of solutions found during dicvol search, at each depth.
Definition: Indexing.h:285
RecUnitCell mRecUnitCell
Reciprocal unit cell used for least squares refinement.
Definition: Indexing.h:281
float mAmp[7]
Max amplitude (max=min+amplitude) for all parameters All parameters are treated as periodic for DE (?...
Definition: Indexing.h:268
void DicVol(const float minScore=10, const unsigned int minDepth=3, const float stopOnScore=50.0, const unsigned int stopOnDepth=6)
Run DicVOl algorithm, store only solutions with score >minScore or depth>=minDepth,...
Definition: Indexing.cpp:2129
void ReduceSolutions(const bool updateReportThreshold=false)
Sort all solutions by score, remove duplicates.
Definition: Indexing.cpp:2632
virtual const CrystVector_REAL & GetLSQDeriv(const unsigned int, RefinablePar &)
Get the first derivative values for the LSQ function, for a given parameter.
Definition: Indexing.cpp:1453
(Quick & dirty) Least-Squares Refinement Object with Numerical derivatives
Definition: LSQNumObj.h:39
Generic class for parameters of refinable objects.
Definition: RefinableObj.h:225
Generic Refinable Object.
Definition: RefinableObj.h:784