22 #ifndef _OBJCRYST_INDEXING_H_
23 #define _OBJCRYST_INDEXING_H_
31 #include "ObjCryst/RefinableObj/RefinableObj.h"
32 #include "ObjCryst/RefinableObj/LSQNumObj.h"
33 #include "ObjCryst/ObjCryst/PowderPattern.h"
40 { TRICLINIC, MONOCLINIC, ORTHOROMBIC, HEXAGONAL, RHOMBOEDRAL, TETRAGONAL, CUBIC};
43 { LATTICE_P,LATTICE_I,LATTICE_A,LATTICE_B,LATTICE_C,LATTICE_F};
53 const CrystalSystem system,
const CrystalCentering centering,
const float kappa=1);
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);
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;
107 CrystalCentering mCentering;
121 void operator=(
const PeakList &rhs);
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;
153 hkl0(
const int h=0,
const int k=0,
const int l=0);
163 const int h=0,
const int k=0,
const int l=0,
const float d2calc=0);
208 const bool verbose=
false,
const bool storehkl=
false,
209 const bool storePredictedHKL=
false);
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);
225 void SetMinMaxZeroShift(
const float min,
const float max);
227 void SetCrystalCentering(
const CrystalCentering cent);
229 virtual const string&
GetName()
const;
230 virtual void Print()
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;
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);
250 float GetBestScore()
const;
251 const std::list<std::pair<RecUnitCell,float> >& GetSolutions()
const;
252 std::list<std::pair<RecUnitCell,float> >& GetSolutions();
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>());
260 float mLengthMin,mLengthMax;
261 float mAngleMin,mAngleMax;
262 float mVolumeMin,mVolumeMax;
263 float mZeroShiftMin,mZeroShiftMax;
273 unsigned int mNbSpurious;
276 mutable CrystVector_REAL mObs;
277 mutable CrystVector_REAL mCalc;
278 mutable CrystVector_REAL mWeight;
279 mutable CrystVector_REAL mDeriv;
286 float mMinScoreReport;
287 unsigned int mMaxDicVolDepth,mDicVolDepthReport;
The namespace which includes all objects (crystallographic and algorithmic) in ObjCryst++.
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.
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.
CrystalSystem
Different lattice types.
Lightweight class describing the reciprocal unit cell, for the fast computation of d*_hkl^2.
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...
unsigned int mNbSpurious
The number of spurious lines used to match this RecUnitCell.
REAL par[7]
The 6 parameters defining 1/d_hkl^2 = d*_hkl^2, for different crystal classes, from: d*_hkl^2 = zero ...
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.
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
std::vector< float > DirectUnitCell(const bool equiv=false) const
Compute real space unit cell from reciprocal one.
Class to store positions of observed reflections.
vector< hkl > & GetPeakList()
Get peak list.
list< hkl > mvPredictedHKL
Full list of calculated HKL positions for a given solution, up to a given resolution After finding a ...
vector< hkl > mvHKL
Predict peak positions Best h,k,l for each observed peak (for least-squares refinement) This is store...
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.
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.
One set of Miller indices, a possible indexation for a reflection.
One observed diffraction line, to be indexed.
float d2calc
Calculated position, 1/d^2.
bool isSpurious
Is this an impurity line ?
unsigned long stats
Indexing statistics.
float d2obsmax
Min value for observed peak position 1/(d-disgma/2)^2.
float dobs
Observed peak position 1/d.
float d2diff
1/d^2 difference, obs-calc
float d2obsmin
Min value for observed peak position 1/(d+disgma/2)^2.
float iobs
Observed peak intensity.
float dobssigma
Error on peak position.
std::list< hkl0 > vDicVolHKL
Possible Miller indices, stored during a dichotomy search.
int h
Miller indices, after line is indexed.
bool isIndexed
Is this line indexed ?
float d2obs
Observed peak position 1/d^2.
float iobssigma
Error on observed peak intensity.
Algorithm class to find the correct indexing from observed peak positions.
unsigned int mNbLSQExcept
Number of exceptions caught during LSQ, in a given search - above 20 LSQ is disabled.
CrystalCentering mCentering
Centering type.
virtual const CrystVector_REAL & GetLSQObs(const unsigned int) const
Get the observed values for the LSQ function.
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.
float mBestScore
Current best score.
float mCosAngMax
Stored value of cos(max ang) for tricilinic search - we do not want to recompute the cos at every dic...
CrystalSystem mlattice
Lattice type for which we search.
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
virtual const string & GetName() const
Name of the object.
void SetD2Error(const float err)
Allowed error on 1/d (squared!), used for dicvol.
virtual const CrystVector_REAL & GetLSQCalc(const unsigned int) const
Get the current calculated value for the LSQ function.
virtual unsigned int GetNbLSQFunction() const
Number of LSQ functions.
virtual const CrystVector_REAL & GetLSQWeight(const unsigned int) const
Get the weight values for the LSQ function.
std::list< std::pair< RecUnitCell, float > > mvSolution
Max number of obs reflections to use.
float mMin[7]
Min values for all parameters (7=unit cell +zero)
std::vector< unsigned int > mvNbSolutionDepth
Number of solutions found during dicvol search, at each depth.
RecUnitCell mRecUnitCell
Reciprocal unit cell used for least squares refinement.
float mAmp[7]
Max amplitude (max=min+amplitude) for all parameters All parameters are treated as periodic for DE (?...
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,...
void ReduceSolutions(const bool updateReportThreshold=false)
Sort all solutions by score, remove duplicates.
virtual const CrystVector_REAL & GetLSQDeriv(const unsigned int, RefinablePar &)
Get the first derivative values for the LSQ function, for a given parameter.
(Quick & dirty) Least-Squares Refinement Object with Numerical derivatives
Generic class for parameters of refinable objects.
Generic Refinable Object.