Hallo zusammen,
Ich habe viele verschiedene Spalten aus einem FTIR-Spektrenexperiment und um die Basislinie zu korrigieren, muss ich für jede Spalte eine Spline-Anpassung durchführen (eine Spalte = ein Spektrum). Ich möchte dies automatisch mit JSL tun, damit ich nicht Hunderte von „vorhergesagten Werten“ manuell speichern muss.
Ich habe versucht, einen Code zu erstellen, aber irgendwie will er die Werte nicht speichern oder in jede Spalte eine 0 einfügen.
Kann mir da jemand weiterhelfen?
Unten ist mein Code:
dt = Current Data Table();
// Define the columns for the fit (assuming multiple Y columns and one X column)
x_col = Column("Wavenumber"); // Replace with the name of your X column
y_cols = {};
For(i = 1, i <= N Col(dt), i++,
col_name = Column(i) << Get Name;
// Check if the column name contains "Absorbance at t="
If(Contains(col_name, "Absorbance at t="),
Insert Into(y_cols, col_name); // Add to the list
);
);
// Create a list to store fit reports
fit_reports = {};
// Perform Fit Y by X for each Y column separately and display the fit
For(i = 1, i <= N Items(y_cols), i++,
y_col = y_cols[i];
fit_report = dt << Fit Y by X(
Y(Column(y_col)),
X(x_col),
Fit Spline(1000) // Adjust the lambda (smoothing parameter) as needed
);
Insert Into(fit_reports, fit_report);
);
Show(
"All fits have been displayed. Please review them and adjust the lambda value in the script if needed."
);
// Wait for user to review fits
Wait(0);
// Use a Yes/No dialog to prompt the user to continue or stop
result = New Window("Save Predicted Values?",
Text Box("Are you satisfied with the fits? Click Yes to save predicted values, No to stop."),
Button Box("Yes",
// Save predicted values as columns in the dataset
For(i = 1, i <= N Items(y_cols), i++,
y_col = y_cols[i];
fit_report = fit_reports[i];
predicted_col_name = "Spline Predictor for " || y_col;
dt << New Column(predicted_col_name, Numeric);
Column(predicted_col_name) << Set Values(fit_report["Prediction Formula"]);
);
Show("Predicted values saved successfully.");
),
Button Box("No",
Show("Predicted values were not saved.");
)
);
// Close all fit reports
For(i = 1, i <= N Items(fit_reports), i++,
Close(fit_reports[i], No Save);
);
Close(result); // Close the dialog window
Edit 2024-09-24 jthi: JSL-Formatierung hinzugefügt
Dies könnte einige Ideen geben
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
xcol = "NPN1";
ycols = {"PNP1", "NPN2"};
fits = {};
For Each({ycol}, ycols,
Insert Into(fits,
dt << Fit Y by X(
Y(Eval(ycol)),
X(Eval(xcol)),
Fit Spline(1000)
);
);
);
close_expr = Expr(
For Each({fit}, fits,
fit << close window;
);
nw << Close Window;
);
nw = New Window("Save Predicted Values?",
Text Box("Are you satisfied with the fits? Click Yes to save predicted values, No to stop."),
Button Box("Yes",
For Each({fit}, fits,
fit << (Curve["Smoothing Spline Fit, lambda=1000"] << Save Predicteds);
);
wait(0);
close_expr;
Show("Predicted values saved successfully.");
),
Button Box("No",
Show("Predicted values were not saved.");
close_expr;
)
);
Ich würde auch alle Fit Y by X in einem einzigen Fenster sammeln, damit es einfacher ist, sie zu überprüfen, anstatt mehrere separate Fenster zu öffnen
Es hat wunderbar funktioniert, vielen Dank! Ich habe stundenlang mit ChatGPT gekämpft, um eine Lösung zu finden 