Skip to content
Snippets Groups Projects
Commit f76b9ed9 authored by Andre Offringa's avatar Andre Offringa
Browse files

Task #1892: variable step size for dnds

parent 8aaf8dcb
No related branches found
No related tags found
No related merge requests found
...@@ -107,6 +107,7 @@ class HistogramPage : public Gtk::HBox { ...@@ -107,6 +107,7 @@ class HistogramPage : public Gtk::HBox {
Gtk::Frame _functionFrame; Gtk::Frame _functionFrame;
Gtk::VBox _functionBox; Gtk::VBox _functionBox;
Gtk::RadioButton _nsButton, _dndsButton; Gtk::RadioButton _nsButton, _dndsButton;
Gtk::Entry _deltaSEntry;
Gtk::Button _plotPropertiesButton, _dataExportButton; Gtk::Button _plotPropertiesButton, _dataExportButton;
......
...@@ -291,6 +291,25 @@ class LogHistogram : public Serializable ...@@ -291,6 +291,25 @@ class LogHistogram : public Serializable
return (double) sqrtl(sqErrorSum/(xsqErrorSum * (long double) (n-2))); return (double) sqrtl(sqErrorSum/(xsqErrorSum * (long double) (n-2)));
} }
double NormalizedSlopeStdDevBySampling(double startAmplitude, double endAmplitude, double slope, double stepFactor) const
{
long double sum = 0.0;
unsigned long n = 0;
if(stepFactor <= 1.0001) stepFactor = 1.0001;
while(startAmplitude < endAmplitude)
{
const double stepEnd = startAmplitude * stepFactor;
double sampledSlope = NormalizedSlope(startAmplitude, stepEnd);
double sampleError = sampledSlope - slope;
sum += sampleError * sampleError;
++n;
startAmplitude = stepEnd;
}
return (double) sqrtl(sum / ((long double) n*n - n));
}
double PowerLawUpperLimit(double constrainingAmplitude, double exponent, double factor) const double PowerLawUpperLimit(double constrainingAmplitude, double exponent, double factor) const
{ {
const double count = NormalizedCountAbove(constrainingAmplitude); const double count = NormalizedCountAbove(constrainingAmplitude);
......
...@@ -49,6 +49,7 @@ HistogramPage::HistogramPage() : ...@@ -49,6 +49,7 @@ HistogramPage::HistogramPage() :
_functionFrame("Function"), _functionFrame("Function"),
_nsButton("N(S)"), _nsButton("N(S)"),
_dndsButton("dN(S)/dS"), _dndsButton("dN(S)/dS"),
_deltaSEntry(),
_plotPropertiesButton("Properties"), _plotPropertiesButton("Properties"),
_dataExportButton("Data"), _dataExportButton("Data"),
_slopeFrame("Slope"), _slopeFrame("Slope"),
...@@ -123,6 +124,9 @@ HistogramPage::HistogramPage() : ...@@ -123,6 +124,9 @@ HistogramPage::HistogramPage() :
_dndsButton.signal_clicked().connect(sigc::mem_fun(*this, &HistogramPage::updatePlot)); _dndsButton.signal_clicked().connect(sigc::mem_fun(*this, &HistogramPage::updatePlot));
_dndsButton.set_group(group); _dndsButton.set_group(group);
_nsButton.set_active(true); _nsButton.set_active(true);
_functionBox.pack_start(_deltaSEntry, Gtk::PACK_SHRINK);
_deltaSEntry.set_text("2");
_deltaSEntry.signal_activate().connect(sigc::mem_fun(*this, &HistogramPage::updatePlot));
_functionFrame.add(_functionBox); _functionFrame.add(_functionBox);
_sideBox.pack_start(_functionFrame, Gtk::PACK_SHRINK); _sideBox.pack_start(_functionFrame, Gtk::PACK_SHRINK);
...@@ -341,13 +345,15 @@ void HistogramPage::plotFit(const LogHistogram &histogram, const std::string &ti ...@@ -341,13 +345,15 @@ void HistogramPage::plotFit(const LogHistogram &histogram, const std::string &ti
void HistogramPage::addHistogramToPlot(const LogHistogram &histogram) void HistogramPage::addHistogramToPlot(const LogHistogram &histogram)
{ {
const bool derivative = _dndsButton.get_active(); const bool derivative = _dndsButton.get_active();
double deltaS = atof(_deltaSEntry.get_text().c_str());
if(deltaS <= 1.0001) deltaS = 1.0001;
for(LogHistogram::iterator i=histogram.begin();i!=histogram.end();++i) for(LogHistogram::iterator i=histogram.begin();i!=histogram.end();++i)
{ {
if(derivative) if(derivative)
{ {
const double x = i.value(); const double x = i.value();
const double logx = log10(x); const double logx = log10(x);
const double cslope = histogram.NormalizedSlope(x*0.5, x*2.0); const double cslope = histogram.NormalizedSlope(x/deltaS, x*deltaS);
if(std::isfinite(logx) && std::isfinite(cslope)) if(std::isfinite(logx) && std::isfinite(cslope))
_plot.PushDataPoint(logx, cslope); _plot.PushDataPoint(logx, cslope);
} else { } else {
...@@ -463,8 +469,6 @@ void HistogramPage::onDataExportClicked() ...@@ -463,8 +469,6 @@ void HistogramPage::onDataExportClicked()
void HistogramPage::updateSlopeFrame(const LogHistogram &histogram) void HistogramPage::updateSlopeFrame(const LogHistogram &histogram)
{ {
std::stringstream str; std::stringstream str;
str << "Slopes:";
addSlopeText(str, histogram, true); addSlopeText(str, histogram, true);
_slopeTextView.get_buffer()->set_text(str.str()); _slopeTextView.get_buffer()->set_text(str.str());
...@@ -472,6 +476,8 @@ void HistogramPage::updateSlopeFrame(const LogHistogram &histogram) ...@@ -472,6 +476,8 @@ void HistogramPage::updateSlopeFrame(const LogHistogram &histogram)
void HistogramPage::addSlopeText(std::stringstream &str, const LogHistogram &histogram, bool updateRange) void HistogramPage::addSlopeText(std::stringstream &str, const LogHistogram &histogram, bool updateRange)
{ {
double deltaS = atof(_deltaSEntry.get_text().c_str());
if(deltaS <= 1.0001) deltaS = 1.0001;
double minRange, maxRange; double minRange, maxRange;
if(_slopeAutoRangeButton.get_active()) if(_slopeAutoRangeButton.get_active())
{ {
...@@ -494,11 +500,12 @@ void HistogramPage::addSlopeText(std::stringstream &str, const LogHistogram &his ...@@ -494,11 +500,12 @@ void HistogramPage::addSlopeText(std::stringstream &str, const LogHistogram &his
slope = histogram.NormalizedSlope(minRange, maxRange), slope = histogram.NormalizedSlope(minRange, maxRange),
offset = histogram.NormalizedSlopeOffset(minRange, maxRange, slope), offset = histogram.NormalizedSlopeOffset(minRange, maxRange, slope),
error = histogram.NormalizedSlopeStdDev(minRange, maxRange, slope, offset), error = histogram.NormalizedSlopeStdDev(minRange, maxRange, slope, offset),
errorB = histogram.NormalizedSlopeStdDevBySampling(minRange, maxRange, slope, deltaS),
upperLimit = histogram.PowerLawUpperLimit(minRange, slope, pow10(offset)), upperLimit = histogram.PowerLawUpperLimit(minRange, slope, pow10(offset)),
lowerLimit = histogram.PowerLawLowerLimit(minRange, slope, pow10(offset), rfiRatio), lowerLimit = histogram.PowerLawLowerLimit(minRange, slope, pow10(offset), rfiRatio),
lowerError = fabs(lowerLimit - histogram.PowerLawLowerLimit(minRange, slope - error, pow10(offset), rfiRatio)), lowerError = fabs(lowerLimit - histogram.PowerLawLowerLimit(minRange, slope - error, pow10(offset), rfiRatio)),
lowerLimit2 = histogram.PowerLawLowerLimit2(minRange, slope, pow10(offset), rfiRatio); lowerLimit2 = histogram.PowerLawLowerLimit2(minRange, slope, pow10(offset), rfiRatio);
str << '\n' << slope << "±" << error << "\n[" str << '\n' << slope << "±" << error << "\n/±" << errorB << "\n["
<< log10(lowerLimit) << "±" << lowerError << ';' << log10(upperLimit) << ']' << '\n' << log10(lowerLimit) << "±" << lowerError << ';' << log10(upperLimit) << ']' << '\n'
<< log10(lowerLimit2); << log10(lowerLimit2);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment