Improve output data handeling from fixed numbered columns to base it on column labels.
This commit is contained in:
+94
-21
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user