Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

PowderPattern.h

00001 #ifndef _OBJCRYST_POWDERPATTERN_H_
00002 #define _OBJCRYST_POWDERPATTERN_H_
00003 
00004 #include "CrystVector/CrystVector.h"
00005 #include "ObjCryst/General.h"
00006 //#include "ObjCryst/SpaceGroup.h"
00007 //#include "ObjCryst/ScatteringPower.h"
00008 //#include "ObjCryst/Scatterer.h"
00009 #include "ObjCryst/Crystal.h"
00010 
00011 //#include <stdlib.h>
00012 #include <string>
00013 //#include <iomanip>
00014 //#include <cmath>
00015 //#include <typeinfo>
00016 //#include <fstream>
00017 //#include <ctime>
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       //Clocks
00094          mutable RefinableObjClock mClockPowderPatternCalc;
00095       
00097       const PowderPattern *mpParentPowderPattern;
00098         
00099       //Eventually this should be removed (?)
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       //virtual void XMLInputOld(istream &is,const IOCrystTag &tag);
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       // Clocks
00144          RefinableObjClock mClockBackgroundPoint;
00145       // mutable clocks
00147          mutable RefinableObjClock mClockBackgroundSpline;
00148       
00149       // Use only low-angle data ?
00151          bool mUseOnlyLowAngleData;
00153          double mUseOnlyLowAngleDataLimit;
00154          
00155       //To be removed
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       //virtual void XMLInputOld(istream &is,const IOCrystTag &tag);
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       //Clocks
00219          RefinableObjClock mClockProfilePar;
00221          RefinableObjClock mClockLorentzPolarSlitCorrPar;
00222       //Clocks (internal, mutable)
00224          mutable RefinableObjClock mClockLorentzPolarSlitCorrCalc;
00226          mutable RefinableObjClock mClockProfileCalc;
00228          mutable RefinableObjClock mClockIhklCalc;
00229       //Profile parameters
00231          RefObjOpt mReflectionProfileType;
00234          double mFullProfileWidthFactor;
00236          double mCagliotiU,mCagliotiV,mCagliotiW;
00239          double mPseudoVoigtEta0,mPseudoVoigtEta1;
00241          bool mUseAsymmetricProfile;
00242       // Corrections
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       // Saved arrays to speed-up computations
00274          mutable CrystMatrix_double mSavedPowderReflProfile;
00276          mutable long mSavedPowderReflProfileNbPoint;
00278          mutable CrystVector_long mReflectionProfileFirstPixel;
00279       // Use only low-angle reflections
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       // Pattern parameters (2theta range, wavelength, radiation)
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       // Options to go faster...
00405          void SetUseFastLessPreciseFunc(const bool useItOrNot);
00410          void SetUseOnlyLowAngleData(const bool useOnlyLowAngle,const double angle);
00411       
00412       //Access to spectrum data
00414          const CrystVector_double& GetPowderPatternCalc()const;
00416          const CrystVector_double& GetPowderPatternObs()const;
00418          const CrystVector_double& GetPowderPatternObsSigma()const;
00420          const CrystVector_double& GetPowderPatternWeight()const;
00421          // Get the 2theta values corresponding to the powder spectrum.
00422          //Values are returned in radian, and are experimental 2theta values.
00423          //CrystVector_double Get2Theta()const;
00425          double Get2ThetaMin()const;
00427          double Get2ThetaStep()const;
00429          double Get2ThetaMax()const;
00430       
00431       // Clocks
00433          const RefinableObjClock& GetClockPowderPatternCalc()const;
00435          const RefinableObjClock& GetClockPowderPatternPar()const;
00437          const RefinableObjClock& GetClockPowderPatternRadiation()const;
00438       
00439       // Corrections to 2theta
00441          void Set2ThetaZero(const double newZero);
00444          void Set2ThetaDisplacement(const double displacement);
00447          void Set2ThetaTransparency(const double transparency);
00453          double Get2ThetaCorr(const double ttheta)const;
00460          long Get2ThetaCorrPixel(const double ttheta)const;
00461 
00462       // Import & export powder spectrum
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       // Statistics..
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       //Cost functions
00564          unsigned int GetNbCostFunction()const;
00565          const string& GetCostFunctionName(const unsigned int)const;
00566          const string& GetCostFunctionDescription(const unsigned int)const;
00567          virtual double GetCostFunctionValue(const unsigned int);
00568       // I/O   
00569          virtual void XMLOutput(ostream &os,int indent=0)const;
00570          virtual void XMLInput(istream &is,const XMLCrystTag &tag);
00571          //virtual void XMLInputOld(istream &is,const IOCrystTag &tag);
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       // Clocks
00604          RefinableObjClock mClockPowderPatternPar;
00606          RefinableObjClock mClockPowderPatternRadiation;
00608          mutable RefinableObjClock mClockPowderPatternCalc;
00610          RefinableObjClock mClockPowderPattern2ThetaCorr;
00612          RefinableObjClock mClockScaleFactor;
00613       
00614       //Excluded 2Theta regions in the powder spectrum, for statistics.
00616          CrystVector_double mExcludedRegionMin2Theta;
00618          CrystVector_double mExcludedRegionMax2Theta;
00619   
00620       //Various corrections to 2theta-to be used by the components
00624          double m2ThetaZero;
00627          double m2ThetaDisplacement;
00630          double m2ThetaTransparency;
00631       // Components of the powder spectrum
00633          ObjRegistry<PowderPatternComponent> mPowderPatternComponentRegistry;
00636          CrystVector_double mScaleFactor;
00637          
00639       bool mUseFastLessPreciseFunc;
00640       
00641       // For statistics
00643          bool mStatisticsExcludeBackground;
00647          bool mStatisticsUseIntegratedPeak;
00650          mutable CrystVector_int mScalableComponentIndex;
00652          mutable CrystMatrix_double mFitScaleFactorM,mFitScaleFactorB,mFitScaleFactorX;
00653          
00654       // Use only low-angle reflections
00669          bool mUseOnlyLowAngleData;
00670 
00674          double mUseOnlyLowAngleDataLimit;
00675    #ifdef __WX__CRYST__
00676    public:
00677       virtual WXCrystObjBasic* WXCreate(wxWindow*);
00678       friend class WXPowderPattern;
00679       // This should be removed
00680       friend class WXPowderPatternGraph;
00681    #endif
00682 };
00684 extern ObjRegistry<PowderPattern> gPowderPatternRegistry;
00685 //######################################################################
00686 //    PROFILE FUNCTIONS (for powder diffraction)
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 }//namespace ObjCryst
00704 #endif // _OBJCRYST_POWDERPATTERN_H_

Generated on Wed Nov 14 19:48:36 2001 for ObjCryst++ by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001