QXRD  0.11.16
Public Types | Public Slots | Public Member Functions | Static Public Member Functions | Properties | Private Member Functions | Private Attributes | List of all members
QxrdCalibrant Class Reference

#include <qxrdcalibrant.h>

Inheritance diagram for QxrdCalibrant:
Inheritance graph
[legend]
Collaboration diagram for QxrdCalibrant:
Collaboration graph
[legend]

Public Types

enum  Bravais {
  Hexagonal, RHexagonal, SimpleCubic, BodyCenteredCubic,
  FaceCenteredCubic, DiamondCubic
}
 

Public Slots

QxrdCalibrantDSpacing dSpacing (int h, int k, int l)
 
QxrdCalibrantDSpacings dSpacings (double energy)
 
- Public Slots inherited from QcepObject
virtual void printLine (QString line)
 
virtual void printMessage (QString msg, QDateTime dt=QDateTime::currentDateTime()) const
 
virtual void criticalMessage (QString msg, QDateTime ts=QDateTime::currentDateTime()) const
 
virtual void statusMessage (QString msg, QDateTime ts=QDateTime::currentDateTime()) const
 
virtual QString settingsScript ()
 
QString scriptValueLiteral (QVariant v)
 

Public Member Functions

 QxrdCalibrant (QcepSettingsSaverWPtr saver, QxrdExperimentWPtr exp, QxrdCalibrantLibraryWPtr lib, int index)
 
 ~QxrdCalibrant ()
 
bool isLocked ()
 
- Public Member Functions inherited from QcepObject
 QcepObject (QString name, QcepObject *parent)
 
virtual ~QcepObject ()
 
virtual void writeSettings (QSettings *set, QString section)
 
virtual void readSettings (QSettings *set, QString section)
 
QString get_Name () const
 
void set_Name (QString name)
 

Static Public Member Functions

static QScriptValue toScriptValue (QScriptEngine *engine, const QxrdCalibrantWPtr &cal)
 
static void fromScriptValue (const QScriptValue &obj, QxrdCalibrantWPtr &cal)
 
- Static Public Member Functions inherited from QcepObject
static int allocatedObjects ()
 
static int deletedObjects ()
 
static QSet< QcepObject * > allocatedObjectsSet ()
 
static QString addSlashes (QString str)
 

Properties

int isUsed
 
int index
 
int flags
 
QString description
 
int symmetry
 
double a
 
double b
 
double c
 
double alpha
 
double beta
 
double gamma
 
- Properties inherited from QcepObject
QString name
 

Private Member Functions

QxrdCalibrantDSpacings dSpacingsCubic (double energy)
 
QxrdCalibrantDSpacings dSpacingsHexagonal (double energy)
 

Private Attributes

QMutex m_Mutex
 
QxrdExperimentWPtr m_Experiment
 
QxrdCalibrantLibraryWPtr m_CalibrantLibrary
 

Detailed Description

Definition at line 17 of file qxrdcalibrant.h.

Member Enumeration Documentation

Enumerator
Hexagonal 
RHexagonal 
SimpleCubic 
BodyCenteredCubic 
FaceCenteredCubic 
DiamondCubic 

Definition at line 34 of file qxrdcalibrant.h.

34  {
35 // Triclinic,
36 // SimpleMonoclinic,
37 // BaseCenteredMonoclinic,
38 // SimpleOrthorhombic,
39 // BaseCenteredOrthorhombic,
40 // BodyCenteredOrthorhombic,
41 // FaceCenteredOrthorhombic,
42 // Rhombohedral,
43 // SimpleTetragonal,
44 // BodyCenterdTetragonal,
45  Hexagonal,
46  RHexagonal,
51  } Bravais;

Constructor & Destructor Documentation

QxrdCalibrant::QxrdCalibrant ( QcepSettingsSaverWPtr  saver,
QxrdExperimentWPtr  exp,
QxrdCalibrantLibraryWPtr  lib,
int  index 
)

Definition at line 12 of file qxrdcalibrant.cpp.

13  : QcepObject("calibrant", NULL),
14  m_Index(QcepSettingsSaverWPtr(), this, "index", index, "Calibrant Index"),
15  m_IsUsed(saver, this, "isUsed", 0, "Is Calibrant used?"),
16  m_Flags(saver, this, "flags", 0, "Calibrant flags"),
17  m_Description(saver, this, "description", "Description", "Calibrant Description"),
18  m_Symmetry(saver, this, "symmetry", 0, "Calibrant Symmetry"),
19  m_A(saver, this, "a", 1, "calibrant a-axis"),
20  m_B(saver, this, "b", 1, "calibrant b-axis"),
21  m_C(saver, this, "c", 1, "calibrant c-axis"),
22  m_Alpha(saver, this, "alpha", 90, "calibrant alpha angle (deg)"),
23  m_Beta(saver, this, "beta", 90, "calibrant beta angle (deg)"),
24  m_Gamma(saver, this, "gamma", 90, "calibrant gamma angle (deg)"),
25  m_Experiment(exp),
27 {
28 
29 }
QxrdCalibrantLibraryWPtr m_CalibrantLibrary
Definition: qxrdcalibrant.h:94
QcepObject(QString name, QcepObject *parent)
Definition: qcepobject.cpp:16
QxrdExperimentWPtr m_Experiment
Definition: qxrdcalibrant.h:93
QWeakPointer< QcepSettingsSaver > QcepSettingsSaverWPtr
QxrdCalibrant::~QxrdCalibrant ( )

Definition at line 31 of file qxrdcalibrant.cpp.

32 {
33 
34 }

Member Function Documentation

QxrdCalibrantDSpacing QxrdCalibrant::dSpacing ( int  h,
int  k,
int  l 
)
slot

Definition at line 59 of file qxrdcalibrant.cpp.

60 {
61  return QxrdCalibrantDSpacing(get_Index(), h,k,l, 1, sqrt(h*h + k*k + l*l), 0);
62 }
QxrdCalibrantDSpacings QxrdCalibrant::dSpacings ( double  energy)
slot

Definition at line 80 of file qxrdcalibrant.cpp.

References BodyCenteredCubic, DiamondCubic, dSpacingsCubic(), dSpacingsHexagonal(), FaceCenteredCubic, Hexagonal, RHexagonal, and SimpleCubic.

81 {
82  int s = get_Symmetry();
83 
84  switch (s) {
85 
86  case SimpleCubic:
87  case BodyCenteredCubic:
88  case FaceCenteredCubic:
89  case DiamondCubic:
90  return dSpacingsCubic(energy);
91 
92  case Hexagonal:
93  case RHexagonal:
94  return dSpacingsHexagonal(energy);
95 
96  default:
97  return QxrdCalibrantDSpacings();
98  }
99 }
QxrdCalibrantDSpacings dSpacingsHexagonal(double energy)
QxrdCalibrantDSpacings dSpacingsCubic(double energy)

Here is the call graph for this function:

QxrdCalibrantDSpacings QxrdCalibrant::dSpacingsCubic ( double  energy)
private

Definition at line 101 of file qxrdcalibrant.cpp.

References a, BodyCenteredCubic, DEBUG_CALIBRANT, DiamondCubic, FaceCenteredCubic, QxrdCalibrantQuadInt::h(), QxrdCalibrantQuadInt::k(), QxrdCalibrantQuadInt::l(), QxrdCalibrantQuadInt::n(), QcepObject::printMessage(), qcepDebug(), and SimpleCubic.

Referenced by dSpacings().

102 {
103  int s = get_Symmetry();
104  double a = get_A();
105  double lambda = (energy>100 ? 12398.4187/energy : energy);
106 
107  int mmax = 2.0*a/lambda + 1;
108 
109 // if (qcepDebug(DEBUG_CALIBRANT)) {
110 // printMessage(tr("mmax = %1").arg(mmax));
111 // }
112 
113  QVector<QxrdCalibrantQuadInt> ex(mmax*mmax);
114 
115  for (int h=1; h<=mmax; h++) {
116  for (int k=0; k<=h; k++) {
117  for (int l=0; l<=k; l++) {
118  int r = h*h+k*k+l*l;
119 
120  if (r < mmax*mmax) {
121  bool ok=false;
122 
123  switch (s) {
124  case SimpleCubic: // Simple cubic - all OK
125  ok = true;
126  break;
127 
128  case BodyCenteredCubic: // BCC h+k+l even
129  ok = ((h + k + l) % 2) == 0;
130  break;
131 
132  case FaceCenteredCubic: // FCC h,k,l all even or all odd
133  {
134  int n = h%2 + k%2 + l%2;
135  ok = (n==0) || (n==3);
136  }
137  break;
138 
139  case DiamondCubic:
140  {
141  int nn = h%2 + k%2 + l%2;
142 
143  if (nn==0 || nn==3) { // If nn==0 - all even, nn==3 - all odd
144  int n = (h + k + l);
145 
146  if (n%2 == 0) {
147  ok = (n%4 == 0);
148  } else {
149  ok = true;
150  }
151  }
152  }
153  break;
154  }
155 
156  if (ok) {
157  if (ex[r].n() == 0) {
158  ex[r] = QxrdCalibrantQuadInt(1, h,k,l);
159  } else {
160  ex[r].n()++;
161  }
162  }
163  }
164  }
165  }
166  }
167 
169 
170  for (int i=1; i<mmax*mmax; i++) {
171  QxrdCalibrantQuadInt e = ex[i];
172  if (e.n() > 0) {
173  double d = a/sqrt(i);
174  double tth = 2.0*asin(lambda/(2.0*d))*180.0/M_PI;
175 
176  if (tth <= 90) {
177  pts.append(QxrdCalibrantDSpacing(get_Index(), e.h(), e.k(), e.l(), e.n(), d, tth));
178 
179  if (qcepDebug(DEBUG_CALIBRANT)) {
180  printMessage(tr("%1(%2): [%3,%4,%5], d:%6, tth:%7").arg(i).arg(e.n()).arg(e.h()).arg(e.k()).arg(e.l()).arg(d).arg(tth));
181  }
182  }
183  }
184  }
185 
186  return pts;
187 }
qint64 qcepDebug(int cond)
Definition: qcepdebug.cpp:26
virtual void printMessage(QString msg, QDateTime dt=QDateTime::currentDateTime()) const
Definition: qcepobject.cpp:84

Here is the call graph for this function:

Here is the caller graph for this function:

QxrdCalibrantDSpacings QxrdCalibrant::dSpacingsHexagonal ( double  energy)
private

Definition at line 194 of file qxrdcalibrant.cpp.

References a, c, Hexagonal, QxrdCalibrantDSpacings::insertUnique(), lessThan(), and RHexagonal.

Referenced by dSpacings().

195 {
196  int s = get_Symmetry();
197  double a = get_A();
198  double c = get_C();
199 
200  double lambda = (energy>100 ? 12398.4187/energy : energy);
201 
202  int hkmax = 2.0*a/lambda + 1;
203  int lmax = 2.0*c/lambda + 1;
204 
205 // if (qcepDebug(DEBUG_CALIBRANT)) {
206 // printMessage(tr("mmax = %1").arg(mmax));
207 // }
208 
210 
211  int lmin = 0;
212  if (s == RHexagonal) {
213  lmin = -lmax;
214  }
215 
216  for (int l=lmin; l<=lmax+1; l++) {
217  for (int k=0; k<=hkmax+1; k++) {
218 
219  int hmin=k;
220  if (l<0) {
221  hmin += 1;
222  }
223 
224  for (int h=hmin; h<=hkmax+1; h++) {
225  if (h || k || l) {
226  int ok = false;
227 
228  switch (s) {
229  case RHexagonal:
230  ok = ((-h+k+l)%3 == 0);
231  break;
232  case Hexagonal:
233  ok = true;
234  break;
235  }
236 
237  if (ok) {
238  double d = 1.0/sqrt((4.0/3.0)*(h*h + h*k + k*k)/(a*a) + (l*l)/(c*c));
239  double tth = 2.0*asin(lambda/(2.0*d))*180.0/M_PI;
240 
241  if (tth < 90) {
242  pts.insertUnique(get_Index(), h,k,l,d,tth);
243  }
244  }
245  }
246  }
247  }
248  }
249 
250  qSort(pts.begin(), pts.end(), lessThan);
251 
252  return pts;
253 }
void insertUnique(int index, int h, int k, int l, double d, double tth)
bool lessThan(const QxrdCalibrantDSpacing &d1, const QxrdCalibrantDSpacing &d2)

Here is the call graph for this function:

Here is the caller graph for this function:

void QxrdCalibrant::fromScriptValue ( const QScriptValue &  obj,
QxrdCalibrantWPtr cal 
)
static

Definition at line 46 of file qxrdcalibrant.cpp.

47 {
48  QObject *qobj = obj.toQObject();
49 
50  if (qobj) {
51  QxrdCalibrant *qcal = qobject_cast<QxrdCalibrant*>(qobj);
52 
53  if (qcal) {
54  cal = QxrdCalibrantPtr(qcal);
55  }
56  }
57 }
QSharedPointer< QxrdCalibrant > QxrdCalibrantPtr
bool QxrdCalibrant::isLocked ( )

Definition at line 36 of file qxrdcalibrant.cpp.

37 {
38  return (get_Flags() & 1) == 0;
39 }
QScriptValue QxrdCalibrant::toScriptValue ( QScriptEngine *  engine,
const QxrdCalibrantWPtr cal 
)
static

Definition at line 41 of file qxrdcalibrant.cpp.

42 {
43  return engine->newQObject(cal.data());
44 }

Member Data Documentation

QxrdCalibrantLibraryWPtr QxrdCalibrant::m_CalibrantLibrary
private

Definition at line 94 of file qxrdcalibrant.h.

QxrdExperimentWPtr QxrdCalibrant::m_Experiment
private

Definition at line 93 of file qxrdcalibrant.h.

QMutex QxrdCalibrant::m_Mutex
mutableprivate

Definition at line 92 of file qxrdcalibrant.h.

Property Documentation

double QxrdCalibrant::a
readwrite

Definition at line 73 of file qxrdcalibrant.h.

Referenced by dSpacingsCubic(), and dSpacingsHexagonal().

double QxrdCalibrant::alpha
readwrite

Definition at line 82 of file qxrdcalibrant.h.

double QxrdCalibrant::b
readwrite

Definition at line 76 of file qxrdcalibrant.h.

double QxrdCalibrant::beta
readwrite

Definition at line 85 of file qxrdcalibrant.h.

double QxrdCalibrant::c
readwrite

Definition at line 79 of file qxrdcalibrant.h.

Referenced by dSpacingsHexagonal().

QString QxrdCalibrant::description
readwrite

Definition at line 67 of file qxrdcalibrant.h.

int QxrdCalibrant::flags
readwrite

Definition at line 64 of file qxrdcalibrant.h.

double QxrdCalibrant::gamma
readwrite

Definition at line 88 of file qxrdcalibrant.h.

int QxrdCalibrant::index
readwrite

Definition at line 61 of file qxrdcalibrant.h.

int QxrdCalibrant::isUsed
readwrite

Definition at line 58 of file qxrdcalibrant.h.

int QxrdCalibrant::symmetry
readwrite

Definition at line 70 of file qxrdcalibrant.h.


The documentation for this class was generated from the following files: