1 #ifndef CTL_ABSTRACTSOURCE_H 2 #define CTL_ABSTRACTSOURCE_H 3 #include "mat/matrix_types.h" 4 #include "models/intervaldataseries.h" 5 #include "models/abstractxrayspectrummodel.h" 66 typedef Range<float> EnergyRange;
74 static const
uint DEFAULT_SPECTRUM_RESOLUTION_HINT = 10;
77 public:virtual
EnergyRange nominalEnergyRange() const = 0;
85 QString
info() const override;
104 void setEnergyRangeRestriction(const
EnergyRange& window);
122 const QString&
name);
126 const QString&
name);
139 bool _hasRestrictedEnergyWindow =
false;
163 inline AbstractSource::AbstractSource(
const QString& name)
173 inline AbstractSource::AbstractSource(
const QSizeF& focalSpotSize,
const QString& name)
175 , _focalSpotSize(focalSpotSize)
183 inline AbstractSource::AbstractSource(
const QSizeF& focalSpotSize,
187 , _focalSpotSize(focalSpotSize)
188 , _focalSpotPosition(focalSpotPosition)
197 inline AbstractSource::AbstractSource(
const QSizeF& focalSpotSize,
202 , _focalSpotSize(focalSpotSize)
203 , _focalSpotPosition(focalSpotPosition)
204 , _spectrumModel(spectumModel)
275 throw std::runtime_error(
"No spectrum model set.");
279 eRange.start(), eRange.end(), nbSamples);
288 if(!qFuzzyIsNull(spec.integral()))
298 throw std::runtime_error(
"No spectrum model set.");
301 range.
start(), range.
end(), nbSamples);
303 spec.clampToRange({ eRange.start(), eRange.end() });
306 if(!qFuzzyIsNull(spec.integral()))
307 spec.normalizeByIntegral();
319 return DEFAULT_SPECTRUM_RESOLUTION_HINT;
383 inline void AbstractSource::setEnergyRangeRestriction(
const EnergyRange& window)
386 _hasRestrictedEnergyWindow =
true;
407 +
"\tEnergy range: [" + QString::number(
energyRange().start()) +
"," +
410 +
"photons / cm^2 @ 1m\n" 411 +
"\tFlux modifier: " 413 +
"\tFocal spot size: " + QString::number(
_focalSpotSize.width()) +
" mm x " 416 "\tFocal spot position: " 421 ret += (this->
type() == AbstractSource::Type) ? QLatin1String(
"}\n") : QLatin1String(
"");
449 QVariantMap varMap = variant.toMap();
450 auto fsPos = varMap.value(QStringLiteral(
"focal spot position"), QVariantList{0.0, 0.0, 0.0}).toList();
451 Vector3x1 fsPosVec({ fsPos.at(0).toDouble(), fsPos.at(1).toDouble(), fsPos.at(2).toDouble() });
453 auto fsSize = varMap.value(QStringLiteral(
"focal spot size")).toMap();
455 fsQSize.setWidth(fsSize.value(QStringLiteral(
"width")).toDouble());
456 fsQSize.setHeight(fsSize.value(QStringLiteral(
"height")).toDouble());
458 QVariant specMod = varMap.value(QStringLiteral(
"spectrum model"));
463 SerializationHelper::parseDataModel(specMod)));
482 ret.insert(QStringLiteral(
"focal spot position"), fsPos);
483 ret.insert(QStringLiteral(
"focal spot size"), fsSize);
484 ret.insert(QStringLiteral(
"spectrum model"), specMod);
491 const auto clamp = [] (
float val,
float low,
float high)
493 return (val<low) ? low : ((val>high) ? high : val);
496 const auto nomRange = nominalEnergyRange();
497 if(!_hasRestrictedEnergyWindow)
561 #endif // CTL_ABSTRACTSOURCE_H void setFocalSpotPosition(const Vector3x1 &position)
Definition: abstractsource.h:368
#define DECLARE_ELEMENTAL_TYPE
Definition: systemcomponent.h:148
QString info() const override
Definition: abstractsource.h:402
double photonFlux() const
Definition: abstractsource.h:523
QVariant toVariant() const override
Definition: abstractsource.h:467
double & get() noexcept
Definition: matrix.tpp:164
const Vector3x1 & focalSpotPosition() const
Definition: abstractsource.h:335
static QString typeInfoString(const std::type_info &type)
Definition: systemcomponent.cpp:52
virtual double nominalPhotonFlux() const =0
void setFocalSpotSize(const QSizeF &size)
Definition: abstractsource.h:351
const QSizeF & focalSpotSize() const
Definition: abstractsource.h:328
virtual uint spectrumDiscretizationHint() const
Definition: abstractsource.h:317
virtual QString info() const
Definition: systemcomponent.cpp:29
virtual IntervalDataSeries spectrum(uint nbSamples) const
Returns the (relative) emitted radiation spectrum sampled with nbSamples bins covering the energy ran...
Definition: abstractsource.h:272
static IntervalDataSeries sampledFromModel(const AbstractIntegrableDataModel &dataModel, float from, float to, uint nbSamples, ValueType samples=BinIntegral)
Return a series of nbSamples values sampled from dataModel within the specified interval [ from,...
Definition: intervaldataseries.cpp:110
T & end()
Returns a (modifiable) reference to the end point of this range.
Definition: range.h:157
const QString & name() const
Definition: systemcomponent.cpp:42
const AbstractXraySpectrumModel * spectrumModel() const
Definition: abstractsource.h:340
QVariant toVariant() const override
Definition: systemcomponent.cpp:64
The AbstractXraySpectrumModel class is the abstract base class for data models representing X-ray spe...
Definition: abstractxrayspectrummodel.h:27
double _fluxModifier
Global (multiplicative) modifier for the photon flux.
Definition: abstractsource.h:135
The IntervalDataSeries class is a container for a series of values sampled in equidistant steps (i....
Definition: intervaldataseries.h:65
T & start()
Returns a (modifiable) reference to the start point of this range.
Definition: range.h:151
bool hasSpectrumModel() const
Definition: abstractsource.h:394
Base class for all system components.
Definition: systemcomponent.h:53
float centroid() const
Returns the centroid of the series.
Definition: intervaldataseries.cpp:335
DataModelPtr< AbstractXraySpectrumModel > _spectrumModel
Data model for the emitted radiation spectrum.
Definition: abstractsource.h:137
void setFluxModifier(double modifier)
Definition: abstractsource.h:544
EnergyRange _restrictedEnergyWindow
Windowed energy range.
Definition: abstractsource.h:138
void fromVariant(const QVariant &variant) override
Definition: abstractsource.h:445
#define CTL_TYPE_ID(newIndex)
Definition: serializationinterface.h:189
Vector3x1 _focalSpotPosition
Position of the focal spot (relative to source center).
Definition: abstractsource.h:134
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
QSizeF _focalSpotSize
Size of the focal spot (in mm).
Definition: abstractsource.h:133
float meanEnergy() const
Definition: abstractsource.h:509
void fromVariant(const QVariant &variant) override
Definition: systemcomponent.cpp:58
EnergyRange energyRange() const
Definition: abstractsource.h:489
Extends std::unique_ptr<T> with copy operations using the clone method of type T.
Definition: copyableuniqueptr.h:14
int type() const override
Definition: abstractsource.h:70
virtual void setSpectrumModel(AbstractXraySpectrumModel *model)
Definition: abstractsource.h:431
Base class for source components.
Definition: abstractsource.h:68
Definition: genericsource.h:11
void normalizeByIntegral()
Normalizes the values in the series such that the integral will be one afterwards.
Definition: intervaldataseries.cpp:232
double fluxModifier() const
Definition: abstractsource.h:531