252 lines
8.0 KiB
Nix
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
|
|
[];
|
|
} |