Improve output data handeling from fixed numbered columns to base it on column labels.

This commit is contained in:
2026-06-13 11:08:10 +02:00
parent 7b659604a1
commit 198fb0a41a
+94 -21
View File
@@ -3745,22 +3745,31 @@ async function startSequence() {
Plot_xy("plotRge",depth,nmuons,['Depth (nm)','Stopped muons (%/nm)',ScanName+'='+Number(SValue)/1000+'keV']);
// Read the sequence data
let [cfort,cdata]= readDatFile(All["workPath"]+"/fort.33");
let lyrs = [6]; // back scattered muons
for (let ilayer=18;ilayer<cdata.length;ilayer++){lyrs.push(ilayer);} // the rest of the layers
let seqInfo = getSequenceColumnInfo(cfort, All["numLayer"]);
let energy = cdata[seqInfo.indexByName['Energy']];
let ntot = cdata[seqInfo.indexByName['ntot']];
let plotSeries = [
{
index: seqInfo.indexByName['backsc'],
label: cfort[seqInfo.indexByName['backsc']],
},
...seqInfo.layerIndices.map((index, offset) => {
let LComp = "L" + (offset + 1) + "Comp";
return {
index: index,
label: All[LComp] || seqInfo.layerHeaders[offset],
};
}),
];
// Now loop over all
Plotly.purge("plotFrac")
for (let ilayer of lyrs) {
for (let series of plotSeries) {
// Normalize
let idata = cdata[ilayer];
let idata = cdata[series.index];
for (let i=0; i<idata.length; i++) {
idata[i]=100*idata[i]/cdata[4][i];
idata[i]=100*idata[i]/ntot[i];
}
let chem = cfort[ilayer];
if (ilayer != 6) {
let LComp = "L"+(ilayer-17)+"Comp";
chem = All[LComp];
}
Plot_xy("plotFrac",cdata[0],cdata[ilayer],['E (keV)','Fraction of muons (%)',chem]);
Plot_xy("plotFrac",energy,cdata[series.index],['E (keV)','Fraction of muons (%)',series.label]);
}
await yieldToRenderer();
iScan++;
@@ -3820,6 +3829,56 @@ function readDatFile(filename) {
return [cols,data];
}
function getSequenceColumnInfo(cols, expectedLayers = null) {
// Parse the fort.33 / *_Seq_Results.dat header into fixed summary columns
// and per-layer result columns. This avoids hard-coding column offsets in
// the plotting routines.
const requiredSummaryFields = [
'Energy',
'SigmaE',
'Alpha',
'SigAlpha',
'ntot',
'imp',
'backsc',
'trans',
'tried',
'negE',
'range',
'straggeling',
'Eback',
'sigEback',
'Etrans',
'SigEtrans',
'red._E',
'PRC',
];
const indexByName = {};
for (let i = 0; i < cols.length; i++) {
indexByName[cols[i]] = i;
}
const missing = requiredSummaryFields.filter((name) => indexByName[name] == null);
if (missing.length > 0) {
throw new Error('Unexpected sequence-file header. Missing columns: ' + missing.join(', '));
}
const fixedCount = requiredSummaryFields.length;
let layerHeaders = cols.slice(fixedCount);
if (expectedLayers != null && expectedLayers >= 0) {
layerHeaders = layerHeaders.slice(0, expectedLayers);
}
return {
indexByName: indexByName,
requiredSummaryFields: requiredSummaryFields,
layerStartIndex: fixedCount,
layerHeaders: layerHeaders,
layerIndices: layerHeaders.map((_, offset) => fixedCount + offset),
};
}
function plotProfiles(filenames) {
// Plot rge files filenames
@@ -3868,16 +3927,28 @@ function plotFractions(filename) {
var plotDiv=win.document.getElementById("newPlot");
var [cfort,cdata]= readDatFile(filename);
let lyrs = [6]; // back scattered muons
for (let ilayer=18;ilayer<cdata.length;ilayer++){lyrs.push(ilayer);} // the rest of the layers
let seqInfo = getSequenceColumnInfo(cfort);
let energy = cdata[seqInfo.indexByName['Energy']];
let ntot = cdata[seqInfo.indexByName['ntot']];
let plotSeries = [
{
index: seqInfo.indexByName['backsc'],
label: cfort[seqInfo.indexByName['backsc']],
},
...seqInfo.layerIndices.map((index, offset) => ({
index: index,
label: seqInfo.layerHeaders[offset],
})),
];
// Now loop over all
for (let ilayer of lyrs) {
for (let series of plotSeries) {
// Normalize
let idata = cdata[ilayer];
let idata = cdata[series.index];
for (let i=0; i<idata.length; i++) {
idata[i]=100*idata[i]/cdata[4][i];
idata[i]=100*idata[i]/ntot[i];
}
Plot_xy(plotDiv,cdata[0],cdata[ilayer],['E (keV)','Fraction of muons (%)',cfort[ilayer]]);
Plot_xy(plotDiv,energy,cdata[series.index],['E (keV)','Fraction of muons (%)',series.label]);
}
plotDiv=win.document.getElementById("newPlot");
}
@@ -3895,14 +3966,16 @@ function plotMean(filename) {
var plotDiv=win.document.getElementById("newPlot");
let [cfort,cdata]= readDatFile(filename);
let mean = cdata[10];
let strag = cdata[11];
let seqInfo = getSequenceColumnInfo(cfort);
let energy = cdata[seqInfo.indexByName['Energy']];
let mean = cdata[seqInfo.indexByName['range']];
let strag = cdata[seqInfo.indexByName['straggeling']];
for (let i=0; i<mean.length; i++) {
mean[i]=mean[i]/10;
strag[i]=strag[i]/10;
}
Plot_xy(plotDiv,cdata[0],mean,['E (keV)','Mean Depth/Stragg. (nm)',cfort[10]]);
Plot_xy(plotDiv,cdata[0],strag,['E (keV)','Mean Depth/Stragg. (nm)',cfort[11]]);
Plot_xy(plotDiv,energy,mean,['E (keV)','Mean Depth/Stragg. (nm)','range']);
Plot_xy(plotDiv,energy,strag,['E (keV)','Mean Depth/Stragg. (nm)','straggeling']);
}
function startSim() {