24 #include "ObjCryst/ObjCryst/ReflectionProfile.h"
25 #include "ObjCryst/Quirks/VFNStreamFormat.h"
27 #include "ObjCryst/wxCryst/wxPowderPattern.h"
30 #ifdef HAVE_SSE_MATHFUN
31 #include "ObjCryst/Quirks/sse_mathfun.h"
36 #if defined(_MSC_VER) || defined(__BORLANDC__)
37 #undef min // Predefined macros.... (wx?)
40 double erfc(
const double x)
42 if(x<0.0)
return 2.0-erfc(-x);
46 for(
int i=1;i<=50;i++)
51 static const double spi=2/sqrt(M_PI);
52 return 1-spi*exp(-x*x)*y;
55 for(
int i=1;i<=10;i++)
60 static const double invsqrtpi=1.0/sqrt(M_PI);
61 return invsqrtpi*exp(-x*x)/x*y;
70 ObjRegistry<ReflectionProfile>
77 ReflectionProfile::ReflectionProfile():
80 ReflectionProfile::ReflectionProfile(
const ReflectionProfile &old)
82 ReflectionProfile::~ReflectionProfile()
84 bool ReflectionProfile::IsAnisotropic()
const
91 ReflectionProfilePseudoVoigt::ReflectionProfilePseudoVoigt():
93 mCagliotiU(0),mCagliotiV(0),mCagliotiW(.01*DEG2RAD*DEG2RAD),
94 mPseudoVoigtEta0(0.5),mPseudoVoigtEta1(0.0),
95 mAsymBerarBaldinozziA0(0.0),mAsymBerarBaldinozziA1(0.0),
96 mAsymBerarBaldinozziB0(0.0),mAsymBerarBaldinozziB1(0.0),
97 mAsym0(1.0),mAsym1(0.0),mAsym2(0.0)
99 this->InitParameters();
102 ReflectionProfilePseudoVoigt::ReflectionProfilePseudoVoigt
103 (
const ReflectionProfilePseudoVoigt &old):
104 mCagliotiU(old.mCagliotiU),mCagliotiV(old.mCagliotiV),mCagliotiW(old.mCagliotiW),
105 mPseudoVoigtEta0(old.mPseudoVoigtEta0),mPseudoVoigtEta1(old.mPseudoVoigtEta1),
106 mAsymBerarBaldinozziA0(old.mAsymBerarBaldinozziA0),
107 mAsymBerarBaldinozziA1(old.mAsymBerarBaldinozziA1),
108 mAsymBerarBaldinozziB0(old.mAsymBerarBaldinozziB0),
109 mAsymBerarBaldinozziB1(old.mAsymBerarBaldinozziB1),
110 mAsym0(old.mAsym0),mAsym1(old.mAsym1),mAsym2(old.mAsym2)
112 this->InitParameters();
115 ReflectionProfilePseudoVoigt::~ReflectionProfilePseudoVoigt()
126 ReflectionProfilePseudoVoigt* ReflectionProfilePseudoVoigt::CreateCopy()
const
128 return new ReflectionProfilePseudoVoigt(*
this);
133 static string className=
"ReflectionProfilePseudoVoigt";
138 const REAL center,
const REAL h,
const REAL k,
const REAL l)
const
140 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::GetProfile(),c="<<center,2)
141 REAL fwhm= mCagliotiW
142 +mCagliotiV*tan(center/2.0)
146 VFN_DEBUG_MESSAGE(
"ReflectionProfilePseudoVoigt::GetProfile(): fwhm**2<0 ! "
147 <<h<<
","<<k<<
","<<l<<
":"<<center<<
","<<
mCagliotiU<<
","<<mCagliotiV<<
","<<
","<<mCagliotiW<<
":"<<fwhm,10);
150 else fwhm=sqrt(fwhm);
151 CrystVector_REAL profile,tmpV;
152 const REAL asym=
mAsym0+mAsym1/sin(center)+mAsym2/pow((REAL)sin(center),(REAL)2.0);
153 profile=PowderProfileGauss(x,fwhm,center,asym);
161 tmpV=PowderProfileLorentz(x,fwhm,center,asym);
167 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigt::GetProfile()",2)
172 const REAL fwhmCagliotiU,
173 const REAL fwhmCagliotiV,
178 mCagliotiV=fwhmCagliotiV;
179 mCagliotiW=fwhmCagliotiW;
181 mPseudoVoigtEta1=eta1;
187 const REAL center,
const REAL h,
const REAL k,
const REAL l)
189 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth()",2)
191 const int halfnb=nb/2;
192 CrystVector_REAL x(nb);
194 REAL fwhm= mCagliotiW
195 +mCagliotiV*tan(center/2.0)
197 if(fwhm<=0) fwhm=1e-6;
198 else fwhm=sqrt(fwhm);
199 CrystVector_REAL prof;
204 const REAL tmp=fwhm*n/nb;
205 for(
int i=0;i<nb;i++) *p++ = tmp*(i-halfnb);
209 const REAL max=prof.max();
210 const REAL test=max*relativeIntensity;
212 if((prof(0)<test)&&(prof(nb-1)<test))
215 while(*p<test){ p++; n1++;n2++;}
217 while(*p>test){ p++; n2++;}
218 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth():"<<x(n2)-x(n1),10)
221 VFN_DEBUG_MESSAGE(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth():"<<relativeIntensity<<
","
222 <<fwhm<<
","<<center<<
","<<h<<
","<<k<<
","<<l<<
","<<max<<
","<<test,2)
233 gpRefParTypeScattDataProfileWidth,
234 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
240 RefinablePar tmp(
"V",&mCagliotiV,-1/RAD2DEG/RAD2DEG,1./RAD2DEG/RAD2DEG,
241 gpRefParTypeScattDataProfileWidth,
242 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
249 gpRefParTypeScattDataProfileWidth,
250 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
257 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
263 RefinablePar tmp(
"Eta1",&mPseudoVoigtEta1,-1,1.,gpRefParTypeScattDataProfileType,
264 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
272 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
278 RefinablePar tmp(
"AsymA1",&mAsymBerarBaldinozziA1,-0.05,0.05,gpRefParTypeScattDataProfileAsym,
279 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
285 RefinablePar tmp(
"AsymB0",&mAsymBerarBaldinozziB0,-0.01,0.01,gpRefParTypeScattDataProfileAsym,
286 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
292 RefinablePar tmp(
"AsymB1",&mAsymBerarBaldinozziB1,-0.01,0.01,gpRefParTypeScattDataProfileAsym,
293 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
301 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
307 RefinablePar tmp(
"Asym1",&mAsym1,-1.0,1.0,gpRefParTypeScattDataProfileAsym,
308 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
314 RefinablePar tmp(
"Asym2",&mAsym2,-1.0,1.0,gpRefParTypeScattDataProfileAsym,
315 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
324 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::XMLOutput():"<<this->
GetName(),5)
325 for(
int i=0;i<indent;i++) os <<
" " ;
367 tag.SetIsEndTag(
true);
368 for(
int i=0;i<indent;i++) os <<
" " ;
370 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigt::XMLOutput():"<<this->
GetName(),5)
374 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::XMLInput():"<<this->
GetName(),5)
375 for(
unsigned int i=0;i<tagg.GetNbAttribute();i++)
377 if(
"Name"==tagg.GetAttributeName(i)) this->
SetName(tagg.GetAttributeValue(i));
382 if((
"ReflectionProfilePseudoVoigt"==tag.GetName())&&tag.IsEndTag())
385 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigt::Exit():"<<this->
GetName(),5)
388 if(
"Par"==tag.GetName())
390 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
392 if(
"Name"==tag.GetAttributeName(i))
394 if(
"U"==tag.GetAttributeValue(i))
399 if(
"V"==tag.GetAttributeValue(i))
404 if(
"W"==tag.GetAttributeValue(i))
409 if(
"Eta0"==tag.GetAttributeValue(i))
414 if(
"Eta1"==tag.GetAttributeValue(i))
419 if(
"Asym0"==tag.GetAttributeValue(i))
424 if(
"Asym1"==tag.GetAttributeValue(i))
429 if(
"Asym2"==tag.GetAttributeValue(i))
435 if(
"AsymA0"==tag.GetAttributeValue(i))
440 if(
"AsymA1"==tag.GetAttributeValue(i))
445 if(
"AsymB0"==tag.GetAttributeValue(i))
450 if(
"AsymB1"==tag.GetAttributeValue(i))
460 if(
"Option"==tag.GetName())
462 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
463 if(
"Name"==tag.GetAttributeName(i))
470 WXCrystObjBasic* ReflectionProfilePseudoVoigt::WXCreate(wxWindow* parent)
472 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::WXCreate()",6)
486 ReflectionProfilePseudoVoigtAnisotropic::ReflectionProfilePseudoVoigtAnisotropic():
487 mCagliotiU(0),mCagliotiV(0),mCagliotiW(.01*DEG2RAD*DEG2RAD),mScherrerP(0),mLorentzX(0),mLorentzY(0),
488 mLorentzGammaHH(0),mLorentzGammaKK(0),mLorentzGammaLL(0),mLorentzGammaHK(0),mLorentzGammaHL(0),mLorentzGammaKL(0),
494 ReflectionProfilePseudoVoigtAnisotropic::ReflectionProfilePseudoVoigtAnisotropic(
const ReflectionProfilePseudoVoigtAnisotropic &old):
495 mCagliotiU(old.mCagliotiU),mCagliotiV(old.mCagliotiV),mCagliotiW(old.mCagliotiW),mScherrerP(old.mScherrerP),mLorentzX(old.mLorentzX),mLorentzY(old.mLorentzY),
496 mLorentzGammaHH(old.mLorentzGammaHH),mLorentzGammaKK(old.mLorentzGammaKK),mLorentzGammaLL(old.mLorentzGammaLL),mLorentzGammaHK(old.mLorentzGammaHK),mLorentzGammaHL(old.mLorentzGammaHL),mLorentzGammaKL(old.mLorentzGammaKL),
497 mPseudoVoigtEta0(old.mPseudoVoigtEta0),mPseudoVoigtEta1(old.mPseudoVoigtEta1),mAsym0(old.mAsym0),mAsym1(old.mAsym1),mAsym2(old.mAsym2)
501 ReflectionProfilePseudoVoigtAnisotropic::~ReflectionProfilePseudoVoigtAnisotropic()
512 ReflectionProfilePseudoVoigtAnisotropic* ReflectionProfilePseudoVoigtAnisotropic::CreateCopy()
const
514 return new ReflectionProfilePseudoVoigtAnisotropic(*
this);
519 static string className=
"ReflectionProfilePseudoVoigtAnisotropic";
524 const REAL h,
const REAL k,
const REAL l)
const
526 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigtAnisotropic::GetProfile()",2)
527 const REAL tantheta=tan(center/2.0);
528 const REAL costheta=cos(center/2.0);
529 const REAL sintheta=sin(center/2.0);
530 const REAL fwhmG=sqrt(abs( mCagliotiW+mCagliotiV*tantheta+
mCagliotiU*tantheta*tantheta+mScherrerP/(costheta*costheta)));
531 const REAL gam=mLorentzGammaHH*h*h+mLorentzGammaKK*k*k+mLorentzGammaLL*l*l+2*mLorentzGammaHK*h*k+2*mLorentzGammaHL*h*l+2*mLorentzGammaKL*k*l;
532 const REAL fwhmL= mLorentzX/costheta+(mLorentzY+gam/(sintheta*sintheta))*tantheta;
538 CrystVector_REAL profile(x.numElements()),tmpV(x.numElements());
539 const REAL asym=
mAsym0+mAsym1/sin(center)+mAsym2/pow((REAL)sin(center),(REAL)2.0);
540 VFN_DEBUG_MESSAGE(
"ReflectionProfilePseudoVoigtAnisotropic::GetProfile():("<<
int(h)<<
","<<
int(k)<<
","<<
int(l)<<
"),fwhmG="<<fwhmG<<
",fwhmL="<<fwhmL<<
",gam="<<gam<<
",asym="<<asym<<
",center="<<center<<
",eta="<<eta, 2)
543 profile=PowderProfileGauss(x,fwhmG,center,asym);
549 tmpV=PowderProfileLorentz(x,fwhmL,center,asym);
554 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigtAnisotropic::GetProfile()",2)
559 const REAL fwhmCagliotiU,
560 const REAL fwhmCagliotiV,
561 const REAL fwhmGaussP,
562 const REAL fwhmLorentzX,
563 const REAL fwhmLorentzY,
564 const REAL fwhmLorentzGammaHH,
565 const REAL fwhmLorentzGammaKK,
566 const REAL fwhmLorentzGammaLL,
567 const REAL fwhmLorentzGammaHK,
568 const REAL fwhmLorentzGammaHL,
569 const REAL fwhmLorentzGammaKL,
570 const REAL pseudoVoigtEta0,
571 const REAL pseudoVoigtEta1,
578 mCagliotiV=fwhmCagliotiV;
579 mCagliotiW=fwhmCagliotiW;
580 mLorentzX=fwhmLorentzX;
581 mLorentzY=fwhmLorentzY;
582 mLorentzGammaHH=fwhmLorentzGammaHH;
583 mLorentzGammaKK=fwhmLorentzGammaKK;
584 mLorentzGammaLL=fwhmLorentzGammaLL;
585 mLorentzGammaHK=fwhmLorentzGammaHK;
586 mLorentzGammaHL=fwhmLorentzGammaHL;
587 mLorentzGammaKL=fwhmLorentzGammaKL;
589 mPseudoVoigtEta1=pseudoVoigtEta1;
597 const REAL h,
const REAL k,
const REAL l)
599 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth()",2)
601 const int halfnb=nb/2;
602 CrystVector_REAL x(nb);
604 const REAL tantheta=tan(center/2.0);
605 const REAL costheta=cos(center/2.0);
606 const REAL sintheta=sin(center/2.0);
607 const REAL fwhmG=sqrt(abs( mCagliotiW+mCagliotiV*tantheta+
mCagliotiU*tantheta*tantheta+mScherrerP/(costheta*costheta)));
608 const REAL gam=mLorentzGammaHH*h*h+mLorentzGammaKK*k*k+mLorentzGammaLL*l*l+2*mLorentzGammaHK*h*k+2*mLorentzGammaHL*h*l+2*mLorentzGammaKL*k*l;
609 const REAL fwhmL= mLorentzX/costheta+(mLorentzY+gam/(sintheta*sintheta))*tantheta;
612 REAL fwhm=fwhmL*eta+fwhmG*(1-eta);
613 if(fwhm<=0) fwhm=1e-3;
614 CrystVector_REAL prof;
619 const REAL tmp=fwhm*n/nb;
620 for(
int i=0;i<nb;i++) *p++ = tmp*(i-halfnb);
623 const REAL max=prof.max();
624 const REAL test=max*relativeIntensity;
626 if((prof(0)<test)&&(prof(nb-1)<test))
629 while(*p<test){ p++; n1++;n2++;}
631 while(*p>test){ p++; n2++;}
632 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigtAnisotropic::GetFullProfileWidth():"<<x(n2)-x(n1),2)
635 VFN_DEBUG_MESSAGE(
"ReflectionProfilePseudoVoigtAnisotropic::GetFullProfileWidth():"<<relativeIntensity<<
","
636 <<fwhm<<
","<<center<<
","<<h<<
","<<k<<
","<<l<<
","<<max<<
","<<test,2)
649 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigtAnisotropic::XMLOutput():"<<this->
GetName(),5)
650 for(
int i=0;i<indent;i++) os <<
" " ;
651 XMLCrystTag tag(
"ReflectionProfilePseudoVoigtAnisotropic");
706 tag.SetIsEndTag(
true);
707 for(
int i=0;i<indent;i++) os <<
" " ;
709 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigtAnisotropic::XMLOutput():"<<this->
GetName(),5)
714 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigtAnisotropic::XMLInput():"<<this->
GetName(),5)
715 for(
unsigned int i=0;i<tagg.GetNbAttribute();i++)
717 if(
"Name"==tagg.GetAttributeName(i)) this->
SetName(tagg.GetAttributeValue(i));
722 if((
"ReflectionProfilePseudoVoigtAnisotropic"==tag.GetName())&&tag.IsEndTag())
725 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigtAnisotropic::Exit():"<<this->
GetName(),5)
728 if(
"Par"==tag.GetName())
730 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
732 if(
"Name"==tag.GetAttributeName(i))
734 if(
"U"==tag.GetAttributeValue(i))
739 if(
"V"==tag.GetAttributeValue(i))
744 if(
"W"==tag.GetAttributeValue(i))
749 if(
"P"==tag.GetAttributeValue(i))
754 if(
"X"==tag.GetAttributeValue(i))
759 if(
"Y"==tag.GetAttributeValue(i))
764 if(
"G_HH"==tag.GetAttributeValue(i))
769 if(
"G_KK"==tag.GetAttributeValue(i))
774 if(
"G_LL"==tag.GetAttributeValue(i))
779 if(
"G_HK"==tag.GetAttributeValue(i))
784 if(
"G_HL"==tag.GetAttributeValue(i))
789 if(
"G_KL"==tag.GetAttributeValue(i))
794 if(
"Eta0"==tag.GetAttributeValue(i))
799 if(
"Eta1"==tag.GetAttributeValue(i))
804 if(
"Asym0"==tag.GetAttributeValue(i))
809 if(
"Asym1"==tag.GetAttributeValue(i))
814 if(
"Asym2"==tag.GetAttributeValue(i))
823 if(
"Option"==tag.GetName())
825 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
826 if(
"Name"==tag.GetAttributeName(i))
837 gpRefParTypeScattDataProfileWidth,
838 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
844 RefinablePar tmp(
"V",&mCagliotiV,-1/RAD2DEG/RAD2DEG,1./RAD2DEG/RAD2DEG,
845 gpRefParTypeScattDataProfileWidth,
846 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
853 gpRefParTypeScattDataProfileWidth,
854 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
860 RefinablePar tmp(
"P",&mScherrerP,-1./RAD2DEG/RAD2DEG,1./RAD2DEG/RAD2DEG,
861 gpRefParTypeScattDataProfileWidth,
862 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG*RAD2DEG);
869 gpRefParTypeScattDataProfileWidth,
870 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
877 gpRefParTypeScattDataProfileWidth,
878 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
884 RefinablePar tmp(
"G_HH",&mLorentzGammaHH,-1./RAD2DEG,1./RAD2DEG,
885 gpRefParTypeScattDataProfileWidth,
886 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
892 RefinablePar tmp(
"G_KK",&mLorentzGammaKK,-1./RAD2DEG,1./RAD2DEG,
893 gpRefParTypeScattDataProfileWidth,
894 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
900 RefinablePar tmp(
"G_LL",&mLorentzGammaLL,-1./RAD2DEG,1./RAD2DEG,
901 gpRefParTypeScattDataProfileWidth,
902 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
908 RefinablePar tmp(
"G_HK",&mLorentzGammaHK,-1./RAD2DEG,1./RAD2DEG,
909 gpRefParTypeScattDataProfileWidth,
910 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
916 RefinablePar tmp(
"G_HL",&mLorentzGammaHL,-1./RAD2DEG,1./RAD2DEG,
917 gpRefParTypeScattDataProfileWidth,
918 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
924 RefinablePar tmp(
"G_KL",&mLorentzGammaKL,-1./RAD2DEG,1./RAD2DEG,
925 gpRefParTypeScattDataProfileWidth,
926 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false,RAD2DEG);
933 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
939 RefinablePar tmp(
"Eta1",&mPseudoVoigtEta1,-1,1.,gpRefParTypeScattDataProfileType,
940 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
947 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
953 RefinablePar tmp(
"Asym1",&mAsym1,-1.0,1.0,gpRefParTypeScattDataProfileAsym,
954 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
960 RefinablePar tmp(
"Asym2",&mAsym2,-1.0,1.0,gpRefParTypeScattDataProfileAsym,
961 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
969 WXCrystObjBasic* ReflectionProfilePseudoVoigtAnisotropic::WXCreate(wxWindow* parent)
971 VFN_DEBUG_ENTRY(
"ReflectionProfilePseudoVoigt::WXCreate()",6)
986 mInstrumentAlpha0(0.0),
987 mInstrumentAlpha1(0.0952),
988 mInstrumentBeta0(0.0239),
989 mInstrumentBeta1(0.0043),
990 mGaussianSigma0(0.0),
991 mGaussianSigma1(7.0),
992 mGaussianSigma2(0.0),
993 mLorentzianGamma0(0.0),
994 mLorentzianGamma1(0.0),
995 mLorentzianGamma2(0.414),
998 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::ReflectionProfileDoubleExponentialPseudoVoigt()",10)
1005 mInstrumentAlpha0(0.0),
1006 mInstrumentAlpha1(0.0952),
1007 mInstrumentBeta0(0.0239),
1008 mInstrumentBeta1(0.0043),
1009 mGaussianSigma0(0.0),
1010 mGaussianSigma1(7.0),
1011 mGaussianSigma2(0.0),
1012 mLorentzianGamma0(0.0),
1013 mLorentzianGamma1(0.0),
1014 mLorentzianGamma2(0.414),
1017 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::ReflectionProfileDoubleExponentialPseudoVoigt()",10)
1018 this->InitParameters();
1024 mInstrumentAlpha0(old.mInstrumentAlpha0),
1025 mInstrumentAlpha1(old.mInstrumentAlpha1),
1026 mInstrumentBeta0(old.mInstrumentBeta0),
1027 mInstrumentBeta1(old.mInstrumentBeta1),
1028 mGaussianSigma0(old.mGaussianSigma0),
1029 mGaussianSigma1(old.mGaussianSigma1),
1030 mGaussianSigma2(old.mGaussianSigma2),
1031 mLorentzianGamma0(old.mLorentzianGamma0),
1032 mLorentzianGamma1(old.mLorentzianGamma1),
1033 mLorentzianGamma2(old.mLorentzianGamma2),
1036 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::ReflectionProfileDoubleExponentialPseudoVoigt()",10)
1042 #ifdef __WX__CRYST__
1045 delete mpWXCrystObj;
1051 ReflectionProfileDoubleExponentialPseudoVoigt*
1052 ReflectionProfileDoubleExponentialPseudoVoigt::CreateCopy()
const
1059 static string className=
"ReflectionProfileDoubleExponentialPseudoVoigt";
1065 const REAL h,
const REAL k,
const REAL l)
const
1067 VFN_DEBUG_ENTRY(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetProfile()",4)
1071 REAL hh=h,kk=k,ll=l;
1073 dcenter=1.0/sqrt(hh*hh+kk*kk+ll*ll);
1075 const REAL alpha=mInstrumentAlpha0+mInstrumentAlpha1/dcenter;
1076 const REAL beta=mInstrumentBeta0+mInstrumentBeta1/pow(dcenter,4);
1077 const REAL siggauss2= mGaussianSigma0
1078 +mGaussianSigma1*pow(dcenter,2)
1079 +mGaussianSigma2*pow(dcenter,4);
1080 static const REAL log2=log(2.0);
1081 const REAL hg=sqrt(8*siggauss2*log2);
1082 const REAL hl= mLorentzianGamma0
1083 +mLorentzianGamma1*dcenter
1084 +mLorentzianGamma2*dcenter*dcenter;
1085 const REAL hcom=pow(pow(hg,5)+2.69269*pow(hg,4)*hl+2.42843*pow(hg,3)*hl*hl
1086 +4.47163*hg*hg*pow(hl,3)+0.07842*hg*pow(hl,4)+pow(hl,5),0.2);
1087 const REAL sigcom2=hcom*hcom/(8.0*log2);
1088 const REAL eta=1.36603*hl/hcom-0.47719*pow(hl/hcom,2)+0.11116*pow(hl/hcom,3);
1089 const long nbPoints=x.numElements();
1090 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetProfile():alpha="
1091 <<alpha<<
",beta="<<beta<<
",siggauss2="<<siggauss2
1092 <<
",hg="<<hg<<
",hl="<<hl<<
",hcom="<<hcom<<
",sigcom2="<<sigcom2
1094 CrystVector_REAL prof;
1097 REAL *pp=prof.data();
1098 for(
long i=0;i<nbPoints;i++)
1100 const double u=alpha/2*(alpha*sigcom2+2* *pp);
1101 const double nu=beta/2*(beta *sigcom2-2* *pp);
1102 const double y=(alpha*sigcom2+*pp)/sqrt(2*sigcom2);
1103 const double z=(beta *sigcom2-*pp)/sqrt(2*sigcom2);
1104 const complex<double> p(alpha* *pp,alpha*hcom/2);
1105 const complex<double> q(-beta* *pp, beta*hcom/2);
1108 VFN_DEBUG_MESSAGE(
"dt="<<*pp<<
", u="<<u<<
",nu="<<nu<<
",y="<<y<<
",z="<<z
1109 <<
",p=("<<p.real()<<
","<<p.imag()
1110 <<
"),q=("<<q.real()<<
","<<q.imag()
1111 <<
"),e^p*E1(p)=("<<e1p.real()<<
","<<e1p.imag()
1112 <<
"),e^q*E1(q)=("<<e1q.real()<<
","<<e1q.imag(),2)
1113 REAL expnu_erfcz,expu_erfcy;
1115 if(z>10.0) expnu_erfcz=exp(nu-z*z)/(z*sqrt(M_PI));
1116 else expnu_erfcz=exp(nu)*erfc(z);
1118 if(y>10.0) expu_erfcy=exp(u-y*y)/(y*sqrt(M_PI));
1119 else expu_erfcy=exp(u)*erfc(y);
1122 double tmp=(1-eta)*alpha*beta/(2*(alpha+beta))*(expu_erfcy+expnu_erfcz)
1123 -eta*alpha*beta/(M_PI*(alpha+beta))*(e1p.imag()+e1q.imag());
1126 cout<<
"*pp==numeric_limits<REAL>::quiet_NaN()"<<endl;
1127 cout<<
"ReflectionProfileDoubleExponentialPseudoVoigt::GetProfile():"<<endl
1128 <<
" alpha="<<alpha<<
",beta="<<beta<<
",siggauss2="<<siggauss2
1129 <<
",hg="<<hg<<
",hl="<<hl<<
",hcom="<<hcom<<
",sigcom2="<<sigcom2
1130 <<
",eta="<<eta<<endl;
1131 cout<<
" dt="<<*pp<<
", u="<<u<<
",nu="<<nu<<
",y="<<y<<
",z="<<z
1132 <<
",e^u*E1(y)="<<expu_erfcy
1133 <<
",e^nu*E1(z)="<<expnu_erfcz
1135 <<
" p=("<<p.real()<<
","<<p.imag()
1136 <<
"),q=("<<q.real()<<
","<<q.imag()
1137 <<
"),e^p*E1(p)=("<<e1p.real()<<
","<<e1p.imag()
1138 <<
"),e^q*E1(q)=("<<e1q.real()<<
","<<e1q.imag()<<endl;
1139 cout<<(1-eta)*alpha*beta/(2*(alpha+beta))*(expu_erfcy+expnu_erfcz)<<endl
1140 <<eta*alpha*beta/(M_PI*(alpha+beta))*(e1p.imag()+e1q.imag())<<endl
1145 if(abs(*pp)==numeric_limits<REAL>::infinity())
1147 cout<<
"*pp==numeric_limits<REAL>::infinity()"<<endl;
1152 *pp++=(1-eta)*alpha*beta/(2*(alpha+beta))*(expu_erfcy+expnu_erfcz)
1153 -eta*alpha*beta/(M_PI*(alpha+beta))*(e1p.imag()+e1q.imag());
1155 VFN_DEBUG_EXIT(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetProfile()",4)
1161 const REAL instrumentAlpha1,
1162 const REAL instrumentBeta0,
1163 const REAL instrumentBeta1,
1164 const REAL gaussianSigma0,
1165 const REAL gaussianSigma1,
1166 const REAL gaussianSigma2,
1167 const REAL lorentzianGamma0,
1168 const REAL lorentzianGamma1,
1169 const REAL lorentzianGamma2)
1171 mInstrumentAlpha0=instrumentAlpha0;
1172 mInstrumentAlpha1=instrumentAlpha1;
1173 mInstrumentBeta0=instrumentBeta0;
1174 mInstrumentBeta1=instrumentBeta1;
1175 mGaussianSigma0=gaussianSigma0;
1176 mGaussianSigma1=gaussianSigma1;
1177 mGaussianSigma2=gaussianSigma2;
1178 mLorentzianGamma0=lorentzianGamma0;
1179 mLorentzianGamma1=lorentzianGamma1;
1180 mLorentzianGamma2=lorentzianGamma2;
1186 const REAL h,
const REAL k,
const REAL l)
1188 VFN_DEBUG_ENTRY(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetFullProfileWidth()",5)
1192 REAL hh=h,kk=k,ll=l;
1193 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetFullProfileWidth(),"<<dcenter<<
","<<mpCell->
GetName(),5)
1195 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetFullProfileWidth(),"<<dcenter,5)
1196 dcenter=sqrt(hh*hh+kk*kk+ll*ll);
1198 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetFullProfileWidth(),"<<dcenter,5)
1200 const int halfnb=nb/2;
1201 CrystVector_REAL x(nb);
1203 const REAL siggauss2= mGaussianSigma0
1204 +mGaussianSigma1*pow(dcenter,2)
1205 +mGaussianSigma2*pow(dcenter,4);
1206 static const REAL log2=log(2.0);
1207 const REAL hg=sqrt(8*siggauss2*log2);
1208 const REAL hl= mLorentzianGamma0
1209 +mLorentzianGamma1*dcenter
1210 +mLorentzianGamma2*dcenter*dcenter;
1211 const REAL fwhm=pow(pow(hg,5)+2.69269*pow(hg,4)*hl+2.42843*pow(hg,3)*hl*hl
1212 +4.47163*hg*hg*pow(hl,3)+0.07842*hg*pow(hl,4)+pow(hl,5),0.2);
1213 CrystVector_REAL prof;
1217 const REAL tmp=fwhm*n/nb;
1218 for(
int i=0;i<nb;i++) *p++ = tmp*(i-halfnb);
1221 const REAL max=prof.max();
1222 const REAL test=max*relativeIntensity;
1224 if((prof(0)<test)&&(prof(nb-1)<test))
1227 while(*p<test){ p++; n1++;n2++;}
1229 while(*p>test){ p++; n2++;}
1230 VFN_DEBUG_EXIT(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth():"<<x(n2)-x(n1),5)
1231 return abs(x(n2)-x(n1));
1233 VFN_DEBUG_MESSAGE(
"ReflectionProfilePseudoVoigt::GetFullProfileWidth():"<<max<<
","<<test
1238 VFN_DEBUG_EXIT(
"ReflectionProfileDoubleExponentialPseudoVoigt::GetFullProfileWidth()",5)
1247 VFN_DEBUG_ENTRY(
"ReflectionProfileDoubleExponentialPseudoVoigt::XMLOutput():"<<this->
GetName(),5)
1248 for(
int i=0;i<indent;i++) os <<
" " ;
1249 XMLCrystTag tag(
"ReflectionProfileDoubleExponentialPseudoVoigt");
1274 this->
GetPar(&mLorentzianGamma0).
XMLOutput(os,
"LorentzianGamma0",indent);
1277 this->
GetPar(&mLorentzianGamma1).
XMLOutput(os,
"LorentzianGamma1",indent);
1280 this->
GetPar(&mLorentzianGamma2).
XMLOutput(os,
"LorentzianGamma2",indent);
1284 tag.SetIsEndTag(
true);
1285 for(
int i=0;i<indent;i++) os <<
" " ;
1287 VFN_DEBUG_EXIT(
"ReflectionProfileDoubleExponentialPseudoVoigt::XMLOutput():"<<this->
GetName(),5)
1293 VFN_DEBUG_ENTRY(
"ReflectionProfileDoubleExponentialPseudoVoigt::XMLInput():"<<this->
GetName(),5)
1294 for(
unsigned int i=0;i<tagg.GetNbAttribute();i++)
1296 if(
"Name"==tagg.GetAttributeName(i)) this->
SetName(tagg.GetAttributeValue(i));
1301 if((
"ReflectionProfileDoubleExponentialPseudoVoigt"==tag.GetName())&&tag.IsEndTag())
1304 VFN_DEBUG_EXIT(
"ReflectionProfileDoubleExponentialPseudoVoigt::Exit():"<<this->
GetName(),5)
1307 if(
"Par"==tag.GetName())
1309 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
1311 if(
"Name"==tag.GetAttributeName(i))
1318 if(
"Option"==tag.GetName())
1320 for(
unsigned int i=0;i<tag.GetNbAttribute();i++)
1321 if(
"Name"==tag.GetAttributeName(i))
1330 VFN_DEBUG_MESSAGE(
"ReflectionProfileDoubleExponentialPseudoVoigt::SetUnitCell()",10)
1338 RefinablePar tmp(
"Alpha0",&mInstrumentAlpha0,0,1e6,gpRefParTypeScattDataProfile,
1339 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1345 RefinablePar tmp(
"Alpha1",&mInstrumentAlpha1,0,1e6,gpRefParTypeScattDataProfile,
1346 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1352 RefinablePar tmp(
"Beta0",&mInstrumentBeta0,0,1e6,gpRefParTypeScattDataProfile,
1353 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1359 RefinablePar tmp(
"Beta1",&mInstrumentBeta1,0,1e6,gpRefParTypeScattDataProfile,
1360 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1366 RefinablePar tmp(
"GaussianSigma0",&mGaussianSigma0,0,1e6,gpRefParTypeScattDataProfileWidth,
1367 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1373 RefinablePar tmp(
"GaussianSigma1",&mGaussianSigma1,0,1e6,gpRefParTypeScattDataProfileWidth,
1374 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1380 RefinablePar tmp(
"GaussianSigma2",&mGaussianSigma2,0,1e6,gpRefParTypeScattDataProfileWidth,
1381 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1387 RefinablePar tmp(
"LorentzianGamma0",&mLorentzianGamma0,0,1e6,gpRefParTypeScattDataProfileWidth,
1388 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1394 RefinablePar tmp(
"LorentzianGamma1",&mLorentzianGamma1,0,1e6,gpRefParTypeScattDataProfileWidth,
1395 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1401 RefinablePar tmp(
"LorentzianGamma2",&mLorentzianGamma2,0,1e6,gpRefParTypeScattDataProfileWidth,
1402 REFPAR_DERIV_STEP_ABSOLUTE,
true,
true,
true,
false);
1409 #ifdef __WX__CRYST__
1410 WXCrystObjBasic* ReflectionProfileDoubleExponentialPseudoVoigt::WXCreate(wxWindow* parent)
1414 return mpWXCrystObj;
1422 CrystVector_REAL PowderProfileGauss (
const CrystVector_REAL ttheta,
const REAL fw,
1423 const REAL center,
const REAL asym)
1425 TAU_PROFILE(
"PowderProfileGauss()",
"Vector (Vector,REAL)",TAU_DEFAULT);
1427 if(fwhm<=0) fwhm=1e-6;
1428 const long nbPoints=ttheta.numElements();
1429 CrystVector_REAL result(nbPoints);
1437 result *= -4.*log(2.)/fwhm/fwhm;
1441 const REAL c1= -(1.+asym)/asym*(1.+asym)/asym*log(2.)/fwhm/fwhm;
1442 const REAL c2= -(1.+asym) *(1.+asym) *log(2.)/fwhm/fwhm;
1445 const REAL *pt=ttheta.data();
1446 for(i=0;i<nbPoints;i++){ *p++ *= c1;
if(*pt++>center)
break;}
1448 for( ;i<nbPoints;i++) *p++ *= c2;
1454 for(
long i=0;i<nbPoints;i++) { *p = pow((
float)2.71828182846,(
float)*p) ; p++ ;}
1459 #ifdef HAVE_SSE_MATHFUN
1460 v4sf x=_mm_loadu_ps(p);
1461 _mm_storeu_ps(p,exp_ps(x));
1464 for(
unsigned int j=0;j<4;++j)
1471 for(;i>0;i--) { *p = exp(*p) ; p++ ;}
1475 #if 1 //def _MSC_VER
1479 for(;i<nbPoints;i+=4)
1480 for(
unsigned int j=0;j<4;++j)
1482 *p = pow((
float)2.71828182846,(
float)*p) ;
1487 for(;i<nbPoints;i+=1)
1497 result *= 2. / fwhm * sqrt(log(2.)/M_PI);
1501 CrystVector_REAL PowderProfileLorentz(
const CrystVector_REAL ttheta,
const REAL fw,
1502 const REAL center,
const REAL asym)
1504 TAU_PROFILE(
"PowderProfileLorentz()",
"Vector (Vector,REAL)",TAU_DEFAULT);
1506 if(fwhm<=0) fwhm=1e-6;
1507 const long nbPoints=ttheta.numElements();
1508 CrystVector_REAL result(nbPoints);
1516 result *= 4./fwhm/fwhm;
1520 const REAL c1= (1+asym)/asym*(1+asym)/asym/fwhm/fwhm;
1521 const REAL c2= (1+asym) *(1+asym) /fwhm/fwhm;
1524 const REAL *pt=ttheta.data();
1525 for(i=0;i<nbPoints;i++){ *p++ *= c1;
if(*pt++>center)
break;}
1527 for( ;i<nbPoints;i++) *p++ *= c2 ;
1531 for(
long i=0;i<nbPoints;i++) { *p = 1/(*p) ; p++ ;}
1532 result *= 2./M_PI/fwhm;
1537 const REAL fw,
const REAL center,
1538 const REAL a0,
const REAL a1,
1539 const REAL b0,
const REAL b1)
1541 TAU_PROFILE(
"AsymmetryBerarBaldinozzi()",
"Vector (Vector,REAL)",TAU_DEFAULT);
1543 if(fwhm<=0) fwhm=1e-6;
1544 const long nbPoints=x.numElements();
1545 CrystVector_REAL result(nbPoints);
1549 REAL *p=result.data();
1550 const REAL a=a0/tan(center/2)+a1/tan(center);
1551 const REAL b=b0/tan(center/2)+b1/tan(center);
1552 for(
long i=0;i<nbPoints;i++)
1554 *p = 1+*p * exp(-*p * *p)*(2*a+b*(8* *p * *p-12));
1608 const T zr=z.real();
1611 if(zn==0.0)
return 1e100;
1612 if((zn<10.0)||((zr<0.0)&&(zn<20.0)))
1614 ce1=complex<T>(1,0);
1616 for(
unsigned int i=1;i<=150;i++)
1618 y=-y*(T)i*z / (T)((i+1)*(i+1));
1620 if(abs(y)<=abs(ce1)*1e-15)
break;
1622 static const T EulerMascheroni=0.5772156649015328606065120900;
1623 return exp(z)*(z*ce1-EulerMascheroni-log(z));
1627 if(zn>500)
return 1.0/z;
1628 complex<T> y(0.0,0.0);
1629 for(
unsigned int i=120;i>=1;i--) y=(T)i/((T)1+(T)i/(z+y));
1631 if((zr<0)&&(z.imag()==0)) ce1 -= complex<T>(0.0,M_PI)*exp(z);
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
void SetDerivStep(const REAL)
Fixed step to use to compute numerical derivative.
void AddPar(const RefinablePar &newRefPar)
Add a refinable parameter.
REAL mPseudoVoigtEta0
Pseudo-Voigt mixing parameter : eta=eta0 +2*theta*eta1 eta=1 -> pure Lorentzian ; eta=0 -> pure Gauss...
virtual void UpdateDisplay() const
If there is an interface, this should be automatically be called each time there is a 'new...
Double-Exponential Pseudo-Voigt profile for TOF.
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
bool IsAnisotropic() const
Is the profile anisotropic ?
virtual REAL GetFullProfileWidth(const REAL relativeIntensity, const REAL xcenter, const REAL h, const REAL k, const REAL l)
Get the (approximate) full profile width at a given percentage of the profile maximum (e...
void SetUnitCell(const UnitCell &cell)
Set unit cell.
bool IsAnisotropic() const
Is the profile anisotropic ?
bool IsAnisotropic() const
Is the profile anisotropic ?
void MillerToOrthonormalCoords(REAL &x, REAL &y, REAL &z) const
Get Miller H,K, L indices from orthonormal coordinates in reciprocal space.
void Click()
Record an event for this clock (generally, the 'time' an object has been modified, or some computation has been made)
virtual void XMLInput(istream &is, const XMLCrystTag &tag)
Input From stream.
void InitParameters()
Initialize parameters.
CrystVector_REAL GetProfile(const CrystVector_REAL &x, const REAL xcenter, const REAL h, const REAL k, const REAL l) const
Get the reflection profile.
void XMLInput(istream &is, const XMLCrystTag &tag)
XMLInput From stream.
RefinablePar & GetPar(const long i)
Access all parameters in the order they were inputted.
Class to display a Powder Pattern Pseudo-Voigt Profile with Anisotropic broadening.
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
virtual void XMLInput(istream &is, const XMLCrystTag &tag)
Input From stream.
const RefParType * gpRefParTypeScattDataProfile
Type for reflection profile.
output one or several vectors as (a) column(s):
const RefParType * gpRefParTypeScattDataProfileAsym
Type for reflection profile asymmetry.
REAL mAsymBerarBaldinozziA0
Asymmetry parameters, following the Bérar & Baldinozzi approach ( Bérar & baldinozzi, J.
void InitParameters()
Initialize parameters.
RefinableObjClock mClockMaster
Master clock, which is changed whenever the object has been altered.
REAL mAsym0
Asymmetry parameters, following the analytical function for asymmetric pseudo-voigt given by Toraya i...
REAL mPseudoVoigtEta0
Pseudo-Voigt mixing parameter : eta=1 -> pure Lorentzian ; eta=0 -> pure Gaussian.
Abstract base class for all objects in wxCryst.
Abstract base class for reflection profiles.
void InitParameters()
Initialize parameters.
REAL mCagliotiU
FWHM parameters:
void SetProfilePar(const REAL fwhmCagliotiW, const REAL fwhmCagliotiU=0, const REAL fwhmCagliotiV=0, const REAL fwhmGaussP=0, const REAL fwhmLorentzX=0, const REAL fwhmLorentzY=0, const REAL fwhmLorentzGammaHH=0, const REAL fwhmLorentzGammaKK=0, const REAL fwhmLorentzGammaLL=0, const REAL fwhmLorentzGammaHK=0, const REAL fwhmLorentzGammaHL=0, const REAL fwhmLorentzGammaKL=0, const REAL pseudoVoigtEta0=0, const REAL pseudoVoigtEta1=0, const REAL asymA0=0, const REAL asymA1=0, const REAL asymA2=0)
Set reflection profile parameters.
virtual void XMLOutput(ostream &os, int indent=0) const
Output to stream in well-formed XML.
void AssignClock(RefinableObjClock &clock)
CrystVector_REAL GetProfile(const CrystVector_REAL &x, const REAL xcenter, const REAL h, const REAL k, const REAL l) const
Get the reflection profile.
const RefParType * gpRefParTypeScattDataProfileWidth
Type for reflection profile width.
virtual void XMLOutput(ostream &os, int indent=0) const
Output to stream in well-formed XML.
Class to display a Powder Pattern Pseudo-Voigt Profile.
const RefParType * gpRefParTypeScattDataProfileType
Type for reflection profiles type (e.g. gaussian/lorentzian mix)
std::complex< T > ExponentialIntegral1(const complex< T > z)
Complex exponential integral E1(z) (Abramowitz & Stegun, chap.
REAL mAsym0
Asymmetry parameters, following the analytical function for asymmetric pseudo-voigt given by Toraya i...
virtual void XMLInput(istream &is, const XMLCrystTag &tag)
Input From stream.
The namespace which includes all objects (crystallographic and algorithmic) in ObjCryst++.
virtual REAL GetFullProfileWidth(const REAL relativeIntensity, const REAL xcenter, const REAL h, const REAL k, const REAL l)
Get the (approximate) full profile width at a given percentage of the profile maximum (e...
Unit Cell class: Unit cell with spacegroup information.
Generic class for parameters of refinable objects.
CrystVector_REAL GetProfile(const CrystVector_REAL &x, const REAL xcenter, const REAL h, const REAL k, const REAL l) const
Get the reflection profile.
REAL mCagliotiU
FWHM parameters, following Caglioti's law.
virtual REAL GetFullProfileWidth(const REAL relativeIntensity, const REAL xcenter, const REAL h, const REAL k, const REAL l)
Get the (approximate) full profile width at a given percentage of the profile maximum (e...
virtual void XMLOutput(ostream &os, int indent=0) const
Output to stream in well-formed XML.
virtual const string & GetName() const
Name of the object.
Class to display a Powder Pattern Pseudo-Voigt Profile.
Pseudo-Voigt reflection profile.
class to input or output a well-formatted xml beginning or ending tag.
ObjRegistry< RefObjOpt > mOptionRegistry
List of options for this object.
CrystVector_REAL AsymmetryBerarBaldinozzi(const CrystVector_REAL x, const REAL fw, const REAL center, const REAL a0, const REAL a1, const REAL b0, const REAL b1)
Asymmetry function [Ref J. Appl. Cryst 26 (1993), 128-129.
ReflectionProfileDoubleExponentialPseudoVoigt()
Constructor, without unit cell.
void SetProfilePar(const REAL fwhmCagliotiW, const REAL fwhmCagliotiU=0, const REAL fwhmCagliotiV=0, const REAL eta0=0.5, const REAL eta1=0.)
Set reflection profile parameters.
void SetProfilePar(const REAL instrumentAlpha0, const REAL instrumentAlpha1, const REAL instrumentBeta0, const REAL instrumentBeta1, const REAL gaussianSigma0, const REAL gaussianSigma1, const REAL gaussianSigma2, const REAL lorentzianGamma0, const REAL lorentzianGamma1, const REAL lorentzianGamma2)
Set reflection profile parameters.
virtual void SetName(const string &name)
Name of the object.
std::complex< T > ExponentialIntegral1_ExpZ(const complex< T > z)
E1(z)*exp(z)
void XMLOutput(ostream &os, const string &name, int indent=0) const
XMLOutput to stream in well-formed XML.
ObjRegistry< ReflectionProfile > gReflectionProfileRegistry("List of all ReflectionProfile types")
Global registry for all ReflectionProfile objects.