Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

252 lines
8.0 KiB
Nix

{ chemistry, core, document, physical, ... } @ libs:
let
inherit(core) debug indentation list number string type;
inherit(document) ClearPage Heading' LaTeX PhantomHeading;
inherit(physical) formatUnit;
inherit(number) toStringWithPrecision;
inherit(chemistry.elements) calculateMassOfFormula formatMolecularFormula normaliseMolecularFormula;
adjustIons#: [ string ] -> [ string ]
= ions:
let
len-1 = ( list.length ions ) - 1;
in
if ions != [ ]
then
( list.generate (x: "${list.get ions x};") len-1 ) ++ [ "${list.get ions len-1}." ]
else
[ ];
genAppendix#: Product -> [ string ]
= resources:
{ substance, ... }:
{ full, ions, ... }:
let
files
= (
if full != null
then
[
{
file = full;
title = "Übersichts\\-spektrum von ${substance.NameID}";
}
]
else
[]
)
++ (
list.concatMap
(
{ file, formattedFormula, ... }:
if file != null
then
[
{
inherit file;
title = "Isotopen\\-muster für ${formattedFormula} von ${substance.NameID}";
}
]
else
debug.warn "genAppendix" "File missing for ${formattedFormula}!" []
)
ions
);
in
list.map
(
{ file, title }:
Heading' title
(
LaTeX
[
"\\vspace{-1\\normalbaselineskip}"
"\\begin{figure}[H]%" indentation.more
"\\centering%"
"\\begin{adjustbox}%" indentation.more
"{max width=\\textwidth,max height=.4\\textheight,keepaspectratio}%"
"\\includegraphics{${file}}%"
indentation.less "\\end{adjustbox}%"
indentation.less "\\end{figure}%" null
]
)
{
before = "\\refstepcounter{ctrAppendix}%";
}
)
files;
genAppendix'
= resources:
{ failure ? false, ... } @ product:
let
ms
= product.ms
or product.substance.ms
or null;
in
if ms != null
&& !failure
then
genAppendix resources product ms
else
[ ];
generateAppendix
= syntheses:
{ configuration, resources, ... } @ document:
let
syntheses'
= if type.isPath syntheses
then
import
syntheses
(libs // { chemistry = libs.chemistry // { ms = null; }; })
document
else
syntheses;
in
LaTeX
[
( ClearPage )
(
PhantomHeading
(
PhantomHeading
(
list.concatMap
(
synthesis:
if synthesis ? product
then
let
product
= if type.isLambda synthesis.product then synthesis.product { }
else synthesis.product;
in
if type.isList product then list.map (genAppendix' resources) product
else [ ( genAppendix' resources product ) ]
else
[ ]
)
(
if type.isList syntheses'
then
syntheses'
else
syntheses'.list
)
)
)
)
];
mapIons
= list.map
(
{ calculated ? null, charge, formula, found, mrm ? null, ... } @ ion:
let
charge'
= if charge == 0
then
""
else if charge == 1
then
"+"
else if charge == -1
then
"\\minus"
else if charge > 0
then
"+${string charge}"
else
"\\minus${string (0 - charge)}";
found' = toStringWithPrecision found 4;
formula' = normaliseMolecularFormula formula;
formula'' = formatMolecularFormula formula';
mass
= if calculated != null
then
calculated
else
calculateMassOfFormula formula';
mass' = toStringWithPrecision mass 4;
delta = ((found - mass) / mass) * 1000 * 1000;
delta'
= if delta < 0
then
"-\\text{${toStringWithPrecision (-delta) 2}}"
else
"\\text{${toStringWithPrecision delta 2}}";
formattedCalc = "berechnet für ${formattedFormula}: ${mass'}, ";
formattedDelta = "\${\\Delta m = ${delta'}}$";
formattedFound = "gefunden: ${found'}, ";
formattedFormula = "[\\ch{${formula''}}]\\textsuperscript{${charge'}}";
in
ion
// {
inherit mrm formattedFormula;
formattedLine = "${formattedCalc}${formattedFound}${formattedDelta}";
}
);
report# { ... } -> { method: string; ions: [ Ion ] }
= { acronyms, ... } @ resources:
{ highRes, ions, method, ... }:
[
(
LaTeX
(
let
method'
= {
"ESI-TOF" = "${acronyms.electroSprayIonisation.short}-${acronyms.timeOfFlightMS.as "TOF"}";
}.${method}
or (
(
acronyms.${method}
or {
short = debug.panic "report" "Unknown method »${method}«";
}
).short
);
ions' = list.map ({ formattedLine, ... }: formattedLine) ions;
unit = formatUnit [ "dalton" "elementaryCharge-1" ];
highRes'
= if highRes
then
acronyms.highResolutionMassSpectrometry.short
else
acronyms.massSpectrometry.short;
in
#debug.panic "report" { text = "unit"; data = unit; }
[
"\\mbox{}\\textbf{${highRes'}}"
" (${method'}, ${acronyms.massToChargeRatio.short}~/~${unit}, $\\Delta$~/~${acronyms.ppm.short}):"
indentation.more
]
++ ( adjustIons ions' )
++ [ indentation.less ]
)
)
];
in
{
inherit generateAppendix;
Spectrum
= { full ? null, highRes ? false, ions, method, files ? {} }:
{
inherit files full highRes method;
ions = mapIons ions;
};
report
= { ... } @ resources:
data:
if type.isSet data
&& data != {}
then
report resources data
else
[];
}