From b49f7ad50ed1e7e6911a934b20dd3e5cca2b2f2a Mon Sep 17 00:00:00 2001 From: Steven Roberts Date: Fri, 16 Oct 2026 07:44:02 -0700 Subject: [PATCH] DUPERRET2025_POMS_STARVE: reanalyze from Table S12; QC failed (direction confounded with MS batch) MetaboLights MTBLS13313 has no abundances, but the paper's Table S12 holds per-sample peak areas for all four targeted platforms. It is CC BY-NC-ND, so build_feature_table.py fetches it from Europe PMC and checks its SHA-256 instead of committing it (table_s12_provenance.json). The 0 hpc starved-vs-fed contrast ran in raw_reanalysis mode with per-platform internal-standard normalization, a 0.001 detection limit and families averaged within tank (3 vs 3): 122 of 310 metabolites tested, 68 at padj < 0.05. It fails QC. The internal standards shift with diet, which here is MS batch, in opposite directions on two platforms that share the MES spike. Median normalization ranks metabolites identically within GM, NUCs and TCA but shifts every log2FC by about 1, and disagrees outright on PUFAs; only 61% of metabolites keep their direction (normalization_sensitivity.tsv). qc_status failed, results_file stays null, nothing is harmonized; the run's outputs are committed as provenance for the decision. Co-Authored-By: Claude Opus 5.5 --- ..._0hpc_metabolite_features_standardized.tsv | 123 + ...arved_vs_fed_0hpc_metabolomics_report.html | 3817 +++++++++++++++++ ...STARVE_starved_vs_fed_0hpc_missingness.tsv | 311 ++ ...starved_vs_fed_0hpc_workflow_manifest.json | 214 + .../build_feature_table.py | 200 + .../normalization_sensitivity.tsv | 123 + .../table_s12_provenance.json | 66 + .../studies/DUPERRET2025_POMS_STARVE.yaml | 74 +- tests/test_duperret2025_study.py | 64 + 9 files changed, 4981 insertions(+), 11 deletions(-) create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolite_features_standardized.tsv create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolomics_report.html create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_missingness.tsv create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_workflow_manifest.json create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/normalization_sensitivity.tsv create mode 100644 data/studies/DUPERRET2025_POMS_STARVE/table_s12_provenance.json diff --git a/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolite_features_standardized.tsv b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolite_features_standardized.tsv new file mode 100644 index 0000000..8f5f888 --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolite_features_standardized.tsv @@ -0,0 +1,123 @@ +feature_id putative_metabolite_name annotation_confidence_level metabolite_class log2FC pvalue padj lfcSE analysis_method +PUFAs:AA AA 2 unknown 10.716882592479 2.58147085880211e-09 2.84237940274455e-07 0.221270838257676 targeted_MS_limma_moderated_t +PUFAs:DHA DHA 2 unknown 10.2675634030565 6.98945754773251e-09 2.84237940274455e-07 0.248576284324186 targeted_MS_limma_moderated_t +PUFAs:Eicosapentaenoic Acid Eicosapentaenoic Acid 2 unknown 9.80085181393519 5.036929809124531e-09 2.84237940274455e-07 0.225169604707912 targeted_MS_limma_moderated_t +PUFAs:12-HEPE 12-HEPE 2 unknown 6.65286010257743 3.14704237663146e-07 5.48484528498626e-06 0.296620752332671 targeted_MS_limma_moderated_t +PUFAs:15-HETE 15-HETE 2 unknown 5.80351640375843 2.42984759169995e-07 5.48484528498626e-06 0.248195355263022 targeted_MS_limma_moderated_t +PUFAs:8-HETE 8-HETE 2 unknown 6.28883272146158 1.91716704371008e-07 5.48484528498626e-06 0.258886650419828 targeted_MS_limma_moderated_t +PUFAs:Lyso-PAF Lyso-PAF 2 unknown 8.22180951621831 3.0667768551909e-07 5.48484528498626e-06 0.365050285708252 targeted_MS_limma_moderated_t +PUFAs:9-HODE 9-HODE 2 unknown 6.8299343307448 3.64169305885791e-07 5.55358191475831e-06 0.311765492898079 targeted_MS_limma_moderated_t +PUFAs:11-HETE 11-HETE 2 unknown 6.14155336003814 4.56941729786099e-07 6.12893102657869e-06 0.290793905981451 targeted_MS_limma_moderated_t +PUFAs:12-HETE 12-HETE 2 unknown 6.1790277255639 5.02371395621204e-07 6.12893102657869e-06 0.297077927203158 targeted_MS_limma_moderated_t +PUFAs:16-HDoHE 16-HDoHE 2 unknown 4.47739766978135 9.93689950013784e-07 1.10209249001529e-05 0.240359905438174 targeted_MS_limma_moderated_t +PUFAs:13-HODE 13-HODE 2 unknown 7.16606267552122 1.25903692181036e-06 1.18155772662203e-05 0.399732837678073 targeted_MS_limma_moderated_t +PUFAs:20-HDoHE 20-HDoHE 2 unknown 5.25052756955446 1.21543569689018e-06 1.18155772662203e-05 0.291213165111199 targeted_MS_limma_moderated_t +PUFAs:10-HDoHE 10-HDoHE 2 unknown 5.012567144035 1.53156490248421e-06 1.33464941502195e-05 0.288637259584148 targeted_MS_limma_moderated_t +PUFAs:PGD2 PGD2 2 unknown 7.81593783850536 2.87143901870595e-06 2.33543706854751e-05 0.49849435610101 targeted_MS_limma_moderated_t +PUFAs:14-HDoHE 14-HDoHE 2 unknown 5.2133719225408 3.37288513492921e-06 2.57182491538352e-05 0.341346237147143 targeted_MS_limma_moderated_t +PUFAs:15-HEPE 15-HEPE 2 unknown 4.38432324463598 4.58479761109985e-06 2.94392267660096e-05 0.301824785290994 targeted_MS_limma_moderated_t +PUFAs:18-HEPE 18-HEPE 2 unknown 5.11335549715505 4.17175381971717e-06 2.94392267660096e-05 0.346621576514679 targeted_MS_limma_moderated_t +PUFAs:5-HEPE 5-HEPE 2 unknown 5.79171333299166 4.40047381119288e-06 2.94392267660096e-05 0.396045889328387 targeted_MS_limma_moderated_t +PUFAs:PGE2-d4 PGE2-d4 2 unknown 3.08322640515281 5.74746543811726e-06 3.50595391725153e-05 0.220254851766653 targeted_MS_limma_moderated_t +GM:Methionine sulfoxide Methionine sulfoxide 2 unknown -5.24309152793764 8.0567516655754e-06 4.68058906285809e-05 0.395895151724105 targeted_MS_limma_moderated_t +GM:Glutamic acid Glutamic acid 2 unknown -3.48583323297051 9.28285156791161e-06 5.14776314220553e-05 0.269413550536752 targeted_MS_limma_moderated_t +GM:4-Aminobutyric acid 4-Aminobutyric acid 2 unknown 3.21210082355671 5.03717766900122e-05 0.0002671894241818 0.328940830143546 targeted_MS_limma_moderated_t +PUFAs:12-KETE 12-KETE 2 unknown 6.25551712340059 8.45825679364313e-05 0.0004299613870101 0.57833866664616 targeted_MS_limma_moderated_t +PUFAs:13-HDoHE 13-HDoHE 2 unknown 5.23329475168623 0.0001052221367901 0.0005134840275361 0.505126378955826 targeted_MS_limma_moderated_t +GM:Fumaric Acid Fumaric Acid 2 unknown -2.80542628627883 0.0001101994782367 0.0005170898594186 0.32815614692399 targeted_MS_limma_moderated_t +PUFAs:Stearidonic Acid Stearidonic Acid 2 unknown 2.47847566535131 0.0001339496461637 0.0006052539567397 0.299793103645021 targeted_MS_limma_moderated_t +GM:Adenosine Adenosine 2 unknown 3.93012978336075 0.0001578634278684 0.000687833507141 0.489046260868454 targeted_MS_limma_moderated_t +GM:Niacinamide Niacinamide 2 unknown 2.37601645221479 0.000184270780835 0.0007752081124783 0.303689348807984 targeted_MS_limma_moderated_t +PUFAs:17,18-EpETE 17,18-EpETE 2 unknown -2.09622491731636 0.00023842956505 0.0009696135645368 0.28023216687943 targeted_MS_limma_moderated_t +GM:Histamine Histamine 2 unknown 3.88200205374831 0.0002608839444117 0.0010267045554266 0.527209125799994 targeted_MS_limma_moderated_t +GM:Adenosine 3',5'-cyclic monophosphate Adenosine 3',5'-cyclic monophosphate 2 unknown 2.25323102063888 0.0003422976953854 0.001305009963657 0.32100903409198 targeted_MS_limma_moderated_t +NUCs:GMP GMP 2 unknown 3.20631909373342 0.0005902114475705 0.0021819938364729 0.503531815987004 targeted_MS_limma_moderated_t +GM:Adenylsuccinic acid Adenylsuccinic acid 2 unknown 3.25243637532261 0.0006758646612037 0.0023558711047672 0.523476859020538 targeted_MS_limma_moderated_t +GM:Uric acid Uric acid 2 unknown 1.90337927685478 0.0006739340706908 0.0023558711047672 0.306187996000983 targeted_MS_limma_moderated_t +TCA:Fumaric acid Fumaric acid 2 unknown 1.79624999961691 0.0007456376578648 0.0025268831738754 0.294326967495058 targeted_MS_limma_moderated_t +TCA:Alpha-ketoglutaric acid Alpha-ketoglutaric acid 2 unknown 1.78924470006823 0.0008147180062999 0.0026863674802323 0.297971274440616 targeted_MS_limma_moderated_t +GM:Adenine Adenine 2 unknown 2.94093298806094 0.000970327835973 0.0030607132723305 0.505787857360892 targeted_MS_limma_moderated_t +PUFAs:OEA OEA 2 unknown 3.8852303609564 0.0009784247345974 0.0030607132723305 0.589026132574493 targeted_MS_limma_moderated_t +GM:Glutamine Glutamine 2 unknown -1.94139619245614 0.0013057882305621 0.0039826541032146 0.352883438182077 targeted_MS_limma_moderated_t +GM:NAD NAD 2 unknown 1.80876819180838 0.0014690194643303 0.0043712286499586 0.336157458125779 targeted_MS_limma_moderated_t +GM:Histidine Histidine 2 unknown -1.75764268684211 0.0020921602643753 0.0060772274346139 0.349503505178784 targeted_MS_limma_moderated_t +GM:Acetylcarnitine Acetylcarnitine 2 unknown 1.57244430116776 0.0025864636882175 0.007338338836338 0.325863512435196 targeted_MS_limma_moderated_t +GM:S-Adenosylhomocysteine S-Adenosylhomocysteine 2 unknown 2.85351583332972 0.0030643764101416 0.0084966800463017 0.611475532311571 targeted_MS_limma_moderated_t +TCA:Citric acid Citric acid 2 unknown 2.48147128713734 0.0041182218065683 0.0111649568978076 0.564308185524133 targeted_MS_limma_moderated_t +NUCs:UDP UDP 2 unknown -1.00919961138136 0.0044423815416921 0.0117819684366618 0.233078972331746 targeted_MS_limma_moderated_t +GM:Carnitine Carnitine 2 unknown 1.24167845819072 0.005184676508304 0.0134580964683637 0.296059336355194 targeted_MS_limma_moderated_t +GM:Cystathionine Cystathionine 2 unknown -1.18066822219403 0.0053151930898646 0.0135094491034059 0.282971972252639 targeted_MS_limma_moderated_t +GM:Nicotinic acid Nicotinic acid 2 unknown 1.38239118836646 0.0059742811546565 0.0148747408340428 0.339530176383309 targeted_MS_limma_moderated_t +GM:Guanosine Guanosine 2 unknown 2.56504413585885 0.0063119141275301 0.0152888790965423 0.637360059356079 targeted_MS_limma_moderated_t +GM:Uridine Uridine 2 unknown 1.71065424762261 0.0063912527370791 0.0152888790965423 0.426188674849473 targeted_MS_limma_moderated_t +GM:Cytidine Cytidine 2 unknown 1.33676618955516 0.0067067135333773 0.0157349817513852 0.336467510611299 targeted_MS_limma_moderated_t +GM:Thymidine Thymidine 2 unknown 2.65926171440026 0.008218629953956 0.0189183557430686 0.699310173435706 targeted_MS_limma_moderated_t +GM:Inosine Inosine 2 unknown 2.2856509500787 0.009230704477226 0.0202604366010299 0.61656575311814 targeted_MS_limma_moderated_t +NUCs:TMP TMP 2 unknown -1.59408587234631 0.0089724226208938 0.0202604366010299 0.427331088662962 targeted_MS_limma_moderated_t +TCA:L-proline L-proline 2 unknown 1.31410858006652 0.0092998725381776 0.0202604366010299 0.355072377430301 targeted_MS_limma_moderated_t +GM:Guanosine monophosphate Guanosine monophosphate 2 unknown 2.20821476222099 0.0094899934786774 0.020311915866643 0.599337560052013 targeted_MS_limma_moderated_t +GM:Hypoxanthine Hypoxanthine 2 unknown 1.71842409403814 0.0108743303082257 0.0225098621305978 0.480805599605714 targeted_MS_limma_moderated_t +NUCs:GTP GTP 2 unknown -0.840664038194246 0.0108859169320104 0.0225098621305978 0.23526960328421 targeted_MS_limma_moderated_t +TCA:Glutamic acid Glutamic acid 2 unknown 1.23330217948203 0.0111240314598994 0.0226188639684621 0.34684290686032 targeted_MS_limma_moderated_t +GM:Creatinine Creatinine 2 unknown 2.64728139488704 0.0116381600957698 0.0232763201915397 0.752157997476278 targeted_MS_limma_moderated_t +GM:Taurine Taurine 2 unknown 0.879402598319962 0.0141111850742089 0.0277671706298949 0.261190691742681 targeted_MS_limma_moderated_t +GM:Creatine Creatine 2 unknown 1.97898090137824 0.0150776638412046 0.0291980156924914 0.596971548789315 targeted_MS_limma_moderated_t +GM:Acetylcholine Acetylcholine 2 unknown 1.14196170675196 0.0172175380044815 0.0328209318210428 0.355523885259638 targeted_MS_limma_moderated_t +GM:Asparagine Asparagine 2 unknown -1.0304837181663 0.0192459709681635 0.0361232070479376 0.329592238633513 targeted_MS_limma_moderated_t +GM:Cysteine Cysteine 2 unknown 1.18408665727394 0.0250191469327028 0.0462475140271173 0.404380606170924 targeted_MS_limma_moderated_t +GM:Proline Proline 2 unknown 0.976442353912823 0.0259514506244355 0.0472548802415095 0.336611819200161 targeted_MS_limma_moderated_t +GM:Aspartic acid Aspartic acid 2 unknown 0.760506655205198 0.0267643058585231 0.0480183134520561 0.264267148509056 targeted_MS_limma_moderated_t +GM:Citric Acid Citric Acid 2 unknown 1.38763604356125 0.0302352412698065 0.0534594121002376 0.497835295437903 targeted_MS_limma_moderated_t +GM:Pantothenic acid Pantothenic acid 2 unknown 1.3579499309219 0.0340746813605985 0.0593873017999003 0.503061973691277 targeted_MS_limma_moderated_t +GM:Tyrosine Tyrosine 2 unknown 1.1329070258887 0.0390175692897633 0.0670442739908608 0.435655505242781 targeted_MS_limma_moderated_t +GM:Isoleucine Isoleucine 2 unknown 1.09655550661509 0.0509996824129041 0.0840805574915447 0.455567715092866 targeted_MS_limma_moderated_t +GM:Ornitine Ornitine 2 unknown -0.725744463813562 0.0508173003052558 0.0840805574915447 0.301191157497743 targeted_MS_limma_moderated_t +TCA:Valine Valine 2 unknown 0.898479545062405 0.0497240913984247 0.0840805574915447 0.37047605692537 targeted_MS_limma_moderated_t +TCA:Malic acid Malic acid 2 unknown 1.48372303358911 0.0557896725517693 0.0907512006842115 0.633344600969182 targeted_MS_limma_moderated_t +NUCs:UMP UMP 2 unknown -1.20409883334151 0.0585981625083465 0.0940654713949773 0.521802999740592 targeted_MS_limma_moderated_t +TCA:L-serine 1 L-serine 1 2 unknown 1.17812076849617 0.0688959787260713 0.109159862397152 0.537405773280544 targeted_MS_limma_moderated_t +GM:Lactic Acid Lactic Acid 2 unknown 0.945695007027222 0.0770454687041569 0.120507015152656 0.447591486745703 targeted_MS_limma_moderated_t +GM:Choline Choline 2 unknown 0.757928175176714 0.0910114584690403 0.140549340926872 0.379953679496755 targeted_MS_limma_moderated_t +NUCs:GDP GDP 2 unknown 2.52074988198351 0.100555968426153 0.153347851849883 1.31005778919224 targeted_MS_limma_moderated_t +PUFAs:PGE2 PGE2 2 unknown 5.43348816691175 0.104100475943066 0.155589101075742 2.8603218366078 targeted_MS_limma_moderated_t +TCA:Succinic acid Succinic acid 2 unknown 1.03872432556306 0.104576281050909 0.155589101075742 0.547741825669602 targeted_MS_limma_moderated_t +PUFAs:PGH2 PGH2 2 unknown 5.32680320696729 0.115742904738382 0.17012812503714 2.91970187154093 targeted_MS_limma_moderated_t +GM:Kynurenine Kynurenine 2 unknown 1.0381511167988 0.120437092484454 0.174920539084564 0.577968083273754 targeted_MS_limma_moderated_t +GM:Leucine Leucine 2 unknown 0.782101952553358 0.124685702447278 0.178960655277269 0.44147299200109 targeted_MS_limma_moderated_t +GM:Cystine Cystine 2 unknown -0.693030252089923 0.132607519271701 0.188117643617994 0.401118216400123 targeted_MS_limma_moderated_t +GM:Adenosine monophosphate Adenosine monophosphate 2 unknown 1.07613945680345 0.138300336796176 0.193938403323374 0.633848329729829 targeted_MS_limma_moderated_t +GM:Alanine Alanine 2 unknown -0.587910409992106 0.146917783896953 0.203681473129866 0.355314363041371 targeted_MS_limma_moderated_t +GM:Ophthalmic acid Ophthalmic acid 2 unknown 0.679800433570709 0.149272778518296 0.204621112126203 0.413693834876678 targeted_MS_limma_moderated_t +TCA:Aspartic acid Aspartic acid 2 unknown -0.779871276923428 0.160931818108894 0.218152020103168 0.490692391502233 targeted_MS_limma_moderated_t +PUFAs:13-KODE 13-KODE 2 unknown 3.35314793055292 0.165894557207473 0.222408087684744 2.13918114139752 targeted_MS_limma_moderated_t +GM:Asymmetric dimethylarginine Asymmetric dimethylarginine 2 unknown 0.721163949388961 0.179885899853551 0.236023186744771 0.477885887211138 targeted_MS_limma_moderated_t +TCA:Threonine Threonine 2 unknown -0.791807896294668 0.179919314485768 0.236023186744771 0.524745471215548 targeted_MS_limma_moderated_t +GM:Serine Serine 2 unknown -0.4317527787006 0.202211655339157 0.262444914376353 0.303186839668462 targeted_MS_limma_moderated_t +GM:Succinic acid Succinic acid 2 unknown 1.09776136067049 0.216012102457513 0.277405015787543 0.79797180046025 targeted_MS_limma_moderated_t +GM:Symmetric dimethylarginine Symmetric dimethylarginine 2 unknown 0.661078495940456 0.219852850038016 0.279396330256645 0.485114246370737 targeted_MS_limma_moderated_t +GM:Tryptophan Tryptophan 2 unknown -0.719944219470029 0.234804508881 0.295321134881258 0.547851088263981 targeted_MS_limma_moderated_t +GM:3-Hydroxy-D_L-Kynurenine 3-Hydroxy-D_L-Kynurenine 2 unknown 0.808708992445137 0.25528720965965 0.317806526310993 0.633824378551514 targeted_MS_limma_moderated_t +PUFAs:9-KODE 9-KODE 2 unknown 3.32553335110693 0.280412103314114 0.345558349538605 2.76585168138431 targeted_MS_limma_moderated_t +GM:Valine Valine 2 unknown 0.457571941990089 0.318959845635845 0.38913101167573 0.422785055595249 targeted_MS_limma_moderated_t +GM:Threonine Threonine 2 unknown 0.333361013286269 0.348014834398215 0.417204352319124 0.32871184088629 targeted_MS_limma_moderated_t +PUFAs:PGF2a PGF2a 2 unknown 2.56564322348497 0.348810196201235 0.417204352319124 2.53435970271596 targeted_MS_limma_moderated_t +GM:Uracil Uracil 2 unknown 0.478016787848006 0.368088333828254 0.435988123563563 0.49296344776987 targeted_MS_limma_moderated_t +GM:Arginine Arginine 2 unknown -0.343347641276987 0.390173756651507 0.457703829918114 0.372034156841767 targeted_MS_limma_moderated_t +GM:4-Hydroxyproline 4-Hydroxyproline 2 unknown -0.287172539212441 0.410240282685972 0.476660137977986 0.325554745229879 targeted_MS_limma_moderated_t +GM:Lysine Lysine 2 unknown 0.322242341693984 0.415260637207679 0.477941488106952 0.369488294368934 targeted_MS_limma_moderated_t +GM:Glutathione reduced Glutathione reduced 2 unknown 0.279296129562741 0.431048675295593 0.491476059682826 0.331964393808272 targeted_MS_limma_moderated_t +GM:Cytidine monophosphate Cytidine monophosphate 2 unknown -0.175019779689715 0.513120712005549 0.57431859508878 0.252546197930263 targeted_MS_limma_moderated_t +GM:Dopamine Dopamine 2 unknown -0.20972761035129 0.511590862291271 0.57431859508878 0.301492072721354 targeted_MS_limma_moderated_t +NUCs:AMP AMP 2 unknown -0.235070012843192 0.560215785169184 0.621330234460368 0.382258035645825 targeted_MS_limma_moderated_t +NUCs:ADP ADP 2 unknown -0.144356244028679 0.578423697854546 0.635744965209501 0.246401839999929 targeted_MS_limma_moderated_t +NUCs:ATP ATP 2 unknown -0.233852319441281 0.598490027067677 0.651926636627291 0.421802726124555 targeted_MS_limma_moderated_t +GM:2-Aminobutyric acid 2-Aminobutyric acid 2 unknown -0.169482802139229 0.616540352222494 0.665645336027826 0.321822230231077 targeted_MS_limma_moderated_t +PUFAs:AEA AEA 2 unknown 0.367193437224462 0.655922855280618 0.701952529335398 0.785397483516909 targeted_MS_limma_moderated_t +GM:Malic Acid Malic Acid 2 unknown -0.175465622645335 0.684015444657018 0.725651167375271 0.411442242591883 targeted_MS_limma_moderated_t +GM:Anthranilic Acid Anthranilic Acid 2 unknown 0.275213705473952 0.699302278381291 0.735473085883771 0.680444753868484 targeted_MS_limma_moderated_t +GM:Serotonin Serotonin 2 unknown 0.118597781114976 0.712343759171898 0.74278580016215 0.30735653140064 targeted_MS_limma_moderated_t +GM:Phenylalanine Phenylalanine 2 unknown 0.0878290259211732 0.876449207920316 0.906159350561683 0.542382349316447 targeted_MS_limma_moderated_t +GM:Glutathione oxidazed Glutathione oxidazed 2 unknown 0.0383868037274954 0.928885638202189 0.952302923198883 0.413245032309095 targeted_MS_limma_moderated_t +GM:Glycine Glycine 2 unknown -0.0160590479557846 0.957567325221766 0.973526780642129 0.29004713061585 targeted_MS_limma_moderated_t +GM:Argininosuccinic acid Argininosuccinic acid 2 unknown -0.0057015703861044 0.986651378157663 0.986651378157663 0.327520865187038 targeted_MS_limma_moderated_t +GM:Citicoline Citicoline 2 unknown 0.0101381506701546 0.980112828779818 0.986651378157663 0.390872953664547 targeted_MS_limma_moderated_t diff --git a/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolomics_report.html b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolomics_report.html new file mode 100644 index 0000000..df36da7 --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolomics_report.html @@ -0,0 +1,3817 @@ + + + + + + + + + +AREE Metabolomics Workflow Report + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+

AREE Metabolomics Workflow Report

+

DUPERRET2025_POMS_STARVE / starved_vs_fed_0hpc

+
+ + + +
+ + + + +
+ + + +
+ + +
+

Run summary

+

This report was generated by the AREE metabolomics workflow scaffold (workflows/metabolomics/). It is rendered from the standardized feature table and the accompanying provenance manifest — it does not re-derive any numbers, it only visualizes what those two files already contain.

+
    +
  • Study: DUPERRET2025_POMS_STARVE
  • +
  • Comparison: starved_vs_fed_0hpc
  • +
  • Mode: raw_reanalysis
  • +
  • Date generated: 2026-10-16T14:30:03.531649+00:00
  • +
+
+
+

Annotation confidence breakdown

+

Simplified MSI-style scale: 1 = confirmed by standard, 2 = putatively annotated (spectral match), 3 = putative class, 4 = unknown.

+
+
+ + + + + + + + + + + + + +
Annotation confidence levelN features
2122
+
+
+
+
+
+
+

+
+
+
+
+
+
+

Metabolite class summary

+
+
+ + + + + + + + + + + + + +
Metabolite classN features
unknown122
+
+
+
+
+

Normalization / QC metrics (upstream)

+

QC metrics captured from upstream intake/annotation/normalization steps (raw mode) are embedded in the manifest under qc_metrics.upstream_step_qc; in processed-results mode this section is typically empty (see note above).

+
    +
  • N features: 122
  • +
  • N features at annotation confidence 1 or 2: 122 (100%)
  • +
  • Tested 122 of 310 features on 3 vs 3 replicates (units: tank); not tested: 2 detected_too_rarely_in_both_arms, 14 detected_too_rarely_in_control, 23 detected_too_rarely_in_treatment, 149 not_detected (full list in the missingness report)
  • +
  • Normalization: log2_then_internal_standard_per_platform; detection limit 0.001; 2124 value(s) below detection; 10 internal standard(s) excluded from testing
  • +
+
+
+

Volcano plot

+
+
+
+
+

+
+
+
+
+
+
+

Top differential features

+
+
+ +++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
feature_idputative_metabolite_nameannotation_confidence_levelmetabolite_classlog2FCpvaluepadj
PUFAs:AAAA2unknown10.7168830.0e+003.00e-07
PUFAs:Eicosapentaenoic AcidEicosapentaenoic Acid2unknown9.8008520.0e+003.00e-07
PUFAs:DHADHA2unknown10.2675630.0e+003.00e-07
PUFAs:8-HETE8-HETE2unknown6.2888332.0e-075.50e-06
PUFAs:15-HETE15-HETE2unknown5.8035162.0e-075.50e-06
PUFAs:Lyso-PAFLyso-PAF2unknown8.2218103.0e-075.50e-06
PUFAs:12-HEPE12-HEPE2unknown6.6528603.0e-075.50e-06
PUFAs:9-HODE9-HODE2unknown6.8299344.0e-075.60e-06
PUFAs:11-HETE11-HETE2unknown6.1415535.0e-076.10e-06
PUFAs:12-HETE12-HETE2unknown6.1790285.0e-076.10e-06
PUFAs:16-HDoHE16-HDoHE2unknown4.4773981.0e-061.10e-05
PUFAs:20-HDoHE20-HDoHE2unknown5.2505281.2e-061.18e-05
PUFAs:13-HODE13-HODE2unknown7.1660631.3e-061.18e-05
PUFAs:10-HDoHE10-HDoHE2unknown5.0125671.5e-061.33e-05
PUFAs:PGD2PGD22unknown7.8159382.9e-062.34e-05
PUFAs:14-HDoHE14-HDoHE2unknown5.2133723.4e-062.57e-05
PUFAs:18-HEPE18-HEPE2unknown5.1133554.2e-062.94e-05
PUFAs:5-HEPE5-HEPE2unknown5.7917134.4e-062.94e-05
PUFAs:15-HEPE15-HEPE2unknown4.3843234.6e-062.94e-05
PUFAs:PGE2-d4PGE2-d42unknown3.0832265.7e-063.51e-05
+
+
+
+
+

Provenance

+
    +
  • Workflow: aree-metabolomics (0.1.0-scaffold)
  • +
  • Generated by: automated:aree-metabolomics@0.1.0-scaffold
  • +
+
+

This report and the workflow that produced it are part of the AREE (Aquaculture Resilience Evidence Engine) metabolomics scaffold. It is an unexecuted structural template in this build — see workflows/metabolomics/README.md for what has and has not been run.

+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_missingness.tsv b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_missingness.tsv new file mode 100644 index 0000000..88e6c44 --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_missingness.tsv @@ -0,0 +1,311 @@ +feature_id putative_metabolite_name annotation_confidence_level platform n_replicates_control n_detected_control n_replicates_treatment n_detected_treatment status +GM:2-Aminobutyric acid 2-Aminobutyric acid 2 GM 3 3 3 3 tested +GM:2-Ketoglutaric acid 2-Ketoglutaric acid 2 GM 3 0 3 0 not_detected +GM:Taurine Taurine 2 GM 3 3 3 3 tested +GM:3-Hydroxy-D_L-Kynurenine 3-Hydroxy-D_L-Kynurenine 2 GM 3 3 3 2 tested +GM:4-Aminobutyric acid 4-Aminobutyric acid 2 GM 3 3 3 3 tested +GM:4-Hydroxyproline 4-Hydroxyproline 2 GM 3 3 3 3 tested +GM:5-Glutamylcysteine 5-Glutamylcysteine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Acetylcarnitine Acetylcarnitine 2 GM 3 3 3 3 tested +GM:Acetylcholine Acetylcholine 2 GM 3 3 3 3 tested +GM:Aconitic acid Aconitic acid 2 GM 3 0 3 0 not_detected +GM:Adenine Adenine 2 GM 3 3 3 3 tested +GM:Adenosine 3',5'-cyclic monophosphate Adenosine 3',5'-cyclic monophosphate 2 GM 3 3 3 3 tested +GM:Adenosine monophosphate Adenosine monophosphate 2 GM 3 3 3 3 tested +GM:Adenosine Adenosine 2 GM 3 3 3 3 tested +GM:Adenylsuccinic acid Adenylsuccinic acid 2 GM 3 3 3 3 tested +GM:Alanine Alanine 2 GM 3 3 3 3 tested +GM:Allantoin Allantoin 2 GM 3 0 3 0 not_detected +GM:Anthranilic Acid Anthranilic Acid 2 GM 3 3 3 3 tested +GM:Arginine Arginine 2 GM 3 3 3 3 tested +GM:Argininosuccinic acid Argininosuccinic acid 2 GM 3 3 3 3 tested +GM:Asparagine Asparagine 2 GM 3 3 3 3 tested +GM:Aspartic acid Aspartic acid 2 GM 3 3 3 3 tested +GM:Asymmetric dimethylarginine Asymmetric dimethylarginine 2 GM 3 3 3 3 tested +GM:Carnitine Carnitine 2 GM 3 3 3 3 tested +GM:Carnosine Carnosine 2 GM 3 1 3 1 detected_too_rarely_in_both_arms +GM:Cholic Acid (CA) Cholic Acid (CA) 2 GM 3 0 3 0 not_detected +GM:Choline Choline 2 GM 3 3 3 3 tested +GM:Citicoline Citicoline 2 GM 3 3 3 3 tested +GM:Citric Acid Citric Acid 2 GM 3 3 3 3 tested +GM:Citrulline Citrulline 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Creatine Creatine 2 GM 3 3 3 3 tested +GM:Creatinine Creatinine 2 GM 3 3 3 3 tested +GM:Cystathionine Cystathionine 2 GM 3 3 3 3 tested +GM:Cysteamine Cysteamine 2 GM 3 0 3 0 not_detected +GM:Cysteine Cysteine 2 GM 3 3 3 3 tested +GM:Cystine Cystine 2 GM 3 3 3 3 tested +GM:Cytidine 3',5'-cyclic monophosphate Cytidine 3',5'-cyclic monophosphate 2 GM 3 0 3 0 not_detected +GM:Cytidine monophosphate Cytidine monophosphate 2 GM 3 3 3 3 tested +GM:Cytidine Cytidine 2 GM 3 3 3 3 tested +GM:Cytosine Cytosine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Dimethylglycine Dimethylglycine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Dopa Dopa 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Dopamine Dopamine 2 GM 3 3 3 3 tested +GM:Epinephrine Epinephrine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:FAD FAD 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:FMN FMN 2 GM 3 0 3 0 not_detected +GM:Fumaric Acid Fumaric Acid 2 GM 3 3 3 3 tested +GM:Glutamic acid Glutamic acid 2 GM 3 3 3 3 tested +GM:Glutamine Glutamine 2 GM 3 3 3 3 tested +GM:Glutathione oxidazed Glutathione oxidazed 2 GM 3 3 3 3 tested +GM:Glutathione reduced Glutathione reduced 2 GM 3 3 3 3 tested +GM:Glycine Glycine 2 GM 3 3 3 3 tested +GM:Guanine Guanine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Guanosine 3',5'-cyclic monophosphate Guanosine 3',5'-cyclic monophosphate 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Guanosine monophosphate Guanosine monophosphate 2 GM 3 3 3 3 tested +GM:Guanosine Guanosine 2 GM 3 3 3 3 tested +GM:Histamine Histamine 2 GM 3 3 3 3 tested +GM:Histidine Histidine 2 GM 3 3 3 3 tested +GM:Homocysteine Homocysteine 2 GM 3 0 3 0 not_detected +GM:Homocystine Homocystine 2 GM 3 0 3 2 detected_too_rarely_in_control +GM:Hypoxanthine Hypoxanthine 2 GM 3 3 3 3 tested +GM:Inosine Inosine 2 GM 3 3 3 3 tested +GM:Isocitric Acid Isocitric Acid 2 GM 3 0 3 0 not_detected +GM:Isoleucine Isoleucine 2 GM 3 3 3 3 tested +GM:Kynurenic Acid Kynurenic Acid 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Kynurenine Kynurenine 2 GM 3 3 3 3 tested +GM:Lactic Acid Lactic Acid 2 GM 3 3 3 3 tested +GM:Leucine Leucine 2 GM 3 3 3 3 tested +GM:L-Hydroorotic Acid L-Hydroorotic Acid 2 GM 3 0 3 0 not_detected +GM:Lysine Lysine 2 GM 3 3 3 3 tested +GM:Malic Acid Malic Acid 2 GM 3 3 3 3 tested +GM:Methionine sulfone Methionine sulfone 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Methionine sulfoxide Methionine sulfoxide 2 GM 3 3 3 3 tested +GM:Methionine Methionine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:NAD NAD 2 GM 3 3 3 3 tested +GM:Niacinamide Niacinamide 2 GM 3 3 3 3 tested +GM:Nicotinic acid Nicotinic acid 2 GM 3 3 3 3 tested +GM:Norepinephrine Norepinephrine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +GM:Ophthalmic acid Ophthalmic acid 2 GM 3 3 3 3 tested +GM:Ornitine Ornitine 2 GM 3 3 3 3 tested +GM:Orotic Acid Pos Orotic Acid Pos 2 GM 3 0 3 0 not_detected +GM:Pantothenic acid Pantothenic acid 2 GM 3 3 3 3 tested +GM:Phenylalanine Phenylalanine 2 GM 3 3 3 3 tested +GM:Picolinic Acid Picolinic Acid 2 GM 3 0 3 0 not_detected +GM:Proline Proline 2 GM 3 3 3 3 tested +GM:S-Adenosylhomocysteine S-Adenosylhomocysteine 2 GM 3 3 3 3 tested +GM:S-Adenosylmethionine S-Adenosylmethionine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Serine Serine 2 GM 3 3 3 3 tested +GM:Serotonin Serotonin 2 GM 3 3 3 3 tested +GM:Spermidine Spermidine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Spermine Spermine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Succinic acid Succinic acid 2 GM 3 3 3 3 tested +GM:Symmetric dimethylarginine Symmetric dimethylarginine 2 GM 3 3 3 3 tested +GM:Threonine Threonine 2 GM 3 3 3 3 tested +GM:Thymidine Thymidine 2 GM 3 3 3 3 tested +GM:Thymine Thymine 2 GM 3 0 3 3 detected_too_rarely_in_control +GM:Tryptophan Tryptophan 2 GM 3 3 3 3 tested +GM:Tyrosine Tyrosine 2 GM 3 3 3 3 tested +GM:Uracil Uracil 2 GM 3 3 3 3 tested +GM:Uric acid Uric acid 2 GM 3 3 3 3 tested +GM:Uridine Uridine 2 GM 3 3 3 3 tested +GM:Valine Valine 2 GM 3 3 3 3 tested +GM:Xanthine Xanthine 2 GM 3 3 3 0 detected_too_rarely_in_treatment +NUCs:ADP ADP 2 NUCs 3 3 3 3 tested +NUCs:AMP AMP 2 NUCs 3 3 3 3 tested +NUCs:Ap3A_Mono Ap3A_Mono 2 NUCs 3 0 3 0 not_detected +NUCs:Ap3A Ap3A 2 NUCs 3 0 3 0 not_detected +NUCs:Ap4A Ap4A 2 NUCs 3 0 3 0 not_detected +NUCs:ATP ATP 2 NUCs 3 3 3 3 tested +NUCs:CDP CDP 2 NUCs 3 0 3 0 not_detected +NUCs:cGAMP cGAMP 2 NUCs 3 0 3 0 not_detected +NUCs:CMP CMP 2 NUCs 3 0 3 0 not_detected +NUCs:CTP CTP 2 NUCs 3 0 3 0 not_detected +NUCs:dUMP dUMP 2 NUCs 3 0 3 0 not_detected +NUCs:GDP GDP 2 NUCs 3 3 3 3 tested +NUCs:GMP GMP 2 NUCs 3 3 3 3 tested +NUCs:GTP GTP 2 NUCs 3 3 3 3 tested +NUCs:TDP TDP 2 NUCs 3 0 3 0 not_detected +NUCs:TMP TMP 2 NUCs 3 3 3 3 tested +NUCs:TTP TTP 2 NUCs 3 0 3 0 not_detected +NUCs:UDP UDP 2 NUCs 3 3 3 3 tested +NUCs:UMP UMP 2 NUCs 3 3 3 3 tested +NUCs:UTP UTP 2 NUCs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:10,17-DiHDoHE 10,17-DiHDoHE 2 PUFAs 3 0 3 0 not_detected +PUFAs:10-HDoHE 10-HDoHE 2 PUFAs 3 3 3 3 tested +PUFAs:11,12-DHET 11,12-DHET 2 PUFAs 3 0 3 0 not_detected +PUFAs:11,12-EET 11,12-EET 2 PUFAs 3 0 3 0 not_detected +PUFAs:11,12-EET-EA 11,12-EET-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:11-beta-13,14-dihydro-15-keto-PGF2a 11-beta-13,14-dihydro-15-keto-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:11-beta-PGF2a 11-beta-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:11-dehydro-TXB2 11-dehydro-TXB2 2 PUFAs 3 0 3 0 not_detected +PUFAs:11-HDoHE 11-HDoHE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:11-HETE 11-HETE 2 PUFAs 3 3 3 3 tested +PUFAs:11-trans-LTC4 11-trans-LTC4 2 PUFAs 3 0 3 0 not_detected +PUFAs:11-trans-LTE4 11-trans-LTE4 2 PUFAs 3 0 3 0 not_detected +PUFAs:12,13-DiHOME 12,13-DiHOME 2 PUFAs 3 0 3 0 not_detected +PUFAs:12,13-EpOME 12,13-EpOME 2 PUFAs 3 0 3 0 not_detected +PUFAs:12-HEPE 12-HEPE 2 PUFAs 3 3 3 3 tested +PUFAs:12-HETE 12-HETE 2 PUFAs 3 3 3 3 tested +PUFAs:12-HHT 12-HHT 2 PUFAs 3 0 3 0 not_detected +PUFAs:12-HpEPE 12-HpEPE 2 PUFAs 3 0 3 0 not_detected +PUFAs:12-HpETE 12-HpETE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:12-KETE 12-KETE 2 PUFAs 3 3 3 2 tested +PUFAs:12-keto-LTB4 12-keto-LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto PGJ2 13,14-dihydro-15-keto PGJ2 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-PGD2 13,14-dihydro-15-keto-PGD2 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-PGE2 13,14-dihydro-15-keto-PGE2 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-PGF2a 13,14-dihydro-15-keto-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-tetranor-PGD2 13,14-dihydro-15-keto-tetranor-PGD2 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-tetranor-PGE2 13,14-dihydro-15-keto-tetranor-PGE2 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-tetranor-PGF1a 13,14-dihydro-15-keto-tetranor-PGF1a 2 PUFAs 3 0 3 0 not_detected +PUFAs:13,14-dihydro-15-keto-tetranor-PGF1b 13,14-dihydro-15-keto-tetranor-PGF1b 2 PUFAs 3 0 3 0 not_detected +PUFAs:13-HDoHE 13-HDoHE 2 PUFAs 3 3 3 2 tested +PUFAs:13-HODE 13-HODE 2 PUFAs 3 3 3 3 tested +PUFAs:13-HOTrE 13-HOTrE 2 PUFAs 3 0 3 0 not_detected +PUFAs:13-HpODE 13-HpODE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:13-KODE 13-KODE 2 PUFAs 3 3 3 3 tested +PUFAs:14,15-DHET 14,15-DHET 2 PUFAs 3 0 3 0 not_detected +PUFAs:14,15-DiHETE 14,15-DiHETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:14,15-EET 14,15-EET 2 PUFAs 3 0 3 0 not_detected +PUFAs:14,15-EET-EA 14,15-EET-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:14,15-LTC4 14,15-LTC4 2 PUFAs 3 0 3 0 not_detected +PUFAs:14,15-LTE4 14,15-LTE4 2 PUFAs 3 0 3 0 not_detected +PUFAs:14-HDoHE 14-HDoHE 2 PUFAs 3 3 3 3 tested +PUFAs:15-deoxy-delta-12,14-PGJ2 15-deoxy-delta-12,14-PGJ2 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-HEDE 15-HEDE 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-HEPE 15-HEPE 2 PUFAs 3 3 3 3 tested +PUFAs:15-HETE 15-HETE 2 PUFAs 3 3 3 3 tested +PUFAs:15-HETE-d8-not present in the mix 15-HETE-d8-not present in the mix 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-HETrE 15-HETrE 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-HpEPE 15-HpEPE 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-HpETE 15-HpETE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:15-KEDE 15-KEDE 2 PUFAs 3 0 3 3 detected_too_rarely_in_control +PUFAs:15-keto-PGE2 15-keto-PGE2 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-keto-PGF2a 15-keto-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:16-HDoHE 16-HDoHE 2 PUFAs 3 3 3 3 tested +PUFAs:16-HETE 16-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:17,18-DiHETE 17,18-DiHETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:17,18-EpETE 17,18-EpETE 2 PUFAs 3 3 3 3 tested +PUFAs:17-HDoHE 17-HDoHE 2 PUFAs 3 0 3 0 not_detected +PUFAs:17-HETE 17-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:18-carboxy-dinor-LTB4 18-carboxy-dinor-LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:18-HEPE 18-HEPE 2 PUFAs 3 3 3 3 tested +PUFAs:18-HETE 18-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:19-HETE 19-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:1a1b-dihomo-PGF2a 1a1b-dihomo-PGF2a 2 PUFAs 3 0 3 3 detected_too_rarely_in_control +PUFAs:2,3-dinor-8-iso-PGF2a 2,3-dinor-8-iso-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-carboxy-AA 20-carboxy-AA 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-carboxy-LTB4 20-carboxy-LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-HDoHE 20-HDoHE 2 PUFAs 3 3 3 3 tested +PUFAs:20-HETE 20-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-hydroxy-LTB4 20-hydroxy-LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-hydroxy-PGE2 20-hydroxy-PGE2 2 PUFAs 3 0 3 0 not_detected +PUFAs:20-hydroxy-PGF2a 20-hydroxy-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:4-HDoHE 4-HDoHE 2 PUFAs 3 3 3 1 detected_too_rarely_in_treatment +PUFAs:5,15-DiHETE 5,15-DiHETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:5,6-DHET 5,6-DHET 2 PUFAs 3 0 3 0 not_detected +PUFAs:5,6-DHET-lactone 5,6-DHET-lactone 2 PUFAs 3 0 3 0 not_detected +PUFAs:5,6-DiHETE 5,6-DiHETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:5,6-EET 5,6-EET 2 PUFAs 3 0 3 0 not_detected +PUFAs:5,6-EET-EA 5,6-EET-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:5-HEPE 5-HEPE 2 PUFAs 3 3 3 3 tested +PUFAs:5-HETE 5-HETE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:5-HETE-d8 5-HETE-d8 2 PUFAs 3 0 3 0 not_detected +PUFAs:5-HpEPE 5-HpEPE 2 PUFAs 3 0 3 0 not_detected +PUFAs:5-HpETE 5-HpETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:5-iPF2a-VI 5-iPF2a-VI 2 PUFAs 3 0 3 0 not_detected +PUFAs:5-KETE 5-KETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:5S,14R-LXB4 5S,14R-LXB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:5S,6R-LXA4 5S,6R-LXA4 2 PUFAs 3 0 3 0 not_detected +PUFAs:5S,6S-LXA4 5S,6S-LXA4 2 PUFAs 3 0 3 0 not_detected +PUFAs:6,15-diketo-13,14-dihydro-PGF1a 6,15-diketo-13,14-dihydro-PGF1a 2 PUFAs 3 0 3 0 not_detected +PUFAs:6-keto-PGF1a 6-keto-PGF1a 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:6-trans-LTB4 6-trans-LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:7,17-hydroxy-DPA 7,17-hydroxy-DPA 2 PUFAs 3 0 3 0 not_detected +PUFAs:7-HDoHE 7-HDoHE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:8,12-iso-iPF2a-VI-1,5-lactone 8,12-iso-iPF2a-VI-1,5-lactone 2 PUFAs 3 0 3 0 not_detected +PUFAs:8,15-DiHETE 8,15-DiHETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:8,9-DHET 8,9-DHET 2 PUFAs 3 0 3 0 not_detected +PUFAs:8,9-EET 8,9-EET 2 PUFAs 3 0 3 0 not_detected +PUFAs:8,9-EET-EA 8,9-EET-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-HDoHE 8-HDoHE 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-HETE 8-HETE 2 PUFAs 3 3 3 3 tested +PUFAs:8-iso-13,14-dihydro-15-keto-PGF2a 8-iso-13,14-dihydro-15-keto-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-15(R)-PGF2a 8-iso-15(R)-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-15-keto-PGF2a 8-iso-15-keto-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGA1 8-iso-PGA1 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGA2 8-iso-PGA2 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGE1 8-iso-PGE1 2 PUFAs 3 0 3 1 detected_too_rarely_in_both_arms +PUFAs:8-iso-PGE2 8-iso-PGE2 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGF1a 8-iso-PGF1a 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGF2a 8-iso-PGF2a 2 PUFAs 3 0 3 0 not_detected +PUFAs:8-iso-PGF3a 8-iso-PGF3a 2 PUFAs 3 0 3 0 not_detected +PUFAs:9,10-DiHOME 9,10-DiHOME 2 PUFAs 3 0 3 0 not_detected +PUFAs:9,10-EpOME 9,10-EpOME 2 PUFAs 3 0 3 0 not_detected +PUFAs:9-HETE 9-HETE 2 PUFAs 3 0 3 0 not_detected +PUFAs:9-HODE 9-HODE 2 PUFAs 3 3 3 3 tested +PUFAs:9-HOTrE 9-HOTrE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:9-HpODE 9-HpODE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:9-KODE 9-KODE 2 PUFAs 3 3 3 2 tested +PUFAs:AA AA 2 PUFAs 3 3 3 3 tested +PUFAs:AA-d8 AA-d8 2 PUFAs 3 0 3 0 not_detected +PUFAs:15-KETE 15-KETE 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:PGH2 PGH2 2 PUFAs 3 3 3 3 tested +PUFAs:Adrenic Acid Adrenic Acid 2 PUFAs 3 0 3 0 not_detected +PUFAs:AEA AEA 2 PUFAs 3 3 3 3 tested +PUFAs:Azelaoyl-PAF Azelaoyl-PAF 2 PUFAs 3 0 3 2 detected_too_rarely_in_control +PUFAs:PGI2 PGI2 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:DHA-d5 DHA-d5 2 PUFAs 3 0 3 0 not_detected +PUFAs:Dihomo-gamma-Linoleic Acid Dihomo-gamma-Linoleic Acid 2 PUFAs 3 0 3 0 not_detected +PUFAs:DHA DHA 2 PUFAs 3 3 3 3 tested +PUFAs:Docosapentaenoic Acid Docosapentaenoic Acid 2 PUFAs 3 0 3 0 not_detected +PUFAs:Eicosapentaenoic Acid Eicosapentaenoic Acid 2 PUFAs 3 3 3 3 tested +PUFAs:EPA-d5 EPA-d5 2 PUFAs 3 0 3 0 not_detected +PUFAs:iPF2a-IV iPF2a-IV 2 PUFAs 3 0 3 0 not_detected +PUFAs:Linoleic Acid Linoleic Acid 2 PUFAs 3 0 3 0 not_detected +PUFAs:Linolenic Acid Linolenic Acid 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTB4 LTB4 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTB4-EA LTB4-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTC4 LTC4 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTC4-d5 LTC4-d5 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTD4 LTD4 2 PUFAs 3 0 3 0 not_detected +PUFAs:LTE4 LTE4 2 PUFAs 3 0 3 3 detected_too_rarely_in_control +PUFAs:LTF4 LTF4 2 PUFAs 3 0 3 0 not_detected +PUFAs:LXA5 LXA5 2 PUFAs 3 0 3 0 not_detected +PUFAs:Lyso-PAF Lyso-PAF 2 PUFAs 3 3 3 3 tested +PUFAs:Maresin1 Maresin1 2 PUFAs 3 0 3 0 not_detected +PUFAs:N-acetyl-LTE4 N-acetyl-LTE4 2 PUFAs 3 0 3 0 not_detected +PUFAs:OEA OEA 2 PUFAs 3 3 3 2 tested +PUFAs:PAF PAF 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGA1 PGA1 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGA2 PGA2 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGB2 PGB2 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGD1 PGD1 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGD2 PGD2 2 PUFAs 3 3 3 3 tested +PUFAs:PGD2-EA PGD2-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGD3 PGD3 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGE1 PGE1 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGE1-EA PGE1-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGE2 PGE2 2 PUFAs 3 3 3 3 tested +PUFAs:PGE2-d4 PGE2-d4 2 PUFAs 3 3 3 3 tested +PUFAs:PGE2-EA PGE2-EA 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGE3 PGE3 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGF2a PGF2a 2 PUFAs 3 3 3 3 tested +PUFAs:PGF2a-d4 PGF2a-d4 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGF2a-EA PGF2a-EA 2 PUFAs 3 3 3 0 detected_too_rarely_in_treatment +PUFAs:PGF3a PGF3a 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGJ2 PGJ2 2 PUFAs 3 0 3 0 not_detected +PUFAs:PGK2 PGK2 2 PUFAs 3 0 3 0 not_detected +PUFAs:Resolvin D1 Resolvin D1 2 PUFAs 3 0 3 0 not_detected +PUFAs:Resolvin D2 Resolvin D2 2 PUFAs 3 0 3 0 not_detected +PUFAs:Stearidonic Acid Stearidonic Acid 2 PUFAs 3 3 3 3 tested +PUFAs:tetranor-PGDM tetranor-PGDM 2 PUFAs 3 0 3 0 not_detected +PUFAs:tetranor-PGEM tetranor-PGEM 2 PUFAs 3 0 3 0 not_detected +PUFAs:tetranor-PGEM-d6 tetranor-PGEM-d6 2 PUFAs 3 0 3 0 not_detected +PUFAs:tetranor-PGFM tetranor-PGFM 2 PUFAs 3 0 3 0 not_detected +PUFAs:TXB1 TXB1 2 PUFAs 3 0 3 0 not_detected +PUFAs:TXB2 TXB2 2 PUFAs 3 0 3 0 not_detected +PUFAs:TXB3 TXB3 2 PUFAs 3 0 3 0 not_detected +TCA:Alpha-ketoglutaric acid Alpha-ketoglutaric acid 2 TCA 3 3 3 3 tested +TCA:Aspartic acid Aspartic acid 2 TCA 3 3 3 3 tested +TCA:Citric acid Citric acid 2 TCA 3 3 3 3 tested +TCA:Fumaric acid Fumaric acid 2 TCA 3 3 3 3 tested +TCA:Glutamic acid Glutamic acid 2 TCA 3 3 3 3 tested +TCA:L-proline L-proline 2 TCA 3 3 3 3 tested +TCA:L-serine 1 L-serine 1 2 TCA 3 3 3 3 tested +TCA:Malic acid Malic acid 2 TCA 3 3 3 3 tested +TCA:Succinic acid Succinic acid 2 TCA 3 3 3 3 tested +TCA:Threonine Threonine 2 TCA 3 3 3 3 tested +TCA:Valine Valine 2 TCA 3 3 3 3 tested diff --git a/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_workflow_manifest.json b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_workflow_manifest.json new file mode 100644 index 0000000..96ff6fa --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_workflow_manifest.json @@ -0,0 +1,214 @@ +{ + "comparison_id": "starved_vs_fed_0hpc", + "container_engine": null, + "date_generated": "2026-10-16T14:30:03.531649+00:00", + "generated_by": "automated:aree-metabolomics@0.1.0-scaffold", + "input_checksums_sha256": { + "DUPERRET2025_POMS_STARVE_features.tsv": "50d484845bb175015205ff70cb5c488a628ee15efa249a2c3f6d6351f2dd2850", + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_metabolite_features_standardized.tsv": "e8c9bdf4f74f34923f6fedefb476e628986a7f33784e5a4a177c937ed2d7af9b", + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_samplesheet.tsv": "54c3d1973e47f1915ada7a64874eb83d98dc8aca944f89f102f246596736c52c" + }, + "mode": "raw_reanalysis", + "parameters": { + "metabolomics": { + "acquisition": "targeted", + "comparison_id": "starved_vs_fed_0hpc", + "detection_limit": "0.001", + "metabolite_annotation_map": null, + "metabolite_class_map": null, + "min_detected_per_arm": 2, + "normalization": "internal_standard", + "processed_results": null, + "qc_cv_threshold": 0.3, + "raw_feature_table": "/private/tmp/claude-501/-Users-sr320-Documents-GitHub-AREE/da27bc79-7896-49a5-a57e-211d9b51e10b/scratchpad/duperret_staging/DUPERRET2025_POMS_STARVE_features.tsv", + "replicate_unit": "tank", + "sample_sheet": "/private/tmp/claude-501/-Users-sr320-Documents-GitHub-AREE/da27bc79-7896-49a5-a57e-211d9b51e10b/scratchpad/duperret_staging/DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_samplesheet.tsv", + "study_id": "DUPERRET2025_POMS_STARVE" + }, + "mode": "raw_reanalysis" + }, + "provenance_level": "infra-level (see docs/design.md section 4); per-row evidence-level provenance is stamped separately by src/harmonize/metabolomics.py", + "qc_metrics": { + "n_annotation_confidence_level_1_or_2": 122, + "n_features": 122, + "pct_annotation_confidence_level_1_or_2": 100.0, + "upstream_step_qc": { + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_annotation_qc.json": { + "comparison_id": "starved_vs_fed_0hpc", + "level_counts": { + "2": 320 + }, + "n_confidence_from_annotation_map": 0, + "n_confidence_from_input_table": 320, + "n_defaulted_to_unknown_level_4": 0, + "n_features": 320, + "study_id": "DUPERRET2025_POMS_STARVE" + }, + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_diffabundance_qc.json": { + "analysis_method": "targeted_MS_limma_moderated_t", + "comparison_id": "starved_vs_fed_0hpc", + "limma_df_prior": 2.2742, + "min_detected_per_arm": 2, + "n_features_in": 310, + "n_features_not_tested": { + "detected_too_rarely_in_both_arms": 2, + "detected_too_rarely_in_control": 14, + "detected_too_rarely_in_treatment": 23, + "not_detected": 149 + }, + "n_features_tested": 122, + "n_padj_below_0.05": 68, + "n_replicates_control": 3, + "n_replicates_treatment": 3, + "replicate_unit": "tank", + "study_id": "DUPERRET2025_POMS_STARVE" + }, + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_intake_qc.json": { + "comparison_id": "starved_vs_fed_0hpc", + "n_features_in": 320, + "n_features_out": 320, + "n_intensity_values_coerced_to_nan": 0, + "n_qc_pool_samples": 0, + "n_samples": 12, + "study_id": "DUPERRET2025_POMS_STARVE", + "warnings": [] + }, + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_normalization_qc.json": { + "comparison_id": "starved_vs_fed_0hpc", + "detection_limit": 0.001, + "internal_standards": [ + "GM:2-Morpholinoethansulfonic Acid", + "NUCs:MES", + "PUFAs:12-HETE-d8", + "PUFAs:6-keto-PGF1a-d4", + "PUFAs:LTB4 d4", + "PUFAs:OEA-d4", + "PUFAs:PAF-d4", + "PUFAs:PGD2-d4", + "PUFAs:TXB2-d4", + "TCA:d27-Myristic acid" + ], + "n_features": 310, + "n_internal_standards_excluded": 10, + "n_samples_normalized": 12, + "n_values_below_detection": 2124, + "normalization_method": "log2_then_internal_standard_per_platform", + "qc_pool_metric": { + "cv_threshold": 0.3, + "n_features_passing_cv_threshold": "not_applicable", + "n_qc_pool_samples": 0, + "note": "fewer than 2 QC pooled samples available; pooled-sample CV QC not computed", + "pct_features_passing_cv_threshold": "not_applicable" + }, + "sample_scaling": { + "GM": { + "F11N-3-0-1": 0.890623, + "F11N-3-0-2": 0.923147, + "F11N-3-0-3": 0.788103, + "F11N-5-0-1": -1.130991, + "F11N-5-0-2": -0.600499, + "F11N-5-0-3": -0.56437, + "F14R-3-0-1": 1.135785, + "F14R-3-0-2": 0.738342, + "F14R-3-0-3": 0.739291, + "F14R-5-0-1": -0.458354, + "F14R-5-0-2": -1.712521, + "F14R-5-0-3": -0.748556 + }, + "NUCs": { + "F11N-3-0-1": -0.591641, + "F11N-3-0-2": -0.520478, + "F11N-3-0-3": -0.607879, + "F11N-5-0-1": 0.041641, + "F11N-5-0-2": 0.443017, + "F11N-5-0-3": 0.787359, + "F14R-3-0-1": -0.404634, + "F14R-3-0-2": -0.278673, + "F14R-3-0-3": -0.059998, + "F14R-5-0-1": 0.722384, + "F14R-5-0-2": -0.036222, + "F14R-5-0-3": 0.505124 + }, + "PUFAs": { + "F11N-3-0-1": 0.102382, + "F11N-3-0-2": 0.179724, + "F11N-3-0-3": 0.21972, + "F11N-5-0-1": -0.100647, + "F11N-5-0-2": -0.285857, + "F11N-5-0-3": -0.045098, + "F14R-3-0-1": 0.214262, + "F14R-3-0-2": 0.296287, + "F14R-3-0-3": 0.353261, + "F14R-5-0-1": -0.391221, + "F14R-5-0-2": -0.314716, + "F14R-5-0-3": -0.228097 + }, + "TCA": { + "F11N-3-0-1": 1.382674, + "F11N-3-0-2": 1.071901, + "F11N-3-0-3": 1.065395, + "F11N-5-0-1": -0.73956, + "F11N-5-0-2": -1.328085, + "F11N-5-0-3": -1.076107, + "F14R-3-0-1": 1.211194, + "F14R-3-0-2": 0.347044, + "F14R-3-0-3": 0.826102, + "F14R-5-0-1": -0.183821, + "F14R-5-0-2": -1.186918, + "F14R-5-0-3": -1.389821 + } + }, + "study_id": "DUPERRET2025_POMS_STARVE" + }, + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_pathway_mapping_qc.json": { + "comparison_id": "starved_vs_fed_0hpc", + "metabolite_class_counts": { + "unknown": 122 + }, + "metabolite_class_map_used": null, + "n_features": 122, + "n_matched_via_map": 0, + "n_unmatched_defaulted_to_unknown": 122, + "study_id": "DUPERRET2025_POMS_STARVE" + } + } + }, + "software_versions": { + "ANNOTATION_CONFIDENCE": { + "pandas": "2.3.3", + "python": "3.9.6" + }, + "DIFFERENTIAL_ABUNDANCE": { + "bioconductor-limma": "3.58.1", + "r-base": "4.3.2", + "r-jsonlite": "1.8.9" + }, + "EMIT_MANIFEST": { + "python": "3.9.6" + }, + "FEATURE_TABLE_INTAKE": { + "pandas": "2.3.3", + "python": "3.9.6" + }, + "NORMALIZE_QC": { + "numpy": "2.0.2", + "pandas": "2.3.3", + "python": "3.9.6" + }, + "PATHWAY_MAPPING": { + "pandas": "2.3.3", + "python": "3.9.6" + }, + "STANDARDIZE_OUTPUT": { + "pandas": "2.3.3", + "python": "3.9.6" + } + }, + "software_versions_not_captured": { + "RENDER_REPORT": "renders this manifest, so it runs afterwards" + }, + "study_id": "DUPERRET2025_POMS_STARVE", + "warnings": [], + "workflow_name": "aree-metabolomics", + "workflow_version": "0.1.0-scaffold" +} \ No newline at end of file diff --git a/data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py b/data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py new file mode 100644 index 0000000..de0f9c6 --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py @@ -0,0 +1,200 @@ +"""Build the metabolomics workflow inputs for DUPERRET2025_POMS_STARVE from Table S12. + +MetaboLights MTBLS13313 has no abundance values (its MAFs are empty), but the +paper's Table S12 (mmc13.xlsx, "Raw metabolomic data") holds per-sample peak +areas for all four targeted platforms. The paper is CC BY-NC-ND 4.0, so the +table is NOT committed: this script fetches the supplement from Europe PMC, +checks its SHA-256, and writes the workflow inputs to a staging directory. +What is committed is this script and the provenance JSON it writes. + + python -I data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py --download STAGING_DIR + +writes, in STAGING_DIR: + + mmc13.xlsx the supplement, checksum-verified + DUPERRET2025_POMS_STARVE_features.tsv feature x sample peak areas, 48 samples + DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_samplesheet.tsv + the 12 samples of the 0 hpc contrast + +and data/studies/DUPERRET2025_POMS_STARVE/table_s12_provenance.json. + +The reshaping is mechanical. Values are copied unchanged, including the 0.0001 +and 0 below-detection placeholders (blank cells stay missing): the workflow's --metabolomics.detection_limit +turns them into missing values. Internal standards are the rows the authors +filled green ("In green are the internal standard"); the fill and a list of +the expected names must agree, or the script stops. +""" +from __future__ import annotations + +import argparse +import hashlib +import io +import json +import sys +import urllib.request +import zipfile +from datetime import date +from pathlib import Path + +import openpyxl +import pandas as pd + +STUDY_ID = "DUPERRET2025_POMS_STARVE" +COMPARISON_ID = "starved_vs_fed_0hpc" +HERE = Path(__file__).resolve().parent + +SUPPLEMENT_URL = "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC12803857/supplementaryFiles" +MEMBER = "mmc13.xlsx" +SHA256 = "451eb13e2da9db56ac984ee432632af2ced6ef9fc483183c62ba38c7c7f9c61d" + +# Block header in Table S12 -> platform code used in the registry and sample sheet. +PLATFORMS = { + "General Metabolites": "GM", + "Nucleotides": "NUCs", + "PUFAs": "PUFAs", + "Krebs cycle": "TCA", +} +# The ten green rows, per the Methods (MES and the PUFA ISTD mix in the +# extraction solvent; d27-myristic acid for GC-MS). +INTERNAL_STANDARDS = { + ("GM", "2-Morpholinoethansulfonic Acid"), + ("NUCs", "MES"), + ("PUFAs", "12-HETE-d8"), ("PUFAs", "6-keto-PGF1a-d4"), ("PUFAs", "LTB4 d4"), + ("PUFAs", "OEA-d4"), ("PUFAs", "PAF-d4"), ("PUFAs", "PGD2-d4"), ("PUFAs", "TXB2-d4"), + ("TCA", "d27-Myristic acid"), +} +# Named by the targeted dMRM / GC-MS method; the deposit confirms no identity +# against an authentic standard and gives no database identifier, so MSI +# level 2 (putatively annotated) rather than 1. +ANNOTATION_LEVEL = 2 + + +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def download(staging: Path) -> Path: + with urllib.request.urlopen(SUPPLEMENT_URL, timeout=120) as resp: + archive = zipfile.ZipFile(io.BytesIO(resp.read())) + out = staging / MEMBER + out.write_bytes(archive.read(MEMBER)) + return out + + +def _is_green(cell) -> bool: + fill = cell.fill + return fill.fill_type == "solid" and fill.fgColor.type == "theme" + + +def parse_table_s12(path: Path) -> pd.DataFrame: + ws = openpyxl.load_workbook(path).worksheets[0] + rows, platform, samples = [], None, None + for row in ws.iter_rows(): + name = row[0].value + values = [c.value for c in row[1:]] + if name in PLATFORMS: + platform = PLATFORMS[name] + samples = [v for v in values if v] + continue + if platform is None or name is None or values[0] == "Area": + continue + areas = values[: len(samples)] + # A blank cell is missing (TXB3 has three, in 12 hpc samples), never 0. + if not all(v is None or isinstance(v, (int, float)) for v in areas): + raise SystemExit(f"{platform} {name!r}: non-numeric peak area") + areas = [float("nan") if v is None else v for v in areas] + rows.append({ + "feature_id": f"{platform}:{name}", + "putative_metabolite_name": str(name).strip(), + "annotation_confidence_level": ANNOTATION_LEVEL, + "platform": platform, + "is_internal_standard": _is_green(row[0]), + **dict(zip(samples, areas)), + }) + df = pd.DataFrame(rows) + flagged = {(r.platform, r.putative_metabolite_name) for r in df.itertuples() if r.is_internal_standard} + if flagged != INTERNAL_STANDARDS: + raise SystemExit(f"green rows {sorted(flagged)} differ from the expected internal standards") + if df["feature_id"].duplicated().any(): + raise SystemExit(f"duplicate features: {df.loc[df.feature_id.duplicated(), 'feature_id'].tolist()}") + return df + + +def comparison_sheet() -> pd.DataFrame: + """The 12 samples of starved_vs_fed_0hpc, with the tank as replicate unit. + + Replicate n is the tank (inferred, as for DUPERRET2025_STARVE_RNASEQ): each + diet had three tanks holding both families. + """ + sheet = pd.read_csv(HERE / "samplesheet.tsv", sep="\t", dtype=str) + sheet = sheet[sheet["timepoint_hpc"] == "0"].copy() + sheet["source_condition"] = sheet["condition"] + sheet["condition"] = sheet["condition"].map({"fed": "control", "starved": "treatment"}) + sheet["tank"] = sheet["source_condition"] + "_t" + sheet["replicate"] + return sheet[["sample_id", "condition", "source_condition", "family", "tank"]] + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("staging", type=Path, help="directory for the supplement and workflow inputs") + ap.add_argument("--download", action="store_true", help=f"fetch {MEMBER} from Europe PMC first") + args = ap.parse_args(argv) + args.staging.mkdir(parents=True, exist_ok=True) + + source = download(args.staging) if args.download else args.staging / MEMBER + if _sha256(source) != SHA256: + raise SystemExit(f"{source}: SHA-256 {_sha256(source)} != expected {SHA256}") + + features = parse_table_s12(source) + sheet = comparison_sheet() + registered = pd.read_csv(HERE / "samplesheet.tsv", sep="\t", dtype=str)["sample_id"] + sample_cols = [c for c in features.columns if c in set(registered)] + if sorted(sample_cols) != sorted(registered): + raise SystemExit("Table S12 sample columns do not match samplesheet.tsv") + + feat_path = args.staging / f"{STUDY_ID}_features.tsv" + sheet_path = args.staging / f"{STUDY_ID}_{COMPARISON_ID}_samplesheet.tsv" + features.to_csv(feat_path, sep="\t", index=False) + sheet.to_csv(sheet_path, sep="\t", index=False) + + metabolites = features[~features["is_internal_standard"]] + areas = metabolites[sample_cols] + provenance = { + "study_id": STUDY_ID, + "date_generated": date.today().isoformat(), + "converter": "data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py", + "source": { + "description": "Table S12. Raw metabolomic data: General Metabolites, Nucleotides, " + "PUFAs and Krebs cycle (peak areas)", + "file": MEMBER, + "url": SUPPLEMENT_URL, + "article": "https://doi.org/10.1016/j.isci.2025.114333 (PMC12803857)", + "license": "CC BY-NC-ND 4.0: not redistributed; fetched and checksum-verified by this script", + "sha256": SHA256, + }, + "outputs_sha256": {feat_path.name: _sha256(feat_path), sheet_path.name: _sha256(sheet_path)}, + "n_samples": len(sample_cols), + "n_features": int(len(features)), + "n_internal_standards": int(features["is_internal_standard"].sum()), + "internal_standards": sorted(features.loc[features.is_internal_standard, "feature_id"]), + "n_metabolites_by_platform": metabolites.groupby("platform").size().to_dict(), + "n_metabolite_values_at_or_below_0.001": int((areas <= 0.001).sum().sum()), + "n_metabolite_values": int(areas.size), + "blank_cells": {fid: [c for c in sample_cols if pd.isna(row[c])] + for fid, row in metabolites.set_index("feature_id").iterrows() + if row[sample_cols].isna().any()}, + "annotation_confidence_level": ANNOTATION_LEVEL, + "comparison": { + "comparison_id": COMPARISON_ID, + "samples": sheet["sample_id"].tolist(), + "replicate_unit": "tank (= _t; inferred, as in DUPERRET2025_STARVE_RNASEQ)", + }, + } + (HERE / "table_s12_provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") + print(f"{len(features)} features ({provenance['n_internal_standards']} internal standards) x " + f"{len(sample_cols)} samples -> {feat_path}; {len(sheet)} samples -> {sheet_path}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/data/studies/DUPERRET2025_POMS_STARVE/normalization_sensitivity.tsv b/data/studies/DUPERRET2025_POMS_STARVE/normalization_sensitivity.tsv new file mode 100644 index 0000000..cf70fbd --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/normalization_sensitivity.tsv @@ -0,0 +1,123 @@ +feature_id platform putative_metabolite_name log2FC_internal_standard padj_internal_standard log2FC_median padj_median same_direction significant_under_both +GM:2-Aminobutyric acid GM 2-Aminobutyric acid -0.1695 0.6656 -1.2974 0.002359 True False +GM:3-Hydroxy-D_L-Kynurenine GM 3-Hydroxy-D_L-Kynurenine 0.8087 0.3178 -0.6937 0.05426 False False +GM:4-Aminobutyric acid GM 4-Aminobutyric acid 3.2121 0.0002672 2.0842 0.00159 True True +GM:4-Hydroxyproline GM 4-Hydroxyproline -0.2872 0.4767 -1.4151 0.003795 True False +GM:Acetylcarnitine GM Acetylcarnitine 1.5724 0.007338 0.4445 0.2125 True False +GM:Acetylcholine GM Acetylcholine 1.142 0.03282 0.014 0.9581 True False +GM:Adenine GM Adenine 2.9409 0.003061 1.5263 0.0006788 True True +GM:Adenosine GM Adenosine 3.9301 0.0006878 2.8022 5.911e-05 True True +GM:Adenosine 3',5'-cyclic monophosphate GM Adenosine 3',5'-cyclic monophosphate 2.2532 0.001305 1.1253 0.002838 True True +GM:Adenosine monophosphate GM Adenosine monophosphate 1.0761 0.1939 -0.0518 0.9053 False False +GM:Adenylsuccinic acid GM Adenylsuccinic acid 3.2524 0.002356 2.1245 0.0009323 True True +GM:Alanine GM Alanine -0.5879 0.2037 -1.7159 0.0004136 True False +GM:Anthranilic Acid GM Anthranilic Acid 0.2752 0.7355 -1.1578 0.002503 False False +GM:Arginine GM Arginine -0.3433 0.4577 -1.4713 0.0006788 True False +GM:Argininosuccinic acid GM Argininosuccinic acid -0.0057 0.9867 -1.1336 0.02855 True False +GM:Asparagine GM Asparagine -1.0305 0.03612 -2.1584 0.0002201 True True +GM:Aspartic acid GM Aspartic acid 0.7605 0.04802 -0.3674 0.3233 False False +GM:Asymmetric dimethylarginine GM Asymmetric dimethylarginine 0.7212 0.236 -0.4068 0.1687 False False +GM:Carnitine GM Carnitine 1.2417 0.01346 0.1137 0.7184 True False +GM:Choline GM Choline 0.7579 0.1405 -0.37 0.1829 False False +GM:Citicoline GM Citicoline 0.0101 0.9867 -1.1178 0.001663 False False +GM:Citric Acid GM Citric Acid 1.3876 0.05346 0.2597 0.6697 True False +GM:Creatine GM Creatine 1.979 0.0292 0.7022 0.2686 True False +GM:Creatinine GM Creatinine 2.6473 0.02328 1.5193 0.04486 True True +GM:Cystathionine GM Cystathionine -1.1807 0.01351 -2.3086 0.003081 True True +GM:Cysteine GM Cysteine 1.1841 0.04625 0.0561 0.8308 True False +GM:Cystine GM Cystine -0.693 0.1881 -1.821 0.0001832 True False +GM:Cytidine GM Cytidine 1.3368 0.01573 0.2088 0.4348 True False +GM:Cytidine monophosphate GM Cytidine monophosphate -0.175 0.5743 -1.303 0.007266 True False +GM:Dopamine GM Dopamine -0.2097 0.5743 -1.3377 0.006122 True False +GM:Fumaric Acid GM Fumaric Acid -2.8054 0.0005171 -3.6466 0.0002068 True True +GM:Glutamic acid GM Glutamic acid -3.4858 5.148e-05 -4.6138 5.47e-06 True True +GM:Glutamine GM Glutamine -1.9414 0.003983 -3.0693 1.224e-05 True True +GM:Glutathione oxidazed GM Glutathione oxidazed 0.0384 0.9523 -1.0896 0.006015 False False +GM:Glutathione reduced GM Glutathione reduced 0.2793 0.4915 -0.8486 0.01586 False False +GM:Glycine GM Glycine -0.0161 0.9735 -1.144 0.006065 True False +GM:Guanosine GM Guanosine 2.565 0.01529 1.4371 0.006752 True True +GM:Guanosine monophosphate GM Guanosine monophosphate 2.2082 0.02031 1.0803 0.01475 True True +GM:Histamine GM Histamine 3.882 0.001027 2.7541 0.0007512 True True +GM:Histidine GM Histidine -1.7576 0.006077 -2.8856 5.461e-05 True True +GM:Hypoxanthine GM Hypoxanthine 1.7184 0.02251 0.5905 0.05026 True False +GM:Inosine GM Inosine 2.2857 0.02026 1.1577 0.0185 True True +GM:Isoleucine GM Isoleucine 1.0966 0.08408 -0.0314 0.9175 False False +GM:Kynurenine GM Kynurenine 1.0382 0.1749 -0.0898 0.8296 False False +GM:Lactic Acid GM Lactic Acid 0.9457 0.1205 -0.1822 0.5482 False False +GM:Leucine GM Leucine 0.7821 0.179 -0.3458 0.2125 False False +GM:Lysine GM Lysine 0.3222 0.4779 -0.8057 0.009134 False False +GM:Malic Acid GM Malic Acid -0.1755 0.7257 -1.3034 0.06958 True False +GM:Methionine sulfoxide GM Methionine sulfoxide -5.2431 4.681e-05 -6.371 3.484e-07 True True +GM:NAD GM NAD 1.8088 0.004371 0.6808 0.03828 True True +GM:Niacinamide GM Niacinamide 2.376 0.0007752 1.2481 0.002854 True True +GM:Nicotinic acid GM Nicotinic acid 1.3824 0.01487 0.2544 0.4505 True False +GM:Ophthalmic acid GM Ophthalmic acid 0.6798 0.2046 -0.4481 0.1207 False False +GM:Ornitine GM Ornitine -0.7257 0.08408 -1.8537 0.0006788 True False +GM:Pantothenic acid GM Pantothenic acid 1.3579 0.05939 0.23 0.4348 True False +GM:Phenylalanine GM Phenylalanine 0.0878 0.9062 -1.0401 0.008355 False False +GM:Proline GM Proline 0.9764 0.04725 -0.1515 0.7058 False False +GM:S-Adenosylhomocysteine GM S-Adenosylhomocysteine 2.8535 0.008497 1.7256 0.001204 True True +GM:Serine GM Serine -0.4318 0.2624 -1.5597 0.002533 True False +GM:Serotonin GM Serotonin 0.1186 0.7428 -1.0093 0.01079 False False +GM:Succinic acid GM Succinic acid 1.0978 0.2774 -0.0302 0.9581 False False +GM:Symmetric dimethylarginine GM Symmetric dimethylarginine 0.6611 0.2794 -0.4669 0.1186 False False +GM:Taurine GM Taurine 0.8794 0.02777 -0.2485 0.4618 False False +GM:Threonine GM Threonine 0.3334 0.4172 -0.7946 0.03049 False False +GM:Thymidine GM Thymidine 2.6593 0.01892 1.2446 0.03156 True True +GM:Tryptophan GM Tryptophan -0.7199 0.2953 -1.8479 0.0005286 True False +GM:Tyrosine GM Tyrosine 1.1329 0.06704 0.005 0.9826 True False +GM:Uracil GM Uracil 0.478 0.436 -0.6499 0.1337 False False +GM:Uric acid GM Uric acid 1.9034 0.002356 0.7754 0.02834 True True +GM:Uridine GM Uridine 1.7107 0.01529 0.5827 0.05738 True False +GM:Valine GM Valine 0.4576 0.3891 -0.6704 0.02963 False False +NUCs:ADP NUCs ADP -0.1444 0.6357 0.7103 0.02827 False False +NUCs:AMP NUCs AMP -0.2351 0.6213 0.6196 0.05128 False False +NUCs:ATP NUCs ATP -0.2339 0.6519 0.6208 0.3249 False False +NUCs:GDP NUCs GDP 2.5207 0.1533 3.3754 0.03602 True False +NUCs:GMP NUCs GMP 3.2063 0.002182 4.061 8.838e-05 True True +NUCs:GTP NUCs GTP -0.8407 0.02251 -0.1504 0.7518 True False +NUCs:TMP NUCs TMP -1.5941 0.02026 -0.7394 0.04483 True True +NUCs:UDP NUCs UDP -1.0092 0.01178 -0.1545 0.5995 True False +NUCs:UMP NUCs UMP -1.2041 0.09407 -0.3494 0.3692 True False +PUFAs:10-HDoHE PUFAs 10-HDoHE 5.0126 1.335e-05 -2.2131 0.0002535 False True +PUFAs:11-HETE PUFAs 11-HETE 6.1416 6.129e-06 -1.0842 0.009791 False True +PUFAs:12-HEPE PUFAs 12-HEPE 6.6529 5.485e-06 -0.5729 0.05474 False False +PUFAs:12-HETE PUFAs 12-HETE 6.179 6.129e-06 -1.0467 0.009262 False True +PUFAs:12-KETE PUFAs 12-KETE 6.2555 0.00043 -1.2775 0.03875 False True +PUFAs:13-HDoHE PUFAs 13-HDoHE 5.2333 0.0005135 -2.2078 0.001964 False True +PUFAs:13-HODE PUFAs 13-HODE 7.1661 1.182e-05 -0.0596 0.903 False False +PUFAs:13-KODE PUFAs 13-KODE 3.3531 0.2224 -1.1133 0.01495 False False +PUFAs:14-HDoHE PUFAs 14-HDoHE 5.2134 2.572e-05 -2.0123 0.0005286 False True +PUFAs:15-HEPE PUFAs 15-HEPE 4.3843 2.944e-05 -2.8414 0.0002372 False True +PUFAs:15-HETE PUFAs 15-HETE 5.8035 5.485e-06 -1.4222 0.0009077 False True +PUFAs:16-HDoHE PUFAs 16-HDoHE 4.4774 1.102e-05 -2.7483 5.461e-05 False True +PUFAs:17,18-EpETE PUFAs 17,18-EpETE -2.0962 0.0009696 -0.9524 0.005005 True True +PUFAs:18-HEPE PUFAs 18-HEPE 5.1134 2.944e-05 -2.1124 0.001964 False True +PUFAs:20-HDoHE PUFAs 20-HDoHE 5.2505 1.182e-05 -1.9139 0.001406 False True +PUFAs:5-HEPE PUFAs 5-HEPE 5.7917 2.944e-05 -1.4935 0.004321 False True +PUFAs:8-HETE PUFAs 8-HETE 6.2888 5.485e-06 -0.9369 0.008941 False True +PUFAs:9-HODE PUFAs 9-HODE 6.8299 5.554e-06 -0.3958 0.1829 False False +PUFAs:9-KODE PUFAs 9-KODE 3.3255 0.3456 -1.0463 0.02548 False False +PUFAs:AA PUFAs AA 10.7169 2.842e-07 3.4912 5.208e-06 True True +PUFAs:AEA PUFAs AEA 0.3672 0.702 1.4498 0.1475 True False +PUFAs:DHA PUFAs DHA 10.2676 2.842e-07 3.0419 1.224e-05 True True +PUFAs:Eicosapentaenoic Acid PUFAs Eicosapentaenoic Acid 9.8009 2.842e-07 2.5751 5.911e-05 True True +PUFAs:Lyso-PAF PUFAs Lyso-PAF 8.2218 5.485e-06 0.9961 0.03429 True True +PUFAs:OEA PUFAs OEA 3.8852 0.003061 4.7218 0.0005286 True True +PUFAs:PGD2 PUFAs PGD2 7.8159 2.335e-05 0.5902 0.2873 True False +PUFAs:PGE2 PUFAs PGE2 5.4335 0.1556 1.065 0.1829 True False +PUFAs:PGE2-d4 PUFAs PGE2-d4 3.0832 3.506e-05 -4.1425 4.684e-06 False True +PUFAs:PGF2a PUFAs PGF2a 2.5656 0.4172 0.9564 0.1006 True False +PUFAs:PGH2 PUFAs PGH2 5.3268 0.1701 0.9583 0.2561 True False +PUFAs:Stearidonic Acid PUFAs Stearidonic Acid 2.4785 0.0006053 -4.7472 4.684e-06 False True +TCA:Alpha-ketoglutaric acid TCA Alpha-ketoglutaric acid 1.7892 0.002686 0.8131 0.1475 True False +TCA:Aspartic acid TCA Aspartic acid -0.7799 0.2182 -1.756 0.002256 True False +TCA:Citric acid TCA Citric acid 2.4815 0.01116 1.5053 0.03874 True True +TCA:Fumaric acid TCA Fumaric acid 1.7962 0.002527 0.8201 0.05309 True False +TCA:Glutamic acid TCA Glutamic acid 1.2333 0.02262 0.2571 0.491 True False +TCA:L-proline TCA L-proline 1.3141 0.02026 0.3379 0.4348 True False +TCA:L-serine 1 TCA L-serine 1 1.1781 0.1092 0.202 0.73 True False +TCA:Malic acid TCA Malic acid 1.4837 0.09075 0.5076 0.4788 True False +TCA:Succinic acid TCA Succinic acid 1.0387 0.1556 0.0626 0.9175 True False +TCA:Threonine TCA Threonine -0.7918 0.236 -1.768 0.001111 True False +TCA:Valine TCA Valine 0.8985 0.08408 -0.0777 0.7695 False False diff --git a/data/studies/DUPERRET2025_POMS_STARVE/table_s12_provenance.json b/data/studies/DUPERRET2025_POMS_STARVE/table_s12_provenance.json new file mode 100644 index 0000000..5c907a9 --- /dev/null +++ b/data/studies/DUPERRET2025_POMS_STARVE/table_s12_provenance.json @@ -0,0 +1,66 @@ +{ + "study_id": "DUPERRET2025_POMS_STARVE", + "date_generated": "2026-10-16", + "converter": "data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py", + "source": { + "description": "Table S12. Raw metabolomic data: General Metabolites, Nucleotides, PUFAs and Krebs cycle (peak areas)", + "file": "mmc13.xlsx", + "url": "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC12803857/supplementaryFiles", + "article": "https://doi.org/10.1016/j.isci.2025.114333 (PMC12803857)", + "license": "CC BY-NC-ND 4.0: not redistributed; fetched and checksum-verified by this script", + "sha256": "451eb13e2da9db56ac984ee432632af2ced6ef9fc483183c62ba38c7c7f9c61d" + }, + "outputs_sha256": { + "DUPERRET2025_POMS_STARVE_features.tsv": "50d484845bb175015205ff70cb5c488a628ee15efa249a2c3f6d6351f2dd2850", + "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc_samplesheet.tsv": "54c3d1973e47f1915ada7a64874eb83d98dc8aca944f89f102f246596736c52c" + }, + "n_samples": 48, + "n_features": 320, + "n_internal_standards": 10, + "internal_standards": [ + "GM:2-Morpholinoethansulfonic Acid", + "NUCs:MES", + "PUFAs:12-HETE-d8", + "PUFAs:6-keto-PGF1a-d4", + "PUFAs:LTB4 d4", + "PUFAs:OEA-d4", + "PUFAs:PAF-d4", + "PUFAs:PGD2-d4", + "PUFAs:TXB2-d4", + "TCA:d27-Myristic acid" + ], + "n_metabolites_by_platform": { + "GM": 103, + "NUCs": 20, + "PUFAs": 176, + "TCA": 11 + }, + "n_metabolite_values_at_or_below_0.001": 8519, + "n_metabolite_values": 14880, + "blank_cells": { + "PUFAs:TXB3": [ + "F11N-3-12-1", + "F11N-3-12-2", + "F11N-3-12-3" + ] + }, + "annotation_confidence_level": 2, + "comparison": { + "comparison_id": "starved_vs_fed_0hpc", + "samples": [ + "F14R-5-0-1", + "F14R-5-0-2", + "F14R-5-0-3", + "F11N-5-0-1", + "F11N-5-0-2", + "F11N-5-0-3", + "F14R-3-0-1", + "F14R-3-0-2", + "F14R-3-0-3", + "F11N-3-0-1", + "F11N-3-0-2", + "F11N-3-0-3" + ], + "replicate_unit": "tank (= _t; inferred, as in DUPERRET2025_STARVE_RNASEQ)" + } +} diff --git a/registry/studies/DUPERRET2025_POMS_STARVE.yaml b/registry/studies/DUPERRET2025_POMS_STARVE.yaml index 6621e3b..afbb97d 100644 --- a/registry/studies/DUPERRET2025_POMS_STARVE.yaml +++ b/registry/studies/DUPERRET2025_POMS_STARVE.yaml @@ -6,10 +6,11 @@ # CC0) and the published paper, Duperret et al. 2025, iScience 29:114333 # (PMID 41541659, open access PMC12803857). # -# THE PROCESSED TABLES ARE EMPTY, as in DECICOMP2025_POMS_AGE. The four +# THE MetaboLights TABLES ARE EMPTY, as in DECICOMP2025_POMS_AGE. The four # Metabolite Assignment Files list 328 metabolites but hold no abundance -# values. Only Agilent targeted-dMRM raw files (.d, zipped) are deposited, and -# no AREE workflow reads them. Nothing can be harmonized yet. +# values, and the deposited raw files are Agilent targeted-dMRM .d files no +# AREE workflow reads. The paper's Table S12 (mmc13.xlsx) does hold per-sample +# peak areas, and the study was reanalyzed from it on 2026-10-16 (below). # # DIET IS FULLY CONFOUNDED WITH MS BATCH. On all four platforms the fed and # starved samples were acquired in separate runs months apart, with no @@ -32,6 +33,31 @@ # copy (still 0 abundance values), and the MetaboLights files API lists the # same four MAFs. The other three MAFs could not be re-fetched (EBI FTP # unreachable that day). +# +# REANALYZED FROM TABLE S12 (2026-10-16), QC FAILED. Table S12 ("Raw +# metabolomic data") gives peak areas for 310 metabolites and 10 internal +# standards (green in the sheet) in all 48 samples. The paper is CC BY-NC-ND +# 4.0, so the table is not committed: build_feature_table.py fetches it from +# Europe PMC, checks its SHA-256 and writes the workflow inputs +# (table_s12_provenance.json). The 0 hpc contrast was run with the metabolomics +# workflow in raw_reanalysis mode: internal-standard normalization within each +# platform (the authors' own first step), 0.0001/0 placeholders as below +# detection, families averaged within tank (3 vs 3 tanks), limma. 122 of 310 +# metabolites were detected often enough to test; 68 have padj < 0.05. +# +# Why it fails QC. The internal standards themselves differ by diet, i.e. by MS +# batch: on GM the per-sample IS offset is about +0.8 log2 in fed and -0.9 in +# starved samples, and on NUCs, which uses the same MES spike, the shift has +# the opposite sign. Re-running with median normalization ranks metabolites +# identically within GM, NUCs and TCA (r = 1.00) but shifts every log2FC by +# about 1 (GM +1.14, NUCs -0.84, TCA +0.98), and on PUFAs the two disagree +# outright (r = 0.40, mean shift 5.9). Only 61% of tested metabolites keep +# their direction across the two normalizations (normalization_sensitivity.tsv). +# A starved-vs-fed direction cannot be separated from the batch, and direction +# is what an evidence record asserts. QC decision (2026-10-16, sr320): mark +# qc_status failed, keep results_file null, do not harmonize or pool. The +# standardized table, missingness report, manifest, report and sensitivity +# table are committed as provenance for the decision. study_id: DUPERRET2025_POMS_STARVE simulated: false @@ -65,10 +91,11 @@ data_availability: raw_data_available: true processed_data_available: false status: "available" - access_notes: "MetaboLights MTBLS13313 is public under CC0 1.0. Vendor raw files (Agilent .d, zipped) are under FILES/RAW_FILES/{GM_RAW,NUCs_RAW,PUFAs_RAW,TCA_RAW}/, one per sample per platform (192 files). The four MAFs name 328 metabolites but contain no abundance values; checked 2026-10-11, and the GM MAF re-checked unchanged 2026-10-13. No metabolite has a database identifier or MSI reliability level. The authors' processed data (internal-standard normalized, IQR filtered, quantile normalized, log10 in MetaboAnalystR 4.0.0) are described in the paper but are not in MetaboLights; check the paper's supplementary tables before re-integrating raw files." + access_notes: "MetaboLights MTBLS13313 is public under CC0 1.0. Vendor raw files (Agilent .d, zipped) are under FILES/RAW_FILES/{GM_RAW,NUCs_RAW,PUFAs_RAW,TCA_RAW}/, one per sample per platform (192 files). The four MAFs name 328 metabolites but contain no abundance values; checked 2026-10-11, and the GM MAF re-checked unchanged 2026-10-13. No metabolite has a database identifier or MSI reliability level. The authors' processed data (internal-standard normalized, IQR filtered, quantile normalized, log10 in MetaboAnalystR 4.0.0) are not deposited. The paper's Table S12 (mmc13.xlsx, CC BY-NC-ND 4.0) has the un-normalized peak areas for all 48 samples and four platforms; it is fetched from Europe PMC (PMC12803857 supplementary files) by data/studies/DUPERRET2025_POMS_STARVE/build_feature_table.py, not committed." -qc_status: "not_started" -analysis_status: "not_started" +# See the 2026-10-16 note at the top: direction is confounded with MS batch. +qc_status: "failed" +analysis_status: "in_progress" # --------------------------------------------------------------------------- # DESIGN AS DEPOSITED. 48 samples = 2 families (F11N, F14R) x 2 diets @@ -130,9 +157,14 @@ limitations: > 2024, in separate runs, so the diet effect cannot be separated from batch or instrument drift. Internal-standard and quantile normalization reduce but do not remove this. AREE has no quality flag for batch confounding - yet; it is recorded here. (2) No usable processed data: the MAFs hold no - abundance values, and the raw files are vendor targeted-MRM data that no - AREE workflow reads. (3) Replication is 3 tanks per diet. Each sample is + yet; it is recorded here. The 2026-10-16 reanalysis shows the consequence: + the internal standards themselves shift with diet, and internal-standard and + median normalization disagree on the direction of 39% of tested metabolites + (normalization_sensitivity.tsv), so the study failed QC and is not + harmonized. (2) The MAFs hold no abundance values; the analyzable data are + the paper's Table S12 peak areas, which are not redistributable (CC BY-NC-ND + 4.0) and are fetched by build_feature_table.py. 188 of 310 metabolites + were below detection in too many tanks to test (missingness report). (3) Replication is 3 tanks per diet. Each sample is a pool of 10 oysters, so between-oyster variance is averaged away and the replicate unit is the tank (replicate = tank is inferred). (4) Starvation is a strong physiological manipulation. Metabolite differences at 0 hpc @@ -150,8 +182,11 @@ limitations: > Its 0 hpc diet contrast calls 38% of genes DE, mostly fasting response, and this study's metabolites will share that interpretation. (7) Targeted panel of about 330 metabolites - with no database identifiers or MSI levels in the deposit. Mapping is - held at unresolved. + with no database identifiers or MSI levels in the deposit. The + reanalysis records them as MSI level 2 (named by the targeted method, + identity not confirmed in the deposit). No metabolite maps to a gene, so + even a usable result would not link to DUPERRET2025_STARVE_RNASEQ's genes + without a metabolite-to-enzyme map. provenance: registered_by: sr320 @@ -174,10 +209,27 @@ provenance: registered (the paper's own metabolomic contrast), flagged meta_analysis_primary before any result was computed. Fed is the reference level, so positive effects mean higher in starved oysters. + 2026-10-16 reanalysis: Table S12 (mmc13.xlsx, SHA-256 + 451eb13e2da9db56ac984ee432632af2ced6ef9fc483183c62ba38c7c7f9c61d) fetched + from the Europe PMC supplementary-files API (PMC's direct file link does + not serve the file to scripts) and converted by build_feature_table.py + (table_s12_provenance.json). Internal standards are the ten green rows, + checked against the names in the Methods. One blank cell triple (TXB3, the + three F11N fed 12 hpc samples) is kept missing; those samples are not in + the 0 hpc contrast. Workflow run on Hete with -profile local: + --mode raw_reanalysis --metabolomics.normalization internal_standard + --metabolomics.detection_limit 0.001 --metabolomics.replicate_unit tank + --metabolomics.acquisition targeted (min_detected_per_arm 2, the + default); the sample sheet maps fed to control and starved to treatment + and sets tank = _t. Sensitivity: the same run with + --metabolomics.normalization median, compared per metabolite in + normalization_sensitivity.tsv. QC decision (2026-10-16, sr320): failed, + for the batch confounding described at the top of this file. source_links: - "https://www.ebi.ac.uk/metabolights/MTBLS13313" - "https://ftp.ebi.ac.uk/pub/databases/metabolights/studies/public/MTBLS13313/" - "https://doi.org/10.1016/j.isci.2025.114333" - "https://pmc.ncbi.nlm.nih.gov/articles/PMC12803857/" + - "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC12803857/supplementaryFiles" - "https://www.ebi.ac.uk/ena/browser/view/PRJEB86618" - "https://www.ebi.ac.uk/ena/browser/view/PRJEB86525" diff --git a/tests/test_duperret2025_study.py b/tests/test_duperret2025_study.py index 0ad7ba3..a960cb1 100644 --- a/tests/test_duperret2025_study.py +++ b/tests/test_duperret2025_study.py @@ -123,3 +123,67 @@ def test_paired_rnaseq_study_owns_the_accessions_and_matching_contrast(study): ours = {c["comparison_id"] for c in study["comparisons"]} theirs = {c["comparison_id"] for c in rnaseq["comparisons"]} assert "starved_vs_fed_0hpc" in ours & theirs + + +# --------------------------------------------------------------------------- # +# 2026-10-16 reanalysis from Table S12: run, then failed QC +# --------------------------------------------------------------------------- # + +STEM = "DUPERRET2025_POMS_STARVE_starved_vs_fed_0hpc" + + +@pytest.fixture(scope="module") +def table_s12(): + return json.loads((STUDY_DIR / "table_s12_provenance.json").read_text()) + + +def test_table_s12_is_fetched_and_checked_not_committed(table_s12): + src = table_s12["source"] + assert src["sha256"] == "451eb13e2da9db56ac984ee432632af2ced6ef9fc483183c62ba38c7c7f9c61d" + assert "CC BY-NC-ND" in src["license"] + # The NC-ND table and the feature table derived from it stay out of the repo. + assert not list(STUDY_DIR.glob("*.xlsx")) + assert not (STUDY_DIR / "DUPERRET2025_POMS_STARVE_features.tsv").exists() + assert table_s12["n_samples"] == 48 + assert table_s12["n_internal_standards"] == 10 + assert sum(table_s12["n_metabolites_by_platform"].values()) == 310 + + +def test_run_used_internal_standards_detection_limit_and_tank_units(): + manifest = json.loads((STUDY_DIR / f"{STEM}_workflow_manifest.json").read_text()) + params = manifest["parameters"]["metabolomics"] + assert manifest["mode"] == "raw_reanalysis" + assert params["normalization"] == "internal_standard" + assert float(params["detection_limit"]) == 0.001 + assert params["replicate_unit"] == "tank" + assert params["acquisition"] == "targeted" + da = next(v for k, v in manifest["qc_metrics"]["upstream_step_qc"].items() if "diffabundance_qc" in k) + assert (da["n_replicates_control"], da["n_replicates_treatment"]) == (3, 3) + assert (da["n_features_in"], da["n_features_tested"]) == (310, 122) + + +def test_every_metabolite_is_accounted_for(table_s12): + import pandas as pd + + results = pd.read_csv(STUDY_DIR / f"{STEM}_metabolite_features_standardized.tsv", sep="\t") + missing = pd.read_csv(STUDY_DIR / f"{STEM}_missingness.tsv", sep="\t") + assert len(missing) == 310 + assert set(results["feature_id"]) == set(missing.loc[missing.status == "tested", "feature_id"]) + assert results["lfcSE"].notna().all() + standards = set(table_s12["internal_standards"]) + assert len(standards) == 10 + assert not standards & (set(results["feature_id"]) | set(missing["feature_id"])) + + +def test_direction_depends_on_normalization_which_is_why_qc_failed(study): + import pandas as pd + + sens = pd.read_csv(STUDY_DIR / "normalization_sensitivity.tsv", sep="\t") + assert len(sens) == 122 + # The batch-confounded offset flips the direction of a large share of + # metabolites; if a re-run ever made the two agree, the decision should be + # revisited rather than left standing. + assert sens["same_direction"].mean() < 0.7 + assert study["qc_status"] == "failed" + assert study["comparisons"][0]["results_file"] is None + assert "normalization_sensitivity.tsv" in study["limitations"]