00001 #ifndef _OBJCRYST_POWDERPATTERN_H_
00002 #define _OBJCRYST_POWDERPATTERN_H_
00003
00004 #include "CrystVector/CrystVector.h"
00005 #include "ObjCryst/General.h"
00006
00007
00008
00009 #include "ObjCryst/Crystal.h"
00010
00011
00012 #include <string>
00013
00014
00015
00016
00017
00018
00019 namespace ObjCryst
00020 {
00021
00022 class PowderPattern;
00023
00024
00031
00032 class PowderPatternComponent : virtual public RefinableObj
00033 {
00034 public:
00035 PowderPatternComponent();
00036 PowderPatternComponent(const PowderPatternComponent&);
00037 virtual ~PowderPatternComponent();
00038 virtual const string GetClassName() const;
00039
00045 virtual void SetParentPowderPattern(const PowderPattern&)=0;
00049 virtual const CrystVector_double& GetPowderPatternCalc()const=0;
00052 virtual void SetUseFastLessPreciseFunc(const bool useItOrNot)=0;
00057 virtual void SetUseOnlyLowAngleData(const bool useOnlyLowAngle,const double angle=0)=0;
00058
00066 bool IsScalable()const;
00067 protected:
00069 const RefinableObjClock& GetClockPowderPatternCalc()const;
00070
00074 virtual void CalcPowderPattern() const=0;
00075
00077 virtual void SetRadiation(const Radiation &rad)=0;
00078
00081 mutable CrystVector_double mPowderPatternCalc;
00082
00087 virtual void Prepare()=0;
00088
00090 bool mIsScalable;
00091
00092
00094
00095
00097 const PowderPattern *mpParentPowderPattern;
00098
00099
00100 friend class PowderPattern;
00101 };
00103 extern ObjRegistry<PowderPatternComponent> gPowderPatternComponentRegistry;
00104
00105
00110
00111 class PowderPatternBackground : public PowderPatternComponent
00112 {
00113 public:
00114 PowderPatternBackground();
00115 PowderPatternBackground(const PowderPatternBackground&);
00116 virtual ~PowderPatternBackground();
00117 virtual const string GetClassName() const;
00118
00119 virtual void SetParentPowderPattern(const PowderPattern&);
00120 virtual const CrystVector_double& GetPowderPatternCalc()const;
00122 void ImportUserBackground(const string &filename);
00123 void SetUseFastLessPreciseFunc(const bool useItOrNot);
00124 virtual void SetUseOnlyLowAngleData(const bool useOnlyLowAngle,const double angle=0);
00125 virtual void XMLOutput(ostream &os,int indent=0)const;
00126 virtual void XMLInput(istream &is,const XMLCrystTag &tag);
00127
00128 protected:
00129 virtual void CalcPowderPattern() const;
00130 virtual void SetRadiation(const Radiation &rad);
00131 virtual void Prepare();
00132
00134 PowderBackgroundInterpType mBackgroundType;
00136 int mBackgroundNbPoint;
00138 CrystVector_double mBackgroundInterpPoint2Theta;
00140 CrystVector_double mBackgroundInterpPointIntensity;
00141
00142
00144
00145
00147
00148
00149
00151
00153
00154
00155
00156 friend class PowderPattern;
00157 #ifdef __WX__CRYST__
00158 public:
00159 virtual WXCrystObjBasic* WXCreate(wxWindow*);
00160 friend class WXPowderPatternBackground;
00161 #endif
00162 };
00163
00164
00169
00170 class PowderPatternDiffraction : public PowderPatternComponent,public ScatteringData
00171 {
00172 public:
00173 PowderPatternDiffraction();
00174 PowderPatternDiffraction(const PowderPatternDiffraction&);
00175 virtual ~PowderPatternDiffraction();
00176 virtual PowderPatternDiffraction* CreateCopy()const;
00177 virtual const string GetClassName() const;
00178
00179 virtual void SetParentPowderPattern(const PowderPattern&);
00180 virtual const CrystVector_double& GetPowderPatternCalc()const;
00181
00192 void SetReflectionProfilePar(const ReflectionProfileType prof,
00193 const double fwhmCagliotiW,
00194 const double fwhmCagliotiU=0,
00195 const double fwhmCagliotiV=0,
00196 const double eta0=0.5,
00197 const double eta1=0.);
00198 void SetUseFastLessPreciseFunc(const bool useItOrNot);
00199 virtual void SetUseOnlyLowAngleData(const bool useOnlyLowAngle,const double angle=0);
00200 virtual void GenHKLFullSpace();
00201 virtual void XMLOutput(ostream &os,int indent=0)const;
00202 virtual void XMLInput(istream &is,const XMLCrystTag &tag);
00203
00204 protected:
00205 virtual void CalcPowderPattern() const;
00206
00208 void CalcPowderReflProfile()const;
00210 void CalcLorentzPolarCorr()const;
00213 virtual void CalcIhkl() const;
00214 virtual void SetRadiation(const Radiation &rad);
00215 virtual void Prepare();
00216 virtual void InitOptions();
00217
00219
00221
00222
00224
00226
00228
00229
00231
00234
00236
00239
00241
00242
00257 mutable CrystVector_double mLorentzPolarSlitCorr;
00259 bool mNeedLorentzCorr;
00262 bool mNeedPolarCorr;
00264 bool mNeedSlitApertureCorr;
00267 double mPolarAfactor;
00268
00270 mutable CrystVector_double mIhklCalc;
00271
00272
00274
00276
00278
00279
00293 bool mUseOnlyLowAngleData;
00294
00298 double mUseOnlyLowAngleDataLimit;
00301 CrystVector_long mUseOnlyLowAngleData_SavedH,
00302 mUseOnlyLowAngleData_SavedK,
00303 mUseOnlyLowAngleData_SavedL;
00304 #ifdef __WX__CRYST__
00305 public:
00306 virtual WXCrystObjBasic* WXCreate(wxWindow*);
00307 friend class WXPowderPatternDiffraction;
00308 #endif
00309 };
00310
00311
00312
00320
00321 class PowderPattern : public RefinableObj
00322 {
00323 public:
00324 PowderPattern();
00325 PowderPattern(const PowderPattern&);
00326 ~PowderPattern();
00327 virtual const string GetClassName() const;
00334 void AddPowderPatternComponent(PowderPatternComponent &);
00336 unsigned int GetNbPowderPatternComponent()const;
00338 const PowderPatternComponent& GetPowderPatternComponent(const string &name)const;
00340 const PowderPatternComponent& GetPowderPatternComponent(const int)const;
00342 PowderPatternComponent& GetPowderPatternComponent(const string &name);
00344 PowderPatternComponent& GetPowderPatternComponent(const int);
00345
00346
00357 void SetPowderPatternPar(const double tthetaMin,
00358 const double tthetaStep,
00359 unsigned long nbPoint);
00361 unsigned long GetNbPoint()const;
00362
00364 void SetRadiation(const Radiation &radiation);
00366 const Radiation& GetRadiation()const;
00367
00369 void SetRadiationType(const RadiationType radiation);
00371 RadiationType GetRadiationType()const;
00373 void SetWavelength(const double lambda);
00374
00394 void SetWavelength(const string &XRayTubeElementName,const double alpha12ratio=0.5);
00395
00397 void SetEnergy(const double energy);
00399 double GetWavelength()const;
00400
00401
00405
00410 void SetUseOnlyLowAngleData(const bool useOnlyLowAngle,const double angle);
00411
00412
00414
00416
00418
00420
00421
00422
00423
00425
00427
00429
00430
00431
00433
00435
00437
00438
00439
00441
00444
00447
00453
00460
00461
00462
00466 void ImportPowderPatternFullprof(const string &fullprofFileName);
00469 void ImportPowderPatternPSI_DMC(const string &filename);
00473 void ImportPowderPatternILL_D1A5(const string &filename);
00477 void ImportPowderPatternXdd(const string &fileName);
00481 void ImportPowderPatternSietronicsCPI(const string &fileName);
00487 void ImportPowderPattern2ThetaObsSigma(const string &fileName,const int nbSkip=0);
00494 void ImportPowderPattern2ThetaObs(const string &fileName,const int nbSkip=0);
00500 void SetPowderPatternObs(const CrystVector_double& obs);
00501
00507 void SavePowderPattern(const string &filename="powderPattern.out") const;
00510 void PrintObsCalcData(ostream&os=cout)const;
00511
00512
00518 double GetR()const ;
00523 double GetRw()const;
00529 double GetChiSq()const;
00531 void FitScaleFactorForR();
00533 void FitScaleFactorForRw();
00535 void SetSigmaToSqrtIobs();
00540 void SetWeightToInvSigmaSq(const double minRelatSigma=1e-3);
00542 void SetWeightToSinTheta(const double power=1.);
00544 void SetWeightToUnit();
00552 void SetWeightPolynomial(const double a, const double b, const double c,
00553 const double minRelatIobs=1e-3);
00554
00560 void Add2ThetaExcludedRegion(const double min2Theta,const double max2theta);
00561
00562
00564
00565 const string& GetCostFunctionName(const unsigned int)const;
00566 const string& GetCostFunctionDescription(const unsigned int)const;
00567 virtual double GetCostFunctionValue(const unsigned int);
00568
00569 virtual void XMLOutput(ostream &os,int indent=0)const;
00570 virtual void XMLInput(istream &is,const XMLCrystTag &tag);
00571
00572 void Prepare();
00573 protected:
00575 void CalcPowderPattern() const;
00577 virtual void Init();
00580 mutable CrystVector_double mPowderPatternCalc;
00583 mutable CrystVector_double mPowderPatternBackgroundCalc;
00585 CrystVector_double mPowderPatternObs;
00587 CrystVector_double mPowderPatternObsSigma;
00589 CrystVector_double mPowderPatternWeight;
00590
00592 double m2ThetaMin,m2ThetaStep;
00594 unsigned long mNbPoint;
00595
00598 double mWavelength;
00600 Radiation mRadiation;
00601
00602
00604
00606
00608
00610
00612
00613
00614
00616
00618
00619
00620
00624
00627
00630
00631
00633
00636
00637
00639 bool mUseFastLessPreciseFunc;
00640
00641
00643
00647
00650
00652
00653
00654
00669 bool mUseOnlyLowAngleData;
00670
00674 double mUseOnlyLowAngleDataLimit;
00675 #ifdef __WX__CRYST__
00676 public:
00677 virtual WXCrystObjBasic* WXCreate(wxWindow*);
00678 friend class WXPowderPattern;
00679
00680 friend class WXPowderPatternGraph;
00681 #endif
00682 };
00684 extern ObjRegistry<PowderPattern> gPowderPatternRegistry;
00685
00686
00687
00688
00692 CrystVector_double PowderProfileGauss (const CrystVector_double theta,
00693 const double fwhm,
00694 const double asymmetryPar=1.);
00698 CrystVector_double PowderProfileLorentz(const CrystVector_double theta,
00699 const double fwhm,
00700 const double asymmetryPar=1.);
00701
00702
00703 }
00704 #endif // _OBJCRYST_POWDERPATTERN_H_