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, ORTHORHOMBIC, HEXAGONAL, RHOMBOEDRAL, TETRAGONAL, CUBIC,
41 ORTHOROMBIC=ORTHORHOMBIC
45 { LATTICE_P,LATTICE_I,LATTICE_A,LATTICE_B,LATTICE_C,LATTICE_F};
55 const CrystalSystem system,
const CrystalCentering centering,
const float kappa=1);
64 RecUnitCell(
const float zero=0,
const float par0=0,
const float par1=0,
const float par2=0,
65 const float par3=0,
const float par4=0,
const float par5=0,
CrystalSystem lattice=CUBIC,
66 const CrystalCentering cent=LATTICE_P,
const unsigned int nbspurious=0);
75 float hkl2d(
const float h,
const float k,
const float l,REAL *derivpar=NULL,
const unsigned int derivhkl=0)
const;
81 void hkl2d_delta(
const float h,
const float k,
const float l,
const RecUnitCell &delta,
float & dmin,
float &dmax)
const;
109 CrystalCentering mCentering;
123 void operator=(
const PeakList &rhs);
125 void ImportDhklDSigmaIntensity(std::istream &is,
float defaultsigma=.001);
126 void ImportDhklIntensity(std::istream &is);
127 void ImportDhkl(std::istream &is);
128 void Import2ThetaIntensity(std::istream &is,
const float wavelength=1.5418);
146 float Simulate(
float zero,
float a,
float b,
float c,
147 float alpha,
float beta,
float gamma,
148 bool deg,
unsigned int nb=20,
unsigned int nbspurious=0,
149 float sigma=0,
float percentMissing=0,
const bool verbose=
false,
150 const bool merge=
false);
151 void ExportDhklDSigmaIntensity(std::ostream &out)
const;
154 void AddPeak(
const float d,
const float iobs=1.0,
const float dobssigma=0.0,
const float iobssigma=0.0,
155 const int h=0,
const int k=0,
const int l=0,
const float d2calc=0);
156 void RemovePeak(
unsigned int i);
157 void Print(std::ostream &os)
const;
161 hkl0(
const int h=0,
const int k=0,
const int l=0);
171 const int h=0,
const int k=0,
const int l=0,
const float d2calc=0);
216 const bool verbose=
false,
const bool storehkl=
false,
217 const bool storePredictedHKL=
false);
226 void Evolution(
unsigned int ng,
const bool randomize=
true,
const float f=0.7,
const float cr=0.5,
unsigned int np=100);
227 void SetLengthMinMax(
const float min,
const float max);
228 void SetAngleMinMax(
const float min,
const float max);
229 void SetVolumeMinMax(
const float min,
const float max);
230 void SetNbSpurious(
const unsigned int nb);
233 void SetMinMaxZeroShift(
const float min,
const float max);
235 void SetCrystalCentering(
const CrystalCentering cent);
237 virtual const string&
GetName()
const;
238 virtual void Print()
const;
240 virtual const CrystVector_REAL&
GetLSQCalc(
const unsigned int)
const;
241 virtual const CrystVector_REAL &
GetLSQObs(
const unsigned int)
const;
242 virtual const CrystVector_REAL &
GetLSQWeight(
const unsigned int)
const;
244 virtual void BeginOptimization(
const bool allowApproximations=
false,
const bool enableRestraints=
false);
245 void LSQRefine(
int nbCycle=1,
bool useLevenbergMarquardt=
true,
const bool silent=
false);
251 void DicVol(
const float minScore=10,
const unsigned int minDepth=3,
const float stopOnScore=50.0,
const unsigned int stopOnDepth=6);
258 float GetBestScore()
const;
259 const std::list<std::pair<RecUnitCell,float> >& GetSolutions()
const;
260 std::list<std::pair<RecUnitCell,float> >& GetSolutions();
262 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>());
268 float mLengthMin,mLengthMax;
269 float mAngleMin,mAngleMax;
270 float mVolumeMin,mVolumeMax;
271 float mZeroShiftMin,mZeroShiftMax;
281 unsigned int mNbSpurious;
284 mutable CrystVector_REAL mObs;
285 mutable CrystVector_REAL mCalc;
286 mutable CrystVector_REAL mWeight;
287 mutable CrystVector_REAL mDeriv;
294 float mMinScoreReport;
295 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.
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, const bool merge=false)
Generate a list of simulated peak positions, from given lattice parameters.
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.
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.