Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
58ff720
Improve curve-fit precision, spreadsheet reports, and results layout
paulnord Sep 5, 2026
f063051
Test Control-click according to native platform behavior
paulnord Sep 5, 2026
ed81ad2
Support curve-fit reports and parameter sizing in SwingJS
paulnord Sep 5, 2026
9f4f430
Refresh constrained fits and distinguish unavailable uncertainties
paulnord Sep 5, 2026
b6ea220
Run numerical constraint checks in the SwingJS test fixture
paulnord Sep 5, 2026
629b468
Use effective parameter rank in fit statistics and clarify R squared
paulnord Sep 5, 2026
2ca0d66
Add unit-aware physics fit reports and optional common measurement un…
paulnord Sep 6, 2026
fbdcb6e
Default to a compact fit report with optional full analysis
Sep 7, 2026
1d6dde1
Clarify uncertainty choices and preserve scale when switching units
paulnord Sep 7, 2026
9c3d30b
Display data uncertainty with two significant digits
paulnord Sep 7, 2026
f76b42a
Compact fit controls and export motion results from position fits
paulnord Sep 7, 2026
fea5ac3
Explain fit uncertainties and document Bevington-style profiling
paulnord Sep 7, 2026
b4e68ae
Clarify fitted values, measurement uncertainties, and coefficient errors
paulnord Sep 7, 2026
f6b9a34
Show intermediate steps in the profile uncertainty example
paulnord Sep 7, 2026
5adff93
Keep residual variance explicit in the uncertainty example
paulnord Sep 7, 2026
50d214a
Split fit uncertainty docs by audience
paulnord Sep 7, 2026
7b8511d
Refocus fit uncertainty guide for students
paulnord Sep 7, 2026
a6facb6
Index fit uncertainty docs by audience
paulnord Sep 7, 2026
fa99b0d
Clarify variance assumptions and connect uncertainty derivation steps
paulnord Sep 7, 2026
19c55f7
Show rounded intercept and uncertainty in the worked example
paulnord Sep 7, 2026
87bd06c
Add complete documentation navigation to every fit guide
paulnord Sep 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/org/opensourcephysics/display/DataTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,15 @@ public void setFormatPattern(String columnName, String pattern) {
* @param units the units string (may be null)
* @param tootip the tooltip (may be null)
*/
/** Returns existing renderer metadata; never interprets the column name. */
public String getUnits(String columnName) {
if (columnName == null) return null;
int suffix=columnName.indexOf("_{ ");
String key=suffix>0?columnName.substring(0,suffix):columnName;
UnitRenderer renderer=unitRenderersByColumnName.get(key);
return renderer==null?null:renderer.units;
}

public void setUnits(String columnName, String units, String tooltip) {
if (units == null) {
unitRenderersByColumnName.remove(columnName);
Expand Down Expand Up @@ -2643,7 +2652,10 @@ public StringBuffer getData(boolean asFormatted) {
if (isRowNumberVisible() && selectedColumns[j] == 0)
continue;
String name = getColumnName(selectedColumns[j]);
name = TeXParser.removeSubscripting(name);
String units = getUnits(name);
name = units == null || units.trim().length() == 0
? ExportText.ascii(TeXParser.removeSubscripting(name))
: ExportText.header(name, units);
// if (name.startsWith(FunctionEditor.THETA)) {
// for (int i = 0; i < selectedRows.length; i++) {
// Object val = getFormattedValueAt(selectedRows[i], selectedColumns[j]);
Expand Down
30 changes: 30 additions & 0 deletions src/org/opensourcephysics/display/ExportText.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.opensourcephysics.display;

/** Plain-text notation for spreadsheet headers and expressions, never numeric cells. */
public final class ExportText {
private ExportText() {}
public static String ascii(String text) {
if (text == null) return "";
String s = text.replace("\\cdot", "*").replace("\\times", "*")
.replace("\\mu", "u").replace("\\theta", "theta").replace("\\sigma", "sigma")
.replace("\\alpha", "alpha").replace("\\beta", "beta").replace("\\omega", "omega")
.replace("\\Delta", "Delta").replace("\\pi", "pi")
.replace("·", "*").replace("×", "*").replace("−", "-")
.replace("µ", "u").replace("μ", "u").replace("θ", "theta")
.replace("σ", "sigma").replace("α", "alpha").replace("β", "beta")
.replace("ω", "omega").replace("Δ", "Delta").replace("π", "pi");
String supers = "⁰¹²³⁴⁵⁶⁷⁸⁹⁻⁺", normal = "0123456789-+";
StringBuilder out = new StringBuilder(); boolean exponent = false;
for (int i=0;i<s.length();i++) {
int n=supers.indexOf(s.charAt(i));
if(n>=0) { if(!exponent) out.append('^'); out.append(normal.charAt(n)); exponent=true; }
else { out.append(s.charAt(i)); exponent=false; }
}
return out.toString().replaceAll("([_^])\\{([^{}]*)\\}", "$1$2");
}
public static String header(String name, String units) {
String label=ascii(name), unit=ascii(units).trim();
String suffix=" ("+unit+")";
return unit.length()==0 || label.endsWith(suffix) ? label : label+suffix;
}
}
94 changes: 93 additions & 1 deletion src/org/opensourcephysics/resources/tools/tools.properties
Original file line number Diff line number Diff line change
Expand Up @@ -905,4 +905,96 @@ LibraryResource.Type.Data.Description=Data file
LibraryResource.Type.URL.Description=URL hyperlink
LibraryBrowser.Dialog.NoResources.File=The file
LibraryTreePanel.Dialog.Open.Message=Do you want to open
LibraryTreePanel.Dialog.Open.Title=Open Resource?
LibraryTreePanel.Dialog.Open.Title=Open Resource?

# Curve fit clipboard report
DatasetCurveFitter.Button.CopyFitReport=Copy Fit Report
DatasetCurveFitter.Button.CopyFitReport.Tooltip=Copy parameters and the fit statistics shown on screen
DatasetCurveFitter.Report.Title=Curve fit report
DatasetCurveFitter.Report.Data=Data
DatasetCurveFitter.Report.Model=Model
DatasetCurveFitter.Report.Equation=Equation
DatasetCurveFitter.Report.Mode=Mode
DatasetCurveFitter.Report.Auto=Automatic fit
DatasetCurveFitter.Report.Manual=Manual parameters
DatasetCurveFitter.Report.Parameter=Parameter
DatasetCurveFitter.Report.Value=Value (full precision)
DatasetCurveFitter.Report.Uncertainty=Uncertainty (full precision)
DatasetCurveFitter.Report.Rounded=Value +/- uncertainty (rounded)
DatasetCurveFitter.Report.Fixed=Fixed
DatasetCurveFitter.Report.Yes=Yes
DatasetCurveFitter.Report.No=No
DatasetCurveFitter.Report.NA=N/A
DatasetCurveFitter.Report.Points=Data points (n)
DatasetCurveFitter.Report.Free=Free parameters
DatasetCurveFitter.Report.DF=Degrees of freedom (n - rank)
DatasetCurveFitter.Report.SSE=Residual sum of squares (SSE)
DatasetCurveFitter.Report.RMS=RMS deviation (sqrt(SSE/n))
DatasetCurveFitter.Report.R2=R-squared (1 - SSE/SST)
DatasetCurveFitter.Report.SE=Residual standard error (sqrt(SSE/(n-p)))
DatasetCurveFitter.Report.Note=Residual statistics for the current data and parameters. Parameter uncertainties are the fitter's estimates. N/A means unavailable or undefined.

DatasetCurveFitter.Button.CopyFitParameters=Copy Fit Parameters
DatasetCurveFitter.Button.CopyFitParameters.Tooltip=Copy full-precision values, uncertainties, and rounded reporting values
DatasetCurveFitter.Statistics.Points=Points
DatasetCurveFitter.Statistics.Free=Free parameters
DatasetCurveFitter.Statistics.DF=Degrees of freedom
DatasetCurveFitter.Statistics.R2=R-squared
DatasetCurveFitter.Statistics.SSE=SSE
DatasetCurveFitter.Statistics.SE=Residual SE

DatasetCurveFitter.Report.Summary=SUMMARY OUTPUT
DatasetCurveFitter.Report.RegressionStatistics=Regression Statistics
DatasetCurveFitter.Report.MultipleR=Multiple R
DatasetCurveFitter.Report.RSquare=R Square (centered)
DatasetCurveFitter.Report.AdjustedRSquare=Adjusted R Square (centered)
DatasetCurveFitter.Report.StandardError=Standard Error
DatasetCurveFitter.Report.Observations=Observations
DatasetCurveFitter.Report.ANOVA=ANOVA
DatasetCurveFitter.Report.Regression=Regression
DatasetCurveFitter.Report.Residual=Residual
DatasetCurveFitter.Report.Total=Total
DatasetCurveFitter.Report.Coefficients=Coefficients

DatasetCurveFitter.Uncertainty.Label=Data uncertainty:
DatasetCurveFitter.Uncertainty.Estimated=Unweighted - estimate from residuals
DatasetCurveFitter.Uncertainty.Constant=Known uncertainty (data units)
DatasetCurveFitter.Uncertainty.Pixels=Known uncertainty (pixels)
DatasetCurveFitter.Uncertainty.Custom=Choose a value or type a custom positive uncertainty.
DatasetCurveFitter.Uncertainty.Invalid=Unavailable: enter a positive value and check calibration.
DatasetCurveFitter.Report.Fit=FIT
DatasetCurveFitter.Report.XVariable=X variable
DatasetCurveFitter.Report.YVariable=Y variable
DatasetCurveFitter.Report.Rank=Independent parameter rank
DatasetCurveFitter.Report.Identifiability=Fit parameters are not independently identifiable
DatasetCurveFitter.Report.Residuals=RESIDUALS
DatasetCurveFitter.Report.RMSResidual=RMS residual
DatasetCurveFitter.Report.Goodness=GOODNESS OF FIT
DatasetCurveFitter.Report.ChiSquare=Chi square
DatasetCurveFitter.Report.ReducedChiSquare=Reduced chi square
DatasetCurveFitter.Report.ChiProbability=Chi-square probability Q
DatasetCurveFitter.Report.ByConstruction=by construction
DatasetCurveFitter.Report.UncertaintyModel=UNCERTAINTY MODEL
DatasetCurveFitter.Report.Estimated=Estimated from residuals
DatasetCurveFitter.Report.Specified=Specified constant sigma_y
DatasetCurveFitter.Report.EstimatedSigma=Estimated sigma_y
DatasetCurveFitter.Report.SpecifiedSigma=Specified sigma_y
DatasetCurveFitter.Report.SigmaPixels=Specified position uncertainty
DatasetCurveFitter.Report.EstimatedCaution=Residual-estimated reduced chi square is 1 by construction, not an independent goodness-of-fit test. Q is unavailable. A perfect fit has zero estimated sigma and undefined chi square.
DatasetCurveFitter.Report.QCaution=Q assumes independent Gaussian measurement errors with the stated common sigma. For nonlinear fits the rank-based degrees of freedom and Q are local approximations.
DatasetCurveFitter.Report.R2Description=Centered R Square describes variance explained, not proof of goodness of fit. Excel uses an uncentered convention for some fits through zero.
DatasetCurveFitter.Report.Parameters=PARAMETERS
DatasetCurveFitter.Report.Units=Units

DatasetCurveFitter.Report.ResidualStandardError=Residual standard error

DatasetCurveFitter.Menuitem.CopyFullReport=Copy Full Fit Report
DatasetCurveFitter.Button.CopyOptions.Tooltip=More copy options (full fit analysis)

DatasetCurveFitter.Uncertainty.Value=Uncertainty value:

DatasetCurveFitter.Report.Velocity=velocity
DatasetCurveFitter.Report.VelocityAtZero=velocity at t=0
DatasetCurveFitter.Report.Acceleration=acceleration
DatasetCurveFitter.Report.MotionResults=MOTION FROM POSITION FIT
DatasetCurveFitter.Report.Quantity=Quantity
Loading