00001 #ifndef _OBJCRYST_SCATTPOWER_H_
00002 #define _OBJCRYST_SCATTPOWER_H_
00003
00004 #include "CrystVector/CrystVector.h"
00005 #include "ObjCryst/General.h"
00006 #include "RefinableObj/RefinableObj.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 namespace ObjCryst
00018 {
00019 extern const RefParType *gpRefParTypeScattPow;
00020 extern const RefParType *gpRefParTypeScattPowResonant;
00021 extern const RefParType *gpRefParTypeScattPowTemperature;
00022 extern const RefParType *gpRefParTypeScattPowTemperatureIso;
00023 extern const RefParType *gpRefParTypeScattPowTemperatureAniso;
00024
00025
00026
00027
00051
00052 class ScatteringPower:virtual public RefinableObj
00053 {
00054 public:
00055 ScatteringPower();
00056 ScatteringPower(const ScatteringPower& old);
00057 virtual ~ScatteringPower();
00058 virtual const string GetClassName() const;
00059 virtual void operator=(const ScatteringPower& rhs);
00074 virtual CrystVector_double GetScatteringFactor(const ScatteringData &data,
00075 const int spgSymPosIndex=-1) const=0;
00089 virtual CrystVector_double GetTemperatureFactor(const ScatteringData &data,
00090 const int spgSymPosIndex=-1) const=0;
00106 virtual CrystMatrix_double GetResonantScattFactReal(const ScatteringData &data,
00107 const int spgSymPosIndex=-1) const=0;
00123 virtual CrystMatrix_double GetResonantScattFactImag(const ScatteringData &data,
00124 const int spgSymPosIndex=-1) const=0;
00126 virtual bool IsScatteringFactorAnisotropic()const;
00128 virtual bool IsTemperatureFactorAnisotropic()const;
00130 virtual bool IsResonantScatteringAnisotropic()const;
00134 virtual const string& GetSymbol() const;
00138 double GetBiso() const;
00142 double& GetBiso();
00146 virtual void SetBiso(const double newB);
00150 bool IsIsotropic()const ;
00153 long GetDynPopCorrIndex()const;
00155 long GetScatteringPowerId()const;
00157 long GetNbScatteringPower()const;
00159 const RefinableObjClock& GetLastChangeClock()const;
00161 const string& GetColourName()const;
00163 const float* GetColourRGB()const;
00165 void SetColour(const string& colorName);
00167 void SetColour(const float r,const float g,const float b);
00170 virtual double GetRadius()const=0;
00171 protected:
00172 virtual void InitRefParList()=0;
00174 virtual void Init();
00176 virtual void InitRGBColour();
00179 long mDynPopCorrIndex;
00181 double mBiso;
00183 bool mIsIsotropic;
00185 CrystVector_double mBeta;
00188 const long mScatteringPowerId;
00191 static long mNbScatteringPower;
00193 static ScatteringPower* mspScatteringPowerGlobalList[1000];
00195 static CrystVector_bool mspScatteringPowerGlobalListIsUsed;
00197 RefinableObjClock mClock;
00199 string mColourName;
00201 float mColourRGB[3];
00202 private:
00203 friend const ScatteringPower& GetScatteringPower(const long i);
00204 };
00205
00207 extern ObjRegistry<ScatteringPower> gScatteringPowerRegistry;
00208
00209
00210
00211
00212
00213
00214
00218
00219
00220 class ScatteringPowerAtom:virtual public ScatteringPower
00221 {
00222 public:
00223 ScatteringPowerAtom();
00233 ScatteringPowerAtom(const string &name,const string &symbol,const double bIso=1.0);
00234 ScatteringPowerAtom(const ScatteringPowerAtom& old);
00235 ~ScatteringPowerAtom();
00236 virtual const string GetClassName() const;
00238 void Init(const string &name,const string &symbol,const double bIso=1.0);
00239 virtual CrystVector_double GetScatteringFactor(const ScatteringData &data,
00240 const int spgSymPosIndex=0) const;
00241 virtual CrystVector_double GetTemperatureFactor(const ScatteringData &data,
00242 const int spgSymPosIndex=0) const;
00243 virtual CrystMatrix_double GetResonantScattFactReal(const ScatteringData &data,
00244 const int spgSymPosIndex=0) const;
00245 virtual CrystMatrix_double GetResonantScattFactImag(const ScatteringData &data,
00246 const int spgSymPosIndex=0) const;
00248 void SetSymbol(const string &symbol) ;
00250 virtual const string& GetSymbol() const;
00256 string GetElementName() const;
00258 int GetAtomicNumber() const;
00260 double GetRadius() const;
00261 virtual void Print()const;
00262 virtual void XMLOutput(ostream &os,int indent=0)const;
00263 virtual void XMLInput(istream &is,const XMLCrystTag &tag);
00264
00265 protected:
00270 void InitAtScattCoeffsWK95();
00274 void InitAtNeutronScattCoeffs();
00275 virtual void InitRefParList();
00281 string mSymbol;
00283 int mAtomicNumber;
00290 CrystVector_double mScattAi,mScattBi;
00291 double mScattC;
00298 double mNeutronScattLengthReal,mNeutronScattLengthImag;
00299
00301 double mRadius;
00302
00309 double mNeutronAbsCrossSection;
00310
00311 private:
00312 #ifdef __WX__CRYST__
00313 public:
00314 virtual WXCrystObjBasic* WXCreate(wxWindow*);
00315 friend class WXScatteringPowerAtom;
00316 #endif
00317 };
00319 extern ObjRegistry<ScatteringPowerAtom> gScatteringPowerAtomRegistry;
00320
00321
00322
00323
00328
00329 struct ScatteringComponent
00330 {
00331 bool operator==(const ScatteringComponent& rhs)const;
00332 bool operator!=(const ScatteringComponent& rhs)const;
00334 void Print() const;
00336 double mX,mY,mZ,mOccupancy;
00338 const ScatteringPower *mpScattPow;
00351 mutable double mDynPopCorr;
00352
00353
00354 };
00355
00356
00357
00358
00363
00364 class ScatteringComponentList
00365 {
00366 public:
00367 ScatteringComponentList();
00368 ScatteringComponentList(const long nbComponent);
00369 ScatteringComponentList(const ScatteringComponentList &old);
00370 ~ScatteringComponentList();
00373 void Reset();
00375 const ScatteringComponent& operator()(const long i) const;
00376 ScatteringComponent& operator()(const long i);
00378 long GetNbComponent() const;
00380 void operator=(const ScatteringComponentList &rhs);
00382 bool operator==(const ScatteringComponentList &rhs)const;
00384 void operator+=(const ScatteringComponentList &rhs);
00386 void operator+=(const ScatteringComponent &rhs);
00388 void operator++();
00390 void Print() const;
00393 void ChangeMaxNbComponent(const long num);
00394 protected:
00396 long mNbComponent;
00398 ScatteringComponent* mpScattComp;
00400 long mMaxNbComponent;
00401 };
00402
00403 }
00404 #include "ObjCryst/ScatteringData.h"
00405
00406 #endif //_OBJCRYST_SCATTPOWER_H_