From a64d4d7df121e71813c396e182e388149465e35e Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 27 Jan 2025 14:59:58 +0100 Subject: [PATCH 01/29] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 9e4a1057c9cd0ebf9c81f4cbe747d25a866c37fc Merge: 8059211 128ffe8 Author: Suzanne Jin Date: Mon Dec 2 12:37:20 2024 +0100 Merge pull request #329 from nf-core/311-add-module-gsea 311 add module gsea commit 128ffe83f7d3d1abfe6ba4f5849f9ba15fd081d1 Merge: 440e40f 8059211 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Fri Nov 15 16:34:38 2024 +0100 Merge branch 'dev-ratio' into 311-add-module-gsea commit 805921189dc5da0e5c8a9caaf3eee76b65e5b600 Merge: 6d0d3b8 13bc1b7 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Fri Nov 15 16:29:15 2024 +0100 Merge pull request #357 from bjlang/dev-ratio Fix tests; add version channels; remove params access in subworkflow commit 13bc1b757ede1f4d5f9282921393f5b54483dcc6 Author: bjlang <> Date: Fri Nov 15 16:00:42 2024 +0100 Fix DEseq2 call commit 047099e34f1ec2d5e3b05bd8f0229c937afb0252 Author: bjlang <> Date: Fri Nov 15 15:46:26 2024 +0100 Revert "Ensure ch_transcript_lengths and ch_control_features being channels and not arrayLists" This reverts commit 655ad61ec5be92ad0d1041331f3716e5f6167b9c. commit 655ad61ec5be92ad0d1041331f3716e5f6167b9c Author: bjlang <> Date: Fri Nov 15 15:31:13 2024 +0100 Ensure ch_transcript_lengths and ch_control_features being channels and not arrayLists commit 95a9b2583dfc709e9f8e2cc8ed8eb07d79b65ae3 Author: bjlang <> Date: Fri Nov 15 13:17:02 2024 +0100 Forward version channel from subworkflows commit 846ca55b0fe3e334516da39fef6dcaf2ab2b4bae Author: bjlang <> Date: Fri Nov 15 13:01:11 2024 +0100 Fix tests; add version channels; remove params access in subworkflow commit 440e40fd6c7b11e658867ecbc31fd99ad1f96457 Author: bjlang <> Date: Wed Nov 13 16:29:32 2024 +0100 fix linting commit ad3173ec91f0e0203089c621ff05eb16cf97daa1 Author: bjlang <> Date: Wed Nov 13 14:07:30 2024 +0100 Fix test runs to finish except for GSEA commit 69f5b365917a33d252551a882e791e682b96d90f Merge: 4ade9e2 6d0d3b8 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Mon Nov 4 20:52:11 2024 +0100 Merge branch 'dev-ratio' into 311-add-module-gsea commit 6d0d3b88bcc07b730839be6f700fed613ff82204 Merge: 0f9c9fc 953eb51 Author: Suzanne Jin Date: Mon Nov 4 16:39:50 2024 +0100 Merge pull request #318 from bjlang/dev-ratio move pathway related logic out of differential and correlation subworkflows commit 0f9c9fcb51cfe168a17ae53a50f683e2261be0fc Merge: 4889998 a885116 Author: Suzanne Jin Date: Mon Nov 4 11:16:02 2024 +0100 Merge pull request #335 from nf-core/322_add_module_deseq2 322 add module deseq2 commit a88511687cb348034b4a881abc951170ad3b1e16 Author: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed Oct 30 14:22:13 2024 +0000 update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> commit 0e4a84d2a64ae4cee81e642da32d461b55b1cc2c Author: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed Oct 30 14:22:03 2024 +0000 update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> commit a282a4755be195ac986fc32b712ba19a584cbc67 Author: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed Oct 30 14:21:45 2024 +0000 update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> commit a2ddd8a111dcd46a850bb345b194016057fd5702 Author: Breeshey Roskams-Hieter Date: Wed Oct 30 11:34:53 2024 +0000 fix linting commit d6da7ad222309c2ec6c48fcfe6c63310cf487f2d Merge: ba1ea24 4889998 Author: Breeshey Roskams-Hieter Date: Wed Oct 30 11:31:14 2024 +0000 resolve merge conflicts commit ba1ea24f3912d7b174fa619bd0c5dc14326bab5a Author: Breeshey Roskams-Hieter Date: Wed Oct 30 11:23:57 2024 +0000 set nsub to lower numebr given nature of test data commit 3546cb0ddb97d6ab9d1c1ebf174ee89fd0ba0ba3 Author: Breeshey Roskams-Hieter Date: Wed Oct 30 11:23:41 2024 +0000 add DESEQ2 block to this workflow commit 4a5aa60e70e38f8d7c306ccdc59fb7ca6dc9254e Author: Breeshey Roskams-Hieter Date: Wed Oct 30 11:21:12 2024 +0000 add deseq2 pathway name commit 953eb5188ddd0dd3e2bcc40a9f835b3f2c6cd941 Author: bjlang <> Date: Wed Oct 30 12:15:10 2024 +0100 Implement review comments commit 11987610a1dca6d929f64ea5ae574537ae645394 Merge: f7c5c77 4889998 Author: bjlang <> Date: Wed Oct 30 11:17:05 2024 +0100 Merge remote-tracking branch 'upstream/dev-ratio' into dev-ratio commit 4889998e488ce0af99dbfdebaff92cdc3e51823f Merge: 1d5b909 90001a2 Author: Suzanne Jin Date: Wed Oct 30 10:51:47 2024 +0100 Merge pull request #333 from nf-core/323_add_module_gprofiler2 add GPROFILER2 module to ENRICHMENT subworkflow commit f7c5c773135b750c9b60674c43d10022a64d399a Author: bjlang <> Date: Tue Oct 29 18:35:24 2024 +0100 Adapt Limma call commit 90001a2159a782a9e716a5b3664f139d617cae1c Author: Breeshey Roskams-Hieter Date: Tue Oct 29 16:34:18 2024 +0000 add new line at end of file commit 47bb6597df5cce912ed26532034aabae20f30714 Author: Breeshey Roskams-Hieter Date: Tue Oct 29 16:32:45 2024 +0000 remove trailing whitespace commit 067c592e47e6eaa93e1e6a2b11fa504b31d90781 Author: Breeshey Roskams-Hieter Date: Tue Oct 29 16:21:20 2024 +0000 run GPROFILER2 only when enr_method is specified in the ch_tools channel commit 02a38bbc1d78c2d810583679874b60859b13e191 Author: Breeshey Roskams-Hieter Date: Tue Oct 29 16:20:21 2024 +0000 add new pathway_names to test gprofiler2 commit e5a5d156fe45bd741072e4e9c316ec1998d19194 Merge: 94d3c8e 1d5b909 Author: bjlang <> Date: Tue Oct 29 17:02:24 2024 +0100 Merge remote-tracking branch 'upstream/dev-ratio' into dev-ratio commit 94d3c8e7e48b0ad9e4c892f4078f0a20e809e980 Author: bjlang <> Date: Tue Oct 29 16:56:29 2024 +0100 Once more reorganize the pathway logic commit f2b63224df1df82324a5caa5dcfb92294a1f3d6c Author: Breeshey Roskams-Hieter Date: Tue Oct 29 15:36:12 2024 +0000 add GPROFILER2 module to ENRICHMENT subworkflow commit 4ade9e24637766c09b2745805ba1539e19f64834 Author: Suzanne Jin Date: Tue Oct 29 15:42:12 2024 +0100 add todo commit 5620b4263a056dc662fcda0e6425d0a9f2e19654 Author: Suzanne Jin Date: Tue Oct 29 15:41:03 2024 +0100 Update test_experimental.config commit b2868ae882d96cd131422793b7861a262bad98c2 Author: Suzanne Jin Date: Tue Oct 29 15:36:34 2024 +0100 Update CHANGELOG.md commit 1d5b909fffeea620f86d6de974f3b0c88ad62561 Merge: 1f4e926 f97ba6b Author: Suzanne Jin Date: Tue Oct 29 13:02:31 2024 +0100 Merge pull request #331 from suzannejin/dev-ratio-limma [dev-ratio] add limma to test_experimental commit f97ba6b3e619f9ab0dff1f3c54604e277e4f5e59 Author: Suzanne Jin Date: Tue Oct 29 12:48:48 2024 +0100 add todo commit 3b398ac77c99fbe7b5f5807fb19fbf0366094416 Author: Suzanne Jin Date: Tue Oct 29 12:47:23 2024 +0100 change filter_difftable_limma input column names commit c6db7ff29a17c18d47536db5e023ff64eab97a55 Author: Suzanne Jin Date: Tue Oct 29 12:04:26 2024 +0100 fix bug commit 898af4339f603b520f7e6663f55481214c0f90c7 Author: Suzanne Jin Date: Tue Oct 29 11:57:18 2024 +0100 add filtering step for limma commit 4477e1c88ccbd216e62d435ab6e157ecb14d380f Author: Suzanne Jin Date: Tue Oct 29 11:48:29 2024 +0100 add limma to test_experimental commit 1f4e926a8845f0a65343a306ce6da07336c386ed Merge: 0329206 e8067ac Author: Suzanne Jin Date: Tue Oct 29 11:23:50 2024 +0100 Merge pull request #328 from syyang93/limma_add Modify differential/main.nf to include limma commit e8067ac48506eed235162d0b85ed6f384c1b8397 Author: Suzanne Jin Date: Tue Oct 29 10:49:11 2024 +0100 trim trailing commit afd752220bd3e6a69d0e06599f0f82a9218faee5 Author: Suzanne Jin Date: Tue Oct 29 10:43:57 2024 +0100 modify limma input commit aca5f24a386f9ee5acd828c7a62792d345204451 Author: Suzanne Jin Date: Tue Oct 29 10:41:38 2024 +0100 modify limma input commit b530ddfb1badce95f65b671ee5342aadafb9a591 Author: Thomas Tams Date: Tue Oct 29 08:35:39 2024 +0000 add: gsea into enrichment commit af86bb2e68e029e9e08cdc4ac78695967f7f6599 Author: Stephanie Yang Date: Mon Oct 28 16:36:26 2024 +0100 Modify differential/main.nf to include limma commit b093261fdcdf86c5e086a33e3081cbddebb5bde8 Author: Thomas Tams Date: Mon Oct 28 14:51:13 2024 +0000 feat: added GSEA to ENRICHMENT subworkflow, feeding channels from differentialabundance down to enrichment subworkflow commit 517015b1a0f811297aed68b87fcd69be2ae2bed5 Author: Thomas Tams Date: Mon Oct 28 14:14:06 2024 +0000 add: activation of gsea_run and supplying gene set file commit 0329206e97688c5aea86dda4b3cb86644959f795 Merge: 3c8be72 e345168 Author: Suzanne Jin Date: Mon Oct 28 12:22:29 2024 +0100 Merge pull request #324 from suzannejin/dev-ratio-plot-exploratory shorten test_experimental into the essential tests commit e345168c080c65dcbce03c813901c2d8b6efbf5a Author: Suzanne Jin Date: Mon Oct 28 11:33:18 2024 +0100 trim trailing commit 14b625bd78f4894c98c4b7c2dcb7da9f3af0a864 Merge: 094452b 3c8be72 Author: Suzanne Jin Date: Mon Oct 28 11:27:20 2024 +0100 Merge branch 'dev-ratio' into dev-ratio-plot-exploratory commit 094452b58635d90df13986d10f84a1a393118de3 Author: Suzanne Jin Date: Mon Oct 28 11:25:12 2024 +0100 shorten test_experimental into the essential tests commit 3c8be72a0d1ab6bb4eeabeb569df7ed48b6f6b90 Merge: a594ebf dab58e5 Author: Suzanne Jin Date: Fri Oct 25 14:41:51 2024 +0200 Merge pull request #320 from suzannejin/dev-ratio-propd-loop [dev-ratio] update propr container and propd.R commit dab58e5a6f7bec585f1c332680543759908dc5bf Author: suzannejin Date: Fri Oct 25 13:10:53 2024 +0200 updated propr container and modified propd.R to loop through FDR testing when no meaningful cutoff is found commit 8db59cc4be5419b70044ee6de3e5d53b147445d9 Author: suzannejin Date: Fri Oct 25 13:08:16 2024 +0200 update toolsheet commit bd7d5d4035f5f32c77d38e2744a0f0bc1c58482d Author: suzannejin Date: Thu Oct 24 14:14:14 2024 +0200 fix bug with number_of_cutoffs in propd.R commit 74c77bda153c56366f91cbb95a1e3e6a29576c48 Merge: f4e8164 a594ebf Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Wed Oct 23 19:05:58 2024 +0200 Merge branch 'nf-core:dev-ratio' into dev-ratio commit f4e816404940e2b49018cd4c73da0ab3723979ed Author: bjlang <> Date: Wed Oct 23 19:05:11 2024 +0200 Move pathway related logic out of differential and correlation SWF commit a594ebfacda50a6e46d057d09318522d5310409e Merge: aa03e1a 4075a80 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Wed Oct 23 15:51:50 2024 +0200 Merge pull request #308 from bjlang/dev-ratio Split ch_tools into subworkflow relevant subchannels commit 4075a803e221a710e78ebc87090cc7467a9dc6b8 Author: bjlang <> Date: Wed Oct 23 14:32:45 2024 +0200 fix typo commit 062c5a323710a885f58f2162566f617a4c3dbc6e Author: bjlang <> Date: Wed Oct 23 14:16:50 2024 +0200 Temporarily remove pathway from meta to run processes only once per data/argument combination commit 9d35597cd0f94aec2a2cc25fb71536c5f0332149 Author: bjlang <> Date: Wed Oct 23 11:27:12 2024 +0200 remove duplicate tools declaration commit 1cbdb17efe8b4110630f98114b1c2a1e1f177dec Author: bjlang <> Date: Tue Oct 22 19:25:17 2024 +0200 Fix linting and include propd_grea in test commit 41adc93edccaa3e381079761bea423b4fc6ab6d2 Author: bjlang <> Date: Tue Oct 22 18:22:52 2024 +0200 Split toolsheet data into subworkflow dedicated channels commit 04649322d643191d6019f6f87a55bdeec0a2a4be Author: bjlang <> Date: Tue Oct 22 11:40:01 2024 +0200 finish merge commit 95e406ae8fffc072ca4b01818f7a6299727c85d8 Merge: a6c2b3d aa03e1a Author: bjlang <> Date: Tue Oct 22 11:20:00 2024 +0200 Merge branch 'dev-ratio' of https://github.com/bjlang/differentialabundance into dev-ratio commit aa03e1adb6130c2a0839cb2501625f9e3c5f73ac Merge: e977214 ab9587b Author: Suzanne Jin Date: Tue Oct 22 10:33:07 2024 +0200 Merge pull request #302 from suzannejin/dev-ratio [dev-ratio] add default parameters for propd/propr/grea commit ab9587b813de08ecbc8031c47351ce64cb35ad36 Author: suzannejin Date: Fri Oct 18 15:55:09 2024 +0200 modify propd.R so that it output some plots for the top red/yellow/green pairs commit b566842ff3259a335991d5a921dc32b7e614e124 Author: suzannejin Date: Fri Oct 18 11:12:09 2024 +0200 updated propr container commit 9819e84ce9303695320017ab7a33713a396cbdbb Author: suzannejin Date: Thu Oct 17 18:06:59 2024 +0200 add parameter for propd_weighted_degree commit d7ab1cad2a856e29db5dfaeef9d38fbfd93312a7 Author: suzannejin Date: Thu Oct 17 17:07:05 2024 +0200 update propd.R template to compute weighted connectivity for hub genes commit a077c0339f81749856cf8f99885bf640827f3c4d Author: suzannejin Date: Wed Oct 16 16:38:05 2024 +0200 properly set the resources limits for test_experimental.config commit bd51d59405160e130bac077f6e4ece7eb96a6300 Author: suzannejin Date: Wed Oct 16 16:24:36 2024 +0200 fix error related to .nf-core.yml commit 59bd17cb119c1ac3acb8af38e5973aef535e7bc4 Author: suzannejin Date: Wed Oct 16 15:56:32 2024 +0200 minor changes commit 576bb8ccd2495859b249200b95b49ed602ec48ce Author: suzannejin Date: Wed Oct 16 15:44:59 2024 +0200 remove temporal config commit 66148af466559d38be717ec3a490cb5cd34b5901 Author: suzannejin Date: Wed Oct 16 15:43:09 2024 +0200 set toolsheet schema commit 36fcff4f828ed82f3125ac5080bea8e7cd7cb15c Author: suzannejin Date: Wed Oct 16 15:20:38 2024 +0200 updated fromSamplesheet to samplesheetToList commit e8f159a89e59b60ccba0fe14440297670995ad2d Author: suzannejin Date: Wed Oct 16 14:55:44 2024 +0200 udpate schema for tools commit 46f1d8efb4c08d29fac4474fc3dec3138aefbc96 Author: suzannejin Date: Wed Oct 16 14:46:01 2024 +0200 added the params for experimental workflow commit e977214694675747429fdd2608e8cd1abc8b97e6 Merge: f8811e4 83699b7 Author: Jonathan Manning Date: Mon Oct 14 11:16:26 2024 +0100 Merge branch 'dev' into dev-ratio commit f8811e4f0dc664c2b474751515ff0ee34f60dced Merge: 25ace61 5c44e3c Author: Suzanne Jin Date: Thu Oct 10 11:38:52 2024 +0200 Merge pull request #296 from suzannejin/dev-ratio [dev-ratio] update R template for propr local modules commit 5c44e3cd82ec13e5f42a0af1e8b7dce8ff59238c Author: suzannejin Date: Thu Oct 10 11:12:10 2024 +0200 change test_experimental to remove propd_grea (no container yet) commit 118b257fb50b0d5447fcad624f8d26b935f07507 Author: suzannejin Date: Thu Oct 10 10:51:41 2024 +0200 added updated local version of propr/grea module commit 38a32b690149102f2e1cdf995f54e63fe1d28fef Author: suzannejin Date: Tue Oct 8 17:01:20 2024 +0200 fix bug in enrichment.nf commit 5b561628001b986eb40f68cc571111afca403b80 Author: suzannejin Date: Tue Oct 8 16:58:01 2024 +0200 modified enrichment subworkflow to fit new grea module commit cf58a2b9caef6278e8460b9269bcc07eae416d0f Author: suzannejin Date: Tue Oct 8 16:55:47 2024 +0200 add local propr/grea module commit fed6d4555be7aaa9fe0ca96156a98b5c02cceecc Author: suzannejin Date: Tue Oct 8 16:18:38 2024 +0200 remove nf-core/propr/grea commit bc9c86accc687b272dd4f51c5b7ed3723cbebaa8 Author: suzannejin Date: Tue Oct 8 16:11:07 2024 +0200 fix bug in propr.R commit 1696e1ccedfb5441ff2d961d48e56fd4a1f50c2b Author: suzannejin Date: Tue Oct 8 16:04:18 2024 +0200 added local module propr/propr commit 879b8a758c3ba57e477e418c86f230f189998ba1 Author: suzannejin Date: Tue Oct 8 14:39:29 2024 +0200 also get ch_results_genewise from propd commit c74c341c9885fc7508ba594ade651abca14d13b0 Author: suzannejin Date: Tue Oct 8 14:37:33 2024 +0200 test_experimental also run propd_fdr commit c5ddf6402256129d67d0bfee9719c64f023e55bc Author: suzannejin Date: Tue Oct 8 12:30:15 2024 +0200 add comment commit 36868e11ff1fd34b6047ced8ba66e5ceef6ccc4c Author: suzannejin Date: Tue Oct 8 12:29:12 2024 +0200 modify propd.R to not erroring when no FDR cutoff is found commit 1731b3d49bdb4d6dda672d9d517245bcd13130af Author: suzannejin Date: Tue Oct 8 12:20:41 2024 +0200 add more tests to experimental commit ed0686905c3909b1f42d10ca092805ea4bc24d8d Merge: c36e237 8c75e55 Author: suzannejin Date: Tue Oct 8 12:19:25 2024 +0200 Merge branch 'dev-ratio' of https://github.com/suzannejin/differentialabundance into dev-ratio commit c36e237b003e2e0618021d23fd625a027d106c61 Author: suzannejin Date: Tue Oct 8 12:17:49 2024 +0200 prettier modules.json commit 8c75e558958879749145589a60f3b5a308b88354 Author: nf-core-bot Date: Tue Oct 8 10:16:08 2024 +0000 [automated] Fix code linting commit b7a27747be9d2d2301d1c983c628f01d2653d34e Author: suzannejin Date: Tue Oct 8 12:09:28 2024 +0200 trim trailing spaces commit 6885bfd6efe2ef40c915c88f5cd7368f7ae99e48 Author: suzannejin Date: Tue Oct 8 11:55:28 2024 +0200 added comment to propd.R commit ecfc1847d73f9659c2fb50719503c09a44074424 Author: suzannejin Date: Tue Oct 8 11:31:37 2024 +0200 remove old container comment commit aac7085fe3e958fb0b4e95894bbe924299fd5a06 Author: suzannejin Date: Mon Oct 7 19:23:38 2024 +0200 added new version propd commit 25ace6139a5b2b18d4b9273ba2567258cbee3356 Merge: 293b30e 283385a Author: Suzanne Jin Date: Mon Oct 7 15:39:18 2024 +0200 Merge pull request #293 from suzannejin/dev-ratio [dev-ratio] simplified toolsheet structure, and modified the subworkflows accordingly commit 283385a1351007bdca08ae8ca168fee9782be5a0 Author: suzannejin Date: Thu Oct 3 11:57:32 2024 +0200 updated modules.config with the correct nomenclature for grea commit 7bc6ee8531d0138eef0de217ad85ad717ac4dac5 Author: suzannejin Date: Wed Oct 2 17:29:48 2024 +0200 remove filtervar related modules and subworkflows. commit fc95675effe05a86e180911f3eab83738d1f3990 Author: suzannejin Date: Wed Oct 2 17:29:03 2024 +0200 updated schema_tools.json commit c9b9482f64cc413e32ba096787bda3688987f042 Author: suzannejin Date: Wed Oct 2 15:04:27 2024 +0200 remove trailing spaces commit 3160a09bc5fcc61be43c54f33d427b1574943d5b Author: suzannejin Date: Wed Oct 2 14:14:14 2024 +0200 formatting commit f4c4d2f62005a7075e6c395acc3dacf1733ff5a6 Author: suzannejin Date: Wed Oct 2 12:54:48 2024 +0200 updated toolsheet to the current experimental workflow status commit 328aacde97228341e67af64bb7ed50c81308870e Author: suzannejin Date: Wed Oct 2 12:45:01 2024 +0200 removed the variable selection block between diff and corr blocks. commit ca6fb975f5fd8899bc0fe10acb3c6cf5db034870 Author: suzannejin Date: Wed Oct 2 12:26:59 2024 +0200 formatting commit a0ef41b9475c79cde4a90edb79d00bc7bf6ab029 Author: suzannejin Date: Wed Oct 2 12:22:36 2024 +0200 within differential subworkflow, initialize results channels at the beginning. Then the results from each process can be mixed accordingly commit a6c2b3ddaec3d8fa106e6f50b10de48bf55905c4 Author: bjlang <> Date: Tue Oct 1 16:30:48 2024 +0200 Store output of different pathways in different folders commit 293b30ee95196357bafa7b7c68715c86dae2f4b1 Merge: b71b83e 4a41e66 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Fri Sep 20 18:52:25 2024 +0200 Merge pull request #290 from bjlang/dev-ratio minor code restructuring commit 4a41e661e424cad7714b60a660c36bea284d619e Author: bjlang <> Date: Fri Sep 20 18:43:24 2024 +0200 minor code restructuring commit b71b83e5670b26fae958f47eadd3c92e675dae49 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Fri Sep 13 15:53:15 2024 +0200 Delete conf/crg.config commit 9421df16745a3d545a07b0852b03ac9627c3788f Merge: 6e6a740 318706a Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Tue Sep 10 15:27:14 2024 +0200 Merge pull request #285 from bjlang/dev-ratio Dev ratio commit 318706ae35e65ce36c3549799f8a1b7f565cdeef Author: bjlang <> Date: Fri Sep 6 19:37:41 2024 +0200 fix testing parameters commit 9532cfbf0180be01296aa1bacd4c3ba8c59c568d Author: bjlang <> Date: Fri Sep 6 19:04:56 2024 +0200 fix linting commit 8fcc24cd17b06bc9fb7be2cb9914cda96f966d5f Author: bjlang <> Date: Fri Sep 6 18:58:22 2024 +0200 Add CoDA/experimental branch to CI tests commit d133c6da777d7119e81e2eca4677898cbe273e0b Merge: 3254d25 2fe78de Author: bjlang <> Date: Tue Sep 3 19:05:16 2024 +0200 Merge branch 'dev-ratio' of https://github.com/bjlang/differentialabundance into dev-ratio commit 3254d25589ad80e83614186c81265ade7cd85b64 Author: bjlang <> Date: Tue Sep 3 19:04:47 2024 +0200 small fix commit 2fe78dee19d207c02d4e1832c5e282fa06d5c05f Merge: 04abe25 6e6a740 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Tue Sep 3 18:42:02 2024 +0200 Merge branch 'nf-core:dev-ratio' into dev-ratio commit 04abe2599aed5d759b556d4e431f1cc22e5f6dcc Author: bjlang <> Date: Tue Sep 3 18:01:29 2024 +0200 - use validated input for experimental workflow - use contrast file information for differential analysis with PropD commit 6e6a740e7e080692c9815ffdc6d81f738b711254 Merge: 5e5c6e4 3a69aae Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Tue Aug 27 15:08:32 2024 +0200 Merge pull request #283 from bjlang/dev-ratio Include CoDa workflow in main workflow commit 3a69aaed2cb82d5d04168a9be2ef4326e3476197 Merge: b218940 718075b Author: bjlang <> Date: Tue Aug 27 14:56:48 2024 +0200 Merge branch 'dev-ratio' of https://github.com/bjlang/differentialabundance into dev-ratio commit b21894065d2adccdf6f47e31724cba6f934149c7 Author: bjlang <> Date: Tue Aug 27 14:53:28 2024 +0200 Do not put not not in the not wrong place! commit 718075b2e1e6a29f998fc6000643790623d9bda7 Merge: 05cfb3a 5e5c6e4 Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Tue Aug 27 14:38:12 2024 +0200 Merge branch 'nf-core:dev-ratio' into dev-ratio commit 5e5c6e4070ecf1160e755458378f3d423b990800 Merge: e3fde5b c44e6bc Author: Björn Langer <61791748+bjlang@users.noreply.github.com> Date: Tue Aug 27 14:34:36 2024 +0200 Merge pull request #284 from nf-core/dev Update dev-ratio with changes from dev branch commit 05cfb3a0ed80420151b0770cc08885d14ea72e54 Author: bjlang <> Date: Tue Aug 27 13:38:03 2024 +0200 Move main_coda logic into differentialabundance as experimental study type commit 0a3927acbe4743c893529de9a983949febd03856 Author: bjlang <> Date: Tue Jul 30 12:01:02 2024 +0200 Keep original matrix file name in the annotation copy to improve resumability commit 5a3727b465603cd87560562ce0e9d76d08ef92c1 Author: bjlang <> Date: Fri Jul 26 17:47:12 2024 +0200 Skip copying matrix if not necessary to allow resuming pipeline execution commit 20c6cc6f849f35a683e2c693387fa4db538eef6d Author: bjlang <> Date: Fri Jul 26 16:26:13 2024 +0200 Use recommended format for optional parameters commit d45c4aa0f268ee9178f8634689e21868063f13aa Author: bjlang <> Date: Fri Jul 26 15:57:01 2024 +0200 Allow caching for -resume commit e3fde5b52dff03ad65d75d6006ef2a6c3f990341 Author: bjlang <> Date: Fri Jul 26 11:13:35 2024 +0200 small fixes to allow main_coda.nf to run commit bf7016766d841cd04fd479af4296d5f8fbbf1542 Merge: 4986420 fc123ec Author: caraiz2001 <105276325+caraiz2001@users.noreply.github.com> Date: Thu Jul 18 17:05:02 2024 +0200 Merge pull request #281 from caraiz2001/dev-ratio Coda workflow. Files that are unique to the coda workflow have been added to the corresponding folders (conf, modules, subworkflows...). Files that are present in the pipeline have been added as ***_coda to avoid overwriting the original ones (modules_coda.config, nextflow_coda.config, main_coda.nf... etc). commit fc123ec0b72b7ef13c8bc7c7b982dfaa3d29077f Author: Cristina Araiz Date: Thu Jul 18 16:52:17 2024 +0200 install propr/propr with nf-core modules install commit 8b2535174b225e1fd0325403beeb29c9fcefbd20 Author: Cristina Araiz Date: Thu Jul 18 16:47:30 2024 +0200 fix pre-commit errors in .json files commit d60f031d2389c19de37fa201d9b472f19e416276 Author: Cristina Araiz Date: Thu Jul 18 16:37:50 2024 +0200 install propd with nf-core modules install commit 45b776ec8903346be9cee588d049c5795e9c3b2f Author: Cristina Araiz Date: Thu Jul 18 16:34:09 2024 +0200 modify propr main.nf to match nf-core repository commit b59f668d53fe48e477def7d0e392b39b4d4b9202 Author: Cristina Araiz Date: Thu Jul 18 15:54:12 2024 +0200 update propr/grea with nf-core modules install commit a2d382449296bd52bd2d1dee26f89d20ce2e0cc9 Author: Cristina Araiz Date: Thu Jul 18 15:47:56 2024 +0200 solve remaining lint erros commit 969d15ae3a189fe271d67db887674e8a2003ed89 Author: Cristina Araiz Date: Thu Jul 18 15:45:39 2024 +0200 fix linting errors commit 6f8d5b069424ea34ec8f24789122133ace21f19d Author: Cristina Araiz Date: Thu Jul 18 15:28:43 2024 +0200 upload mygene module with nf-core module install commit a91626b78b67dbd42a5bd86204137e8c8be86762 Author: Cristina Araiz Date: Thu Jul 18 15:00:33 2024 +0200 add YMC counts and samplesheet to help for testing commit 748778915726732f73c9212b6858b47077bf1552 Author: Cristina Araiz Date: Thu Jul 18 14:43:34 2024 +0200 add nextflow.config and nextflow schema as nextflow_coda and nextflow_schema_coda commit da30859515965628e461ab6062fe721eefe8bfaf Author: Cristina Araiz Date: Thu Jul 18 14:35:32 2024 +0200 add main.nf as main_coda.nf commit 93ae92db8f3190356d5ab7cbe7700d8f84109447 Author: Cristina Araiz Date: Thu Jul 18 14:25:33 2024 +0200 add crg.config and modules.config (as modules_coda) to conf commit 4a76cefec21ec6b4784218e305c275e962733ad3 Author: Cristina Araiz Date: Thu Jul 18 14:18:19 2024 +0200 add schema_tools and tools_samplesheet to assets commit 708c4db047398e9188f7ab7ac8e3b56f2653570b Author: Cristina Araiz Date: Thu Jul 18 10:53:14 2024 +0200 add functional subworkflows into subworkflows/local commit eff2e81713a13b273ea51b51c75baed6a23be422 Author: Cristina Araiz Date: Thu Jul 18 10:38:04 2024 +0200 add propr, mygene and fiter_var module --- .github/workflows/ci.yml | 10 +- .nf-core.yml | 1 + CHANGELOG.md | 10 - assets/schema_tools.json | 45 ++ assets/tools_samplesheet.csv | 13 + conf/modules.config | 84 +++ conf/test_experimental.config | 52 ++ modules.json | 5 + modules/local/propr/grea/main.nf | 24 + modules/local/propr/grea/templates/grea.R | 279 +++++++ modules/local/propr/propd/main.nf | 33 + modules/local/propr/propd/templates/propd.R | 713 ++++++++++++++++++ modules/local/propr/propr/main.nf | 27 + modules/local/propr/propr/templates/propr.R | 318 ++++++++ modules/nf-core/mygene/environment.yml | 7 + modules/nf-core/mygene/main.nf | 23 + modules/nf-core/mygene/meta.yml | 54 ++ modules/nf-core/mygene/templates/mygene.py | 347 +++++++++ .../nf-core/mygene/tests/default_tsv.config | 3 + .../nf-core/mygene/tests/go_category.config | 3 + .../nf-core/mygene/tests/go_evidence.config | 3 + modules/nf-core/mygene/tests/main.nf.test | 106 +++ .../nf-core/mygene/tests/main.nf.test.snap | 135 ++++ modules/nf-core/mygene/tests/tags.yml | 2 + nextflow.config | 55 +- nextflow_schema.json | 149 +++- subworkflows/local/correlation/main.nf | 38 + subworkflows/local/differential/main.nf | 171 +++++ subworkflows/local/enrichment/main.nf | 153 ++++ subworkflows/local/experimental/main.nf | 134 ++++ workflows/differentialabundance.nf | 63 +- 31 files changed, 3007 insertions(+), 53 deletions(-) create mode 100644 assets/schema_tools.json create mode 100644 assets/tools_samplesheet.csv create mode 100644 conf/test_experimental.config create mode 100644 modules/local/propr/grea/main.nf create mode 100644 modules/local/propr/grea/templates/grea.R create mode 100644 modules/local/propr/propd/main.nf create mode 100644 modules/local/propr/propd/templates/propd.R create mode 100644 modules/local/propr/propr/main.nf create mode 100644 modules/local/propr/propr/templates/propr.R create mode 100644 modules/nf-core/mygene/environment.yml create mode 100644 modules/nf-core/mygene/main.nf create mode 100644 modules/nf-core/mygene/meta.yml create mode 100644 modules/nf-core/mygene/templates/mygene.py create mode 100644 modules/nf-core/mygene/tests/default_tsv.config create mode 100644 modules/nf-core/mygene/tests/go_category.config create mode 100644 modules/nf-core/mygene/tests/go_evidence.config create mode 100644 modules/nf-core/mygene/tests/main.nf.test create mode 100644 modules/nf-core/mygene/tests/main.nf.test.snap create mode 100644 modules/nf-core/mygene/tests/tags.yml create mode 100644 subworkflows/local/correlation/main.nf create mode 100644 subworkflows/local/differential/main.nf create mode 100644 subworkflows/local/enrichment/main.nf create mode 100644 subworkflows/local/experimental/main.nf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15e73b37..14c77428 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,11 +39,11 @@ jobs: - "latest-stable" test_profile: - "test" - - "nogtf" - - "affy" - - "maxquant" - - "soft" - - "rnaseq_limma" + - "test_nogtf" + - "test_affy" + - "test_maxquant" + - "test_soft" + - "test_experimental" compute_profile: - "docker" - "singularity" diff --git a/.nf-core.yml b/.nf-core.yml index af82ac6a..29a057fb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,7 @@ lint: - params.css_file - params.citations_file - params.report_file + - params.tools multiqc_config: False files_exist: - assets/multiqc_config.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f8e3816..7d1ca320 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.6.0dev - xxxx-xx-xx -### Added - -- [[#421](https://github.com/nf-core/differentialabundance/pull/421)] - Add immunedeconv module ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) -- [[#380](https://github.com/nf-core/differentialabundance/pull/380)] - Replace local filter_diff_table module with nf-core one, and create nf-tests for tabular_to_gsea_chip. ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) -- [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Added software version check in nf-tests and gene biotype column check in `.Rmd` ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) -- [[#354](https://github.com/nf-core/differentialabundance/pull/354)] - Warning message within the R Markdown report to control when genes don't have annotation data ([@alanmmobbs93](https://github.com/alanmmobbs93)). Review by [@WackerO](https://github.com/WackerO) and [@pinin4fjords](https://github.com/pinin4fjords). -- [[#345](https://github.com/nf-core/differentialabundance/pull/345)] - Plot differentially expressed genes by gene biotype ([@atrigila](https://github.com/atrigila), review by [@grst](https://github.com/grst)) -- [[#343](https://github.com/nf-core/differentialabundance/pull/343)] - Add pipeline-level nf-tests ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords) and [@nschcolnicov](https://github.com/nschcolnicov)) -- [[#286](https://github.com/nf-core/differentialabundance/pull/286)] - Integration of limma voom for rnaseq data ([@KamilMaliszArdigen](https://github.com/KamilMaliszArdigen), review by [@pinin4fjords](https://github.com/pinin4fjords)) - ### Fixed - [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Fixed nf-tests not running due to `--changed-since HEAD^`([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) diff --git a/assets/schema_tools.json b/assets/schema_tools.json new file mode 100644 index 00000000..dcbbe9f8 --- /dev/null +++ b/assets/schema_tools.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "nf-core/differentialabundance - params.tools schema", + "description": "Schema for the file provided with params.tools", + "type": "array", + "items": { + "type": "object", + "properties": { + "pathway_name": { + "type": "string", + "meta": ["pathway_name"] + }, + "diff_method": { + "type": "string", + "errorMessage": "choose a differential analysis method (eg. deseq2, limma, propd) or none", + "meta": ["diff_method"], + "enum": ["propd", "deseq2", "limma", "none"] + }, + "args_diff": { + "type": "string", + "meta": ["args_diff"] + }, + "cor_method": { + "type": "string", + "meta": ["cor_method"], + "errorMessage": "choose a correlation method (eg. propr) or none", + "enum": ["propr", "none"] + }, + "args_cor": { + "type": "string", + "meta": ["args_cor"] + }, + "enr_method": { + "type": "string", + "meta": ["enr_method"], + "errorMessage": "choose a functional enrichment analysis method (eg. gsea, grea, gprofiler, etc) or none" + }, + "args_enr": { + "type": "string", + "meta": ["args_enr"] + } + }, + "required": [] + } +} diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv new file mode 100644 index 00000000..94592a22 --- /dev/null +++ b/assets/tools_samplesheet.csv @@ -0,0 +1,13 @@ +pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr +propd,propd,,,,, +propd_fdr,propd,--permutation 100,,,, +propd_grea,propd,,,,grea, +propd_ora,propd,,,,gprofiler2, +deseq2_gsea,deseq2,,,,gsea, +deseq2_ora,deseq2,,,,gprofiler2, +limma,limma,,,,, +limma_ora,limma,,,,gprofiler2, +pcorbshrink,,,propr,--metric pcor.bshrink,, +propr,,,propr,--metric rho,, +cor,,,propr,--metric cor,, +deseq2,deseq2,,,,, diff --git a/conf/modules.config b/conf/modules.config index fe083970..043183df 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -499,4 +499,88 @@ process { enabled: false ] } + + // TODO + // for the moment, the parameters from toolsheet are parsed here. + // For the repeated arguments, since the R argument parser will only take the first one, + // here I add the toolsheet arguments at the beginning of ext.args to make sure they are + // taken into account instead of the default options. + // However, later we need to better handle this, maybe by a bit of groovy scripting to + // overwrite the repeated parameters (?) + + withName: "PROPR"{ + tag = { [ + "$meta.id", + (meta.args_cor ? "args_cor = $meta.args_cor" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_cor ? "${meta.args_cor}" : ''), + "--features_id_col ${params.features_id_col}", + "--metric ${params.propr_metric}", + "--ivar ${params.propr_ivar}", + (params.propr_alpha ? "--alpha ${params.propr_alpha}" : ''), + "--fdr ${params.propr_fdr}", + "--tails ${params.propr_tails}", + "--permutation ${params.propr_permutation}", + "--number_of_cutoffs ${params.propr_ncutoffs}" + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/correlation_analysis/propr-${meta.pathway_name ?: params.pathway}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "PROPD"{ + tag = { [ + "$meta.id", + "$meta.contrast", + (meta.args_diff ? "args_diff = $meta.args_diff" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_diff ? "${meta.args_diff}" : ''), + "--features_id_col ${params.features_id_col}", + "--obs_id_col ${params.observations_id_col}", + (params.propd_alpha ? "--alpha ${params.propd_alpha}" : ''), + "--moderated ${params.propd_moderated}", + "--fdr ${params.propd_fdr}", + "--permutation ${params.propd_permutation}", + "--number_of_cutoffs ${params.propd_ncutoffs}", + "--weighted_degree ${params.propd_weighted_degree}" + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/differential_analysis/propr-${meta.pathway_name ?: params.pathway}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "GREA"{ + tag = { [ + "$meta.id", + (meta.args_enr ? "args_enr = $meta.args_enr" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_enr ? "${meta.args_enr}" : ''), + "--set_min ${params.grea_set_min}", + "--set_max ${params.grea_set_max}", + "--permutation ${params.grea_permutation}" + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/enrichment_analysis/propr-${meta.pathway_name ?: params.pathway}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: "MYGENE" { + ext.args = [ + "--columname ${params.features_id_col}" + ].join(' ').trim() + publishDir = [ + path: "${params.outdir}/enrichment_analysis/mygene", + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } diff --git a/conf/test_experimental.config b/conf/test_experimental.config new file mode 100644 index 00000000..d85f52a4 --- /dev/null +++ b/conf/test_experimental.config @@ -0,0 +1,52 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests without a GTF +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple + pipeline test of the CoDA experimental mode. + + Use as follows: + nextflow run nf-core/differentialabundance -profile test_nogtf, --outdir + +---------------------------------------------------------------------------------------- +*/ + +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] +} + +params { + study_name = 'SRP254919' + study_type = 'experimental' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Input data + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' + matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' + contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' + deseq2_vst_nsub = 900 // only 982 features in this dataset, so nsub=1000 not feasible + pathway = "propd,propd_grea,limma,propr,cor,propd_ora,limma_ora,deseq2_ora,deseq2" + + // some pathways are not included in the test, because they don't make sense to test for this dataset + // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped + // and pcor.bshrink is taking too long for this test (15min), and it should be tested on matrices with n > p, or n close to p. (eg. specific pathways, or on DE genes only, etc) + + //Features + features_metadata_cols = 'gene_id,gene_name' + + // Observations + observations_id_col = 'sample' + observations_name_col = 'sample' + + // Apply a higher filter to check that the filtering works + filtering_min_abundance = 10 + + // Exploratory + exploratory_main_variable = 'contrasts' + +} diff --git a/modules.json b/modules.json index 094bfc3e..e9ee1102 100644 --- a/modules.json +++ b/modules.json @@ -70,6 +70,11 @@ "git_sha": "136f443c0a6d5c526410c7c9b73ce51ef457c341", "installed_by": ["modules"] }, + "mygene": { + "branch": "master", + "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", + "installed_by": ["modules"] + }, "proteus/readproteingroups": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf new file mode 100644 index 00000000..2b503133 --- /dev/null +++ b/modules/local/propr/grea/main.nf @@ -0,0 +1,24 @@ +process PROPR_GREA { + tag "$meta.id" + label 'process_high' + + // conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" + + input: + tuple val(meta), path(adj) + tuple val(meta2), path(gmt) + + output: + tuple val(meta), path("*.grea.tsv"), emit: results + path "versions.yml", emit: versions + path "*.R_sessionInfo.log", emit: session_info + + when: + task.ext.when == null || task.ext.when + + script: + template 'grea.R' +} diff --git a/modules/local/propr/grea/templates/grea.R b/modules/local/propr/grea/templates/grea.R new file mode 100644 index 00000000..f5d50374 --- /dev/null +++ b/modules/local/propr/grea/templates/grea.R @@ -0,0 +1,279 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files (determined by file extension) +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension + + if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file + separator <- "\\t" # Set the separator variable to tab + } else if (ext == "csv") { # If the file is a csv file + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( # Read the file + file, + sep = separator, # Set the separator defined above + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Loads the .gmt file and converts it into a knowledge database +#' +#' @param filename path of the .gmt file +#' @param genes vector of gene names. Note that this set should be as complete as possible. +#' So it should not only contain the target genes but also the background genes. +#' @return output a list with: `db` A knowledge database where each row is a graph node (eg. gene) +#' and each column is a concept (eg. GO term, pathway, etc) and `description` A list of descriptions +#' for each concept +load_gmt <- function(filename, nodes) { + + # read gmt file + gmt <- readLines(filename) + gmt <- strsplit(gmt, "\\t") + + # initialize database matrix + db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) + rownames(db) <- nodes + colnames(db) <- sapply(gmt, function(entry) entry[[1]]) + + # description of the concepts + description <- list() + + # for concept in gmt + for (i in 1:length(gmt)) { + + # get concept and description + concept <- gmt[[i]][[1]] + description[[concept]] <- gmt[[i]][[2]] + + # fill 1 if gene is in concept + nodes_in_concept <- gmt[[i]][-c(1, 2)] + nodes_in_concept <- nodes_in_concept[nodes_in_concept %in% nodes] + db[nodes_in_concept, i] <- 1 + } + + return(list(db = db, description = description)) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input data + adj = '$adj', # adjacency matrix + gmt = '$gmt', # knowledge database .gmt file + + # parameters for gene sets + set_min = 15, # minimum number of genes in a set + set_max = 500, # maximum number of genes in a set + + # parameters for permutation test + permutation = 100, + + # other options + seed = NA, + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + adj = 'character', + gmt = 'character', + set_min = 'numeric', + set_max = 'numeric', + permutation = 'numeric', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid +for (file_input in c('adj', 'gmt')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# TODO maybe add a function to pretty print the arguments? +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Enrichment analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load adjacency matrix +# this matrix should have gene x gene dimensions + +adj <- as.matrix(read_delim_flexible( + opt\$adj, + header = TRUE, + row.names = 1, + check.names = TRUE +)) +if (nrow(adj) != ncol(adj)) { + stop('Adjacency matrix is not square') +} +if (!all(rownames(adj) == colnames(adj))) { + stop('Adjacency matrix row names are not equal to column names') +} + +# load and process knowledge database + +gmt <- load_gmt( + opt\$gmt, + rownames(adj) +) + +# filter gene sets +# gene sets with less than set_min or more than set_max genes are removed + +idx <- which(colSums(gmt\$db) > opt\$set_min & colSums(gmt\$db) < opt\$set_max) +gmt\$db <- gmt\$db[, idx] +gmt\$description <- gmt\$description[idx] + +# run GREA +# Basically, it calculates the odds ratio of the graph being enriched in each concept, +# and the FDR of the odds ratio through permutation tests + +odds <- runGraflex( + adj, + gmt\$db, + p=opt\$permutation, + ncores=opt\$ncores +) +odds\$Description <- sapply(odds\$Concept, function(concept) + gmt\$description[[concept]] +) + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +write.table( + odds, + file = paste0(opt\$prefix, '.grea.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + +) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf new file mode 100644 index 00000000..8bfd9e3a --- /dev/null +++ b/modules/local/propr/propd/main.nf @@ -0,0 +1,33 @@ +process PROPR_PROPD { + tag "$meta.id" + label 'process_medium' + + // conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" + + input: + tuple val(meta), path(count), path(samplesheet), val(contrast_variable), val(reference), val(target) + + output: + tuple val(meta), path("*.propd.rds") , emit: rds + tuple val(meta), path("*.propd.results.tsv") , emit: results + tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered, optional: true + tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional: true + tuple val(meta), path("*.propd.connectivity.tsv") , emit: connectivity , optional: true + tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes , optional: true + tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true + tuple val(meta), path("*.propd.red_pairs.pdf") , emit: red_pairs , optional: true + tuple val(meta), path("*.propd.yellow_pairs.pdf") , emit: yellow_pairs , optional: true + tuple val(meta), path("*.propd.green_pairs.pdf") , emit: green_pairs , optional: true + path "*.warnings.log" , emit: warnings + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propd.R' +} diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R new file mode 100644 index 00000000..c4aae21a --- /dev/null +++ b/modules/local/propr/propd/templates/propd.R @@ -0,0 +1,713 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Get connectivity of genes from adjacency matrix +#' +#' The connectivity of a gene is the number of connections it has with other genes. +#' In other words, the degree of a gene. This connectivity can be weighted. In this +#' way, the strength of the theta value can be taken into account. +#' These information can be used to summarize the network and identify genes that are +#' potentially changing between groups. +#' +#' @param pd propd object +#' @param adj Adjacency matrix +#' @param de Differential proportionality values for each gene with respect to the +#' normalization reference +#' @param cutoff Cutoff value for de values to be considered significant +#' +#' @return data frame with the following columns: gene_id, degree, weighted_degree, +#' genewise_theta, average_theta, classification +get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ + + # initialize empty data frame + connectivity <- data.frame(matrix(NA, nrow=ncol(pd@counts), ncol=6)) + colnames(connectivity) <- c( + features_id_col, + 'degree', + 'weighted_degree', + 'genewise_theta', + 'average_theta', + 'classification' + ) + + # add features ids + connectivity[,1] <- colnames(pd@counts) + + # add degree + # degree is the number of connections a gene has with other genes + connectivity[,2] <- colSums(adj) + + # add weighted degree + # each connection is weighted by the theta value + # so lower theta values (higher between group variance than within group variance) will have a higher weight + # NOTE this is a placeholder for the proper weighted degree, maybe we are gonna change the way how we compute it + mat <- getMatrix(pd) + diag(mat) <- NA + connectivity[,3] <- colSums((1 - mat) * adj, na.rm=TRUE) + + # add genewise theta + # a theta value can be associated to each gene by calculating the between group variance vs within group variance + # of the gene normalized with respect to a reference (in this case the geometric mean of the sample) + connectivity[,4] <- de + + # add average theta of the connections + connectivity[,5] <- colSums(mat * adj, na.rm=TRUE) / colSums(adj) + + # classification + # green for DE genes, and red for non-DE genes + connectivity[,6] <- 'green' + connectivity[which(de > cutoff), 6] <- 'red' + + return(connectivity) +} + +#' Determine hub genes based on connectivity +#' +#' Here hub genes are those that have a degree higher than the expected degree. +#' The expected degree is the number of connections that each gene would have +#' if the connections were distributed uniformly. In other words, the average +#' degree by node. +#' +#' @param connectivity Data frame with connectivity +#' @param cutoff Theta value for which DP pairs are considered significant. +#' @param weighted Boolean. If TRUE, use weighted degree to determine hub genes. +#' Otherwise, use degree. +#' +#' @return filtered and sorted connectivity data frame with hub genes +get_hub_genes <- function(connectivity, cutoff, weighted=FALSE){ + + # get the expected degree + total_degree <- if (weighted) sum(connectivity\$weighted_degree) else sum(connectivity\$degree) + n_nodes <- sum(connectivity\$degree > 0) + expected_degree <- total_degree / n_nodes + + # get hub genes + hub_genes <- connectivity[which(connectivity\$degree > expected_degree),] + + # sort hub genes + if (weighted) { + hub_genes <- hub_genes[order(hub_genes\$weighted_degree, decreasing=TRUE),] + } else { + hub_genes <- hub_genes[order(hub_genes\$degree, decreasing=TRUE),] + } + + return(hub_genes) +} + +#' Plot pairs of genes +#' +#' This function plots the following pairs of genes: +#' - xy vs sample +#' - x vs y +#' - x vs sample +#' - y vs sample +#' - xr vs yr +#' - xr vs sample +#' - yr vs sample +#' The pairs are colored according to the group they belong to. +#' +#' @param df Data frame with the following columns: xy, x, y, xr, yr, sample, group, color +#' @param x Name of the gene x +#' @param y Name of the gene y +#' @param title Title of the plot +plot_pairs <- function(df, x, y, title){ + + # Define the layout + layout_matrix <- matrix(c( + 0, 1, 8, # First row + 2, 3, 4, # Second row + 5, 6, 7 # Third row + ), nrow = 3, ncol = 3, byrow = TRUE) + layout(layout_matrix, widths = c(1, 1, 1), heights = c(1, 1, 1)) + + # Adjust margins and text sizes + par(mar = c(4, 4, 1, 1), cex = 1.5, lwd = 1.5) + + # plot xy vs sample + plot(x=df\$sample, y=df\$xy, xlab='sample', ylab=paste0(x, '/', y), col=df\$color) + + # plot x vs y + plot(x=df\$x, y=df\$y, xlab=x, ylab=y, col=df\$color) + + # plot x vs sample + plot(x=df\$sample, y=df\$x, xlab='sample', ylab=x, col=df\$color) + + # plot y vs sample + plot(x=df\$sample, y=df\$y, xlab='sample', ylab=y, col=df\$color) + + # plot xr vs yr + plot(x=df\$xr, y=df\$yr, xlab=paste0(x, '/ref'), ylab=paste0(y, '/ref'), col=df\$color) + + # plot xr vs sample + plot(x=df\$sample, y=df\$xr, xlab='sample', ylab=paste0(x, '/ref'), col=df\$color) + + # plot yr vs sample + plot(x=df\$sample, y=df\$yr, xlab='sample', ylab=paste0(y, '/ref'), col=df\$color) + + # add legend + plot.new() + par(mar = c(0, 0, 0, 0)) + legend( + "center", + legend = unique(df\$group), + col = unique(df\$color), + pch = 19, + cex = 1.5, + bty = "n") + + # TODO the title does not appear somehow, fix it + # Add main title + mtext( + title, + side = 3, + outer = TRUE, + line = 1, + cex = 2, + font = 2) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix + count = '$count', + features_id_col = 'gene_id', # column name of feature ids + + # comparison groups + samplesheet = '$samplesheet', + obs_id_col = 'sample', # column name of observation ids + contrast_variable = "$contrast_variable", # column name of contrast variable + reference_group = "$reference", # reference group for contrast variable + target_group = "$target", # target group for contrast variable + + # parameters for computing differential proportionality + alpha = NA, # alpha for boxcox transformation + moderated = TRUE, # use moderated theta + + # parameters for getting the significant differentially proportional pairs + fdr = 0.05, # FDR threshold + permutation = 0, # if permutation > 0, use permutation test to compute FDR + number_of_cutoffs = 100, # number of cutoffs for permutation test + + # parameters for getting the hub genes + weighted_degree = FALSE, # use weighted degree for hub genes or not + + # other parameters + seed = NA, # seed for reproducibility + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + count = 'character', + samplesheet = 'character', + features_id_col = 'character', + obs_id_col = 'character', + contrast_variable = 'character', + reference_group = 'character', + target_group = 'character', + alpha = 'numeric', + moderated = 'logical', + fdr = 'numeric', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + weighted_degree = 'logical', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('count','samplesheet','contrast_variable','reference_group','target_group') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('count','samplesheet')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters are valid + +if (opt\$permutation < 0) { + stop('permutation should be a positive integer') +} + +# TODO maybe add a function to pretty print the arguments? +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Perform differential proportionality ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# read matrix + +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) # transpose matrix to have features (genes) as columns + +# parse group +# and filter matrix and group values, so that only the contrasted groups are kept +# TODO propd can also handle more than two groups +# but that dont work properly with the contrast format +# Should we provide an alternative way to do that? + +samplesheet <- read_delim_flexible( + opt\$samplesheet, + header = TRUE, + row.names = NULL, + check.names = FALSE +) +samplesheet <- samplesheet[,c(opt\$obs_id_col, opt\$contrast_variable)] +idx <- which(samplesheet[,2] %in% c(opt\$reference_group, opt\$target_group)) +mat <- mat[idx,] +samplesheet <- samplesheet[idx,] +group <- as.vector(samplesheet[,2]) +if (length(group) != nrow(mat)) stop('Error when parsing group') +if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') + +# compute differential proportionality + +pd <- propd( + mat, + group = group, + alpha = opt\$alpha, + weighted = FALSE, + p = opt\$permutation +) + +# compute DE theta values +# this is the theta value for each gene with respect to the normalization reference +# in this case, the reference is the geometric mean of the sample +# These DE values are only for interpreting purposes. +# TODO if we want to use the outcome from other DE analysis, at some point we should +# divide the below part into maybe a separate module that can take the DE and DP values as input +# and coordinate them through the pipeline + +ref <- exp(rowMeans(log(pd@counts))) +de <- runNormalization(pd, ref) + +# use F-stat FDR-adjusted p-values to get significant pairs, if permutation == 0 +# otherwise, get FDR values using permutation tests (more computationally expensive but likely more conservative FDRs) + +if (opt\$permutation == 0) { + + warning('FDR-adjusted p-values are used to get significant pairs.') + + # update FDR-adjusted p-values + + pd <- updateF( + pd, + moderated = opt\$moderated + ) + if (opt\$moderated) pd <- setActive(pd, what='theta_mod') + + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. + + theta_cutoff <- getCutoffFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + adj <- getAdjacencyFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + + # calculate gene connectivity and get hub genes + + connectivity <- get_connectivity( + pd, + adj, + de, + theta_cutoff, + features_id_col=opt\$features_id_col + ) + hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) + + # get significant pairs and classify them into red/yellow/green pairs + + results <- getSignificantResultsFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$classification <- "red" + results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + + # sort significant pairs + + results <- results[order(results\$theta),] + } + +} else { + + warning('Permutation tests are used to compute FDR values.') + + # calculate FDR values using permutation tests + # this part will call the updateCutoffs function iteratively + # as far as it does not find a meaningful theta value + # and does not reach the maximum number of iterations + + theta_cutoff <- FALSE + max_cutoff <- 1 + ntry <- 0 + while (!theta_cutoff & max_cutoff > 0 & ntry < 10) { + ntry <- ntry + 1 + + # get theta cutoffs to test the FDR + + if (ntry > 1) { + part <- pd@fdr[which(pd@fdr\$truecounts > 0),] + if (nrow(part) > 1) { + max_cutoff <- min(part\$cutoff) + } else { + break + } + } + + cutoffs <- as.numeric(quantile( + pd@results[pd@results\$theta < max_cutoff, 'theta'], + seq(0, 1, length.out = opt\$number_of_cutoffs) + )) + + # update FDR values + + pd <- updateCutoffs( + pd, + custom_cutoffs = cutoffs, + ncores = opt\$ncores + ) + + # check if any theta value has FDR below desired threshold + + theta_cutoff <- getCutoffFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + } + + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + + adj <- getAdjacencyFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + + # calculate gene connectivity and get hub genes + + connectivity <- get_connectivity( + pd, + adj, + de, + theta_cutoff, + features_id_col=opt\$features_id_col + ) + hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) + + # get significant pairs and classify them into red/yellow/green pairs + + results <- getSignificantResultsFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$classification <- "red" + results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + + # sort significant pairs + + results <- results[order(results\$theta),] + } +} + +# deal with the situation when no significant thetas are found +# For the moment, we just print a warning and set adj, hub_genes and results to NULL +# TODO take top n pairs when no cutoff has FDR below desired threshold + +if (!theta_cutoff) { + warning('No theta value has FDR below desired threshold.') + adj <- NULL + connectivity <- NULL + hub_genes <- NULL + results <- NULL +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pd, + file = paste0(opt\$prefix, '.propd.rds') +) + +write.table( + getResults(pd), + file = paste0(opt\$prefix, '.propd.results.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +if (theta_cutoff) { + write.table( + results, + file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) + write.table( + adj, + file = paste0(opt\$prefix, '.propd.adjacency.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) + write.table( + connectivity, + file = paste0(opt\$prefix, '.propd.connectivity.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) + write.table( + hub_genes, + file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) +} + +if (opt\$permutation > 0) { + write.table( + pd@fdr, + file = paste0(opt\$prefix, '.propd.fdr.tsv'), + col.names = TRUE, + sep = '\\t', + quote = FALSE + ) +} + +################################################ +################################################ +## Plot red pairs ## +################################################ +################################################ + +if (theta_cutoff){ + + # get ratios between each gene and the normalization reference + ratios <- exp(logratio(pd@counts, 'clr', NA)) + + # plot for each pair type + for (pair_type in c("red", "yellow", "green")){ + pdf(paste0(opt\$prefix, '.propd.', pair_type, '_pairs.pdf'), width = 18, height = 18) + + # get pairs + pairs <- results[results\$classification == pair_type,] + + # for the top pairs + for (idx in c(1:3)){ + + # get x and y genes + x <- pairs[idx,'Partner'] + y <- pairs[idx,'Pair'] + + # create data frame + df <- data.frame( + xy=pd@counts[,x]/pd@counts[,y], + x=pd@counts[,x], + y=pd@counts[,y], + xr=ratios[,x], + yr=ratios[,y], + sample=c(1:nrow(pd@counts)), + group=group, + color=ifelse(group == opt\$target_group, 'red', 'blue')) + df <- df[order(df\$group, df\$sample),] + + # plot + title <- paste0("top ", idx, " ", pair_type, " pair with theta=", round(results[idx, 'theta'], 6)) + plot_pairs(df, x, y, title) + } + + } +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf new file mode 100644 index 00000000..99e7770e --- /dev/null +++ b/modules/local/propr/propr/main.nf @@ -0,0 +1,27 @@ +process PROPR_PROPR { + tag "$meta.id" + label 'process_medium' + + // conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" + + input: + tuple val(meta), path(count) + + output: + tuple val(meta), path("*.propr.rds") , emit: propr + tuple val(meta), path("*.propr.matrix.csv") , emit: matrix + tuple val(meta), path("*.propr.fdr.tsv") , emit: fdr , optional:true + tuple val(meta), path("*.propr.adjacency.csv"), emit: adjacency , optional:true + path "*.warnings.log" , emit: warnings + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propr.R' +} diff --git a/modules/local/propr/propr/templates/propr.R b/modules/local/propr/propr/templates/propr.R new file mode 100644 index 00000000..afbc35e6 --- /dev/null +++ b/modules/local/propr/propr/templates/propr.R @@ -0,0 +1,318 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + return(mat) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix + count = '$count', + features_id_col = 'gene_id', # column name for features (genes) + + # parameters for computing correlation coefficients + metric = 'rho', # correlation metric: rho, phi, phs, cor, vlr, pcor, pcor.shrink, pcor.bshrink + ivar = 'clr', # transformation: clr, alr, or the name(s) or index(es) of the variable(s) to be used as reference(s) + alpha = NA, # alpha value for Box-Cox transformation + + # parameters for getting the significant coefficients + fdr = 0.05, # FDR threshold + tails = "right", # FDR tail: right or both + permutation = 100, # number of permutations + number_of_cutoffs = 100, # number of cutoffs for which compute the FDRs + + # other parameters + seed = NA, # seed for reproducibility + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + count = 'character', + features_id_col = 'character', + metric = 'character', + ivar = 'character', + alpha = 'numeric', + fdr = 'numeric', + tails = 'character', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') + +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('count') # only count data is strictly required, other parameters have defaults +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('count')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters + +if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { + stop('Please make sure you provided the correct metric') +} + +if (opt\$metric == 'pcor.bshrink'){ + if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') + if (!opt\$ivar %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') + +} else { + if (is.na(opt\$ivar)) warning('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') +} + +# TODO maybe add a function to pretty print the arguments? +print(opt) + + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Perform correlation analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load count matrix + +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) # transpose matrix to have features (genes) as columns + +# Compute correlation coefficients + +pr <- propr( + mat, + metric = opt\$metric, + ivar = opt\$ivar, + alpha = opt\$alpha, + p = opt\$permutation +) + +if (opt\$permutation > 0) { + + # update FDRs for each coefficient cutoff + + pr <- updateCutoffs( + pr, + number_of_cutoffs=opt\$number_of_cutoffs, + tails=opt\$tails, + ncores=opt\$ncores + ) + + # get cutoff at given FDR threshold + + cutoff <- getCutoffFDR( + pr, + fdr=opt\$fdr, + window_size=1 + ) + + if (cutoff) { + + # get adjacency matrix with the significant edges + + adj <- getAdjacencyFDR( + pr, + fdr=opt\$fdr, + window_size=1 + ) + + } else { + # TODO take top n pairs when no cutoff has FDR below desired threshold + # For the moment, we just print a warning and set adj to NULL + warning('No significant results found at FDR threshold ', opt\$fdr) + adj <- NULL + } +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pr, + file = paste0(opt\$prefix, '.propr.rds') +) + +write.table( + round(pr@matrix, 8), # round matrix decimals to avoid floating point inconsistencies + file = paste0(opt\$prefix, '.propr.matrix.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE +) + +if (!is.null(adj)) { + write.table( + adj, + file = paste0(opt\$prefix, '.propr.adjacency.csv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +if (opt\$permutation > 0) { + write.table( + pr@fdr, + file = paste0(opt\$prefix, '.propr.fdr.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/mygene/environment.yml b/modules/nf-core/mygene/environment.yml new file mode 100644 index 00000000..45442c49 --- /dev/null +++ b/modules/nf-core/mygene/environment.yml @@ -0,0 +1,7 @@ +name: mygene +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::mygene=3.2.2 diff --git a/modules/nf-core/mygene/main.nf b/modules/nf-core/mygene/main.nf new file mode 100644 index 00000000..25a21d8f --- /dev/null +++ b/modules/nf-core/mygene/main.nf @@ -0,0 +1,23 @@ +process MYGENE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mygene:3.2.2--pyh5e36f6f_0': + 'biocontainers/mygene:3.2.2--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(gene_list) + + output: + tuple val(meta), path("*.gmt"), emit: gmt + tuple val(meta), path("*.tsv"), emit: tsv , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template "mygene.py" +} diff --git a/modules/nf-core/mygene/meta.yml b/modules/nf-core/mygene/meta.yml new file mode 100644 index 00000000..f7aaa455 --- /dev/null +++ b/modules/nf-core/mygene/meta.yml @@ -0,0 +1,54 @@ +name: "mygene" +description: Fetch the GO concepts for a list of genes +keywords: + - mygene + - go + - annotation +tools: + - "mygene": + description: "A python wrapper to query/retrieve gene annotation data from Mygene.info." + homepage: "https://mygene.info/" + documentation: "https://docs.mygene.info/projects/mygene-py/en/latest/" + tool_dev_url: "https://github.com/biothings/mygene.py" + doi: "10.1093/nar/gks1114" + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - gene_list: + type: file + description: A tsv/csv file that contains a list of gene ids in one of the columns. + By default, the column name should be "gene_id", but this can be changed + by using "--columname gene_id" in ext.args. + pattern: "*.{csv,tsv}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - gmt: + type: file + description: | + Each row contains the GO id, a description, and a list of gene ids. + pattern: "*.gmt" + - tsv: + type: file + description: | + (optional) A tsv file with the following columns: + query, mygene_id, go_id, go_term, go_evidence, go_category, symbol, name, taxid + pattern: "*.tsv" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@suzannejin" +maintainers: + - "@suzannejin" diff --git a/modules/nf-core/mygene/templates/mygene.py b/modules/nf-core/mygene/templates/mygene.py new file mode 100644 index 00000000..2717c467 --- /dev/null +++ b/modules/nf-core/mygene/templates/mygene.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python3 +import argparse +import mygene +import shlex + + +""" +This python script uses the mygene module to query the MyGene.info API and +retrieve the go terms associated with a list of gene ids. The gene ids should +ideally be Ensembl or Entrez ids. The script generates two outputs: + 1. A tsv file containing information related to each query. The columns + include query, mygene_id, go_id, go_term, go_evidence, go_category, + symbol, name, and taxid. + 2. A gmt file containing information related to each go term. Each row + includes the go id, go term, and the genes associated with that go term. + +Author: Suzanne Jin +License: Apache 2.0 (same as the mygene library) +""" + + +class Arguments: + """ + Parses the argments, including the ones coming from $task.ext.args. + """ + + def __init__(self) -> None: + self.input = "$gene_list" + self.prefix = "$task.ext.prefix" if "$task.ext.prefix" != "null" else "$meta.id" + self.output_gmt = self.prefix + ".gmt" + self.output_tsv = self.prefix + ".tsv" + self.parse_ext_args("$task.ext.args") + + def parse_ext_args(self, args_string: str) -> None: + """ + It parses the extended arguments. + """ + # skip when there are no extended arguments + if args_string == "null": + args_string = "" + + # Parse the extended arguments + args_list = shlex.split(args_string) # Split the string into a list of arguments + parser = argparse.ArgumentParser() + # input parameters + parser.add_argument( + "--columname", + default="gene_id", + help="Name of the column where the gene ids are stored in the input file. Default: gene_id", + ) + # filtering parameters + parser.add_argument( + "--species", + default=None, + help="Comma separated of common name of the species or taxon ids", + ) + parser.add_argument( + "--go_category", + default=None, + help="Comma separated list of GO categories to keep. Default: all", + ) + parser.add_argument( + "--go_evidence", + default=None, + help="Comma separated list of GO evidence codes to keep. Default: all", + ) + # additional parameters for querymany + parser.add_argument( + "--scopes", + default=None, + help="Comma separated list of scopes to search for.", + ) + parser.add_argument( + "--entrezonly", + default=False, + help="When true, the query returns only the hits with valid Entrez gene ids. Default: false.", + ) + parser.add_argument( + "--ensemblonly", + default=False, + help="When true, the query returns only the hits with valid Ensembl gene ids. Default: False", + ) + # output parameters + parser.add_argument( + "--generate_tsv", + default=False, + help="Also generate a tsv file with the gene based information. Default: False", + ) + args = parser.parse_args(args_list) + + # Convert "null" values to default values + # convert true to True and false to False + for attr in vars(args): + value = getattr(args, attr) + if value == "null": + setattr(args, attr, parser.get_default(attr)) + elif value == "true": + setattr(args, attr, True) + elif value == "false": + setattr(args, attr, False) + + # check if the arguments are valid + if args.go_category: + args.go_category = args.go_category.upper() + for category in args.go_category.split(","): + if category not in ["BP", "MF", "CC"]: + raise ValueError("The GO category should be one of BP, MF, or CC.") + if args.go_evidence: + args.go_evidence = args.go_evidence.upper() + + # Assign args attributes to self attributes + for attr in vars(args): + setattr(self, attr, getattr(args, attr)) + + def print_args(self) -> None: + """ + Print the arguments. + """ + for attr in vars(self): + print(f"{attr}: {getattr(self, attr)}") + + +class Version: + """ + Parse the versions of the modules used in the script. + """ + + @staticmethod + def get_versions(modules: list) -> dict: + """ + This function takes a list of modules and returns a dictionary with the + versions of each module. + """ + return {module.__name__: module.__version__ for module in modules} + + @staticmethod + def format_yaml_like(data: dict, indent: int = 0) -> str: + """ + Formats a dictionary to a YAML-like string. + + Args: + data (dict): The dictionary to format. + indent (int): The current indentation level. + + Returns: + yaml_str: A string formatted as YAML. + """ + yaml_str = "" + for key, value in data.items(): + spaces = " " * indent + if isinstance(value, dict): + yaml_str += f"{spaces}{key}:\\n{Version.format_yaml_like(value, indent + 1)}" + else: + yaml_str += f"{spaces}{key}: {value}\\n" + return yaml_str + + +class MyGene: + """ + This class will query the MyGene.info API and retrieve the go terms + associated with a list of gene ids. + + In concrete, if first queries the mygene API to get the mygene ids for each + of the query gene. Then, it queries for the annotations, and parses the go + terms all together with all the other information. + """ + + def __init__( + self, + query: list, + species: str, + scopes: str, + entrezonly: bool, + ensemblonly: bool, + go_category: str = None, + go_evidence: str = None, + ) -> None: + self.query = query + self.fields = "go,symbol,name,taxid" + self.species = species + self.scopes = scopes + self.entrezonly = entrezonly + self.ensemblonly = ensemblonly + self.go_category = go_category + self.go_evidence = go_evidence + self.mg = mygene.MyGeneInfo() + self.idmap = self.query2idmap() + print(f"fetched {len(self.idmap)} ids from {len(self.query)} queries") + + def query2idmap(self) -> dict: + """ + It returns a dictionary with the mygene ids as keys and the query ids as values. + """ + q = self.mg.querymany( + self.query, + scopes=self.scopes, + species=self.species, + entrezonly=self.entrezonly, + ensemblonly=self.ensemblonly, + returnall=True, + ) + return {dic["_id"]: dic["query"] for dic in q["out"] if "_id" in dic} + + def id2info(self) -> list: + """ + It returns a list of dictionaries with the info returned from getgenes for all the query ids. + Each dictionary contains the annotations for the corresponding query gene. + """ + return self.mg.getgenes(list(set(self.idmap)), fields=self.fields, species=self.species) + + def parse_go_based_info(self) -> dict: + """ + It queries the annotations for all query ids and then parses a go + centric dictionary. It is a dictionary of dictionaries with the + following format: {{go_id1: [go_term, gene1, gene2, ...]}, ...} + """ + info = {} + for dic in self.id2info(): + if "go" not in dic: + continue + if self.go_category: + dic["go"] = { + category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] + } + for category, go_list in dic["go"].items(): + if not isinstance(go_list, list): + go_list = [go_list] + for go in go_list: + if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): + continue + + if go["id"] not in info: + info[go["id"]] = [go["term"], self.idmap[dic["_id"]]] + else: + info[go["id"]].append(self.idmap[dic["_id"]]) + return info + + def parse_gene_based_info(self) -> dict: + """ + It queries the annotations for all query ids and then parses a go + centric dictionary. + + At the end it returns a dictionary {query gene: {}} of dictionaries + with the following keys: query, mygene_id, go_id, go_term, go_evidence, + go_category, symbol, name, taxid. + """ + info = {} + for dic in self.id2info(): + if "go" not in dic: + continue + if self.go_category: + dic["go"] = { + category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] + } + for category, go_list in dic["go"].items(): + if not isinstance(go_list, list): + go_list = [go_list] + for go in go_list: + if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): + continue + + current_info = { + "query": self.idmap[dic["_id"]], + "mygene_id": dic["_id"], + "go_id": go["id"], + "go_term": go["term"], + "go_evidence": go["evidence"], + "go_category": category, + "symbol": dic["symbol"], + "name": dic["name"], + "taxid": dic["taxid"], + } + info[self.idmap[dic["_id"]]] = current_info + return info + + def parse_and_save_to_gmt(self, filename: str) -> list: + """ + It parses and saves go centric information to a gmt file. + The final gmt output will be sorted following the go id order. + """ + info = self.parse_go_based_info() + info = dict(sorted(info.items(), key=lambda x: x[0])) + with open(filename, "w") as f: + for go_id, go_list in info.items(): + tmp = sorted(go_list[1:]) + f.write(go_id + "\\t" + go_list[0] + "\\t" + "\\t".join(tmp) + "\\n") + print(f"saved {len(info)} go terms to {filename}") + + def parse_and_save_to_tsv(self, filename: str) -> None: + """ + It parses and saves gene centric information in a tsv file. + The final tsv output will be sorted following the input query gene list order. + """ + info = self.parse_gene_based_info() + with open(filename, "w") as f: + f.write("\\t".join(info[self.query[0]].keys()) + "\\n") + for gene in self.query: # sorted by query gene list + if gene in info: + f.write("\\t".join([str(val) for val in info[gene].values()]) + "\\n") + print(f"saved {len(info)} gene centric info to {filename}") + + +def load_list(filename: str, columname: str) -> list: + """ + It loads the list of gene ids from a file. + The columname is the name of the column where the gene ids are stored. + """ + if filename.split(".")[-1] == "tsv": + sep = "\\t" + elif filename.split(".")[-1] == "csv": + sep = "," + else: + raise ValueError("The input file extension should be either tsv or csv.") + with open(filename, "r") as f: + idx = f.readline().strip().split(sep).index(columname) + return [line.strip().split(sep)[idx] for line in f] + + +if __name__ == "__main__": + # parse and print arguments + args = Arguments() + args.print_args() + + # load gene list + gene_list = load_list(args.input, args.columname) + + # run mygene api + mg = MyGene( + gene_list, + species=args.species, + scopes=args.scopes, + entrezonly=args.entrezonly, + ensemblonly=args.ensemblonly, + go_category=args.go_category, + go_evidence=args.go_evidence, + ) + + # parse annotations and save output files + mg.parse_and_save_to_gmt(args.output_gmt) + if args.generate_tsv: + mg.parse_and_save_to_tsv(args.output_tsv) + + # write versions to file + versions_this_module = {} + versions_this_module["${task.process}"] = Version.get_versions([argparse, mygene]) + with open("versions.yml", "w") as f: + f.write(Version.format_yaml_like(versions_this_module)) diff --git a/modules/nf-core/mygene/tests/default_tsv.config b/modules/nf-core/mygene/tests/default_tsv.config new file mode 100644 index 00000000..08bd6fac --- /dev/null +++ b/modules/nf-core/mygene/tests/default_tsv.config @@ -0,0 +1,3 @@ +process{ + ext.args = "--generate_tsv true" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_category.config b/modules/nf-core/mygene/tests/go_category.config new file mode 100644 index 00000000..771f8f4d --- /dev/null +++ b/modules/nf-core/mygene/tests/go_category.config @@ -0,0 +1,3 @@ +process { + ext.args = "--go_category bp,mf" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_evidence.config b/modules/nf-core/mygene/tests/go_evidence.config new file mode 100644 index 00000000..b19de214 --- /dev/null +++ b/modules/nf-core/mygene/tests/go_evidence.config @@ -0,0 +1,3 @@ +process { + ext.args = "--go_evidence EXP,IDA" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/main.nf.test b/modules/nf-core/mygene/tests/main.nf.test new file mode 100644 index 00000000..e5ba64ca --- /dev/null +++ b/modules/nf-core/mygene/tests/main.nf.test @@ -0,0 +1,106 @@ +nextflow_process { + + name "Test Process MYGENE" + script "../main.nf" + process "MYGENE" + + tag "modules" + tag "modules_nfcore" + tag "mygene" + + test("mygene - default options") { + + tag "default" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - default options - gmt") }, + { assert snapshot(process.out.versions).match("mygene - default options - versions") } + ) + } + } + + test("mygene - default with tsv file") { + + tag "default_with_tsv" + config "./default_tsv.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - default with tsv file - gmt") }, + { assert snapshot(process.out.tsv).match("mygene - default with tsv file - tsv") }, + { assert snapshot(process.out.versions).match("mygene - default with tsv file - versions") } + ) + } + } + + test("mygene - filter by go category") { + + tag "filter_by_go_category" + config "./go_category.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - filter by go category - gmt") }, + { assert snapshot(process.out.versions).match("mygene - filter by go category - versions") } + ) + } + } + + test("mygene - filter by go evidence") { + + tag "filter_by_go_evidence" + config "./go_evidence.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - filter by go evidence - gmt") }, + { assert snapshot(process.out.versions).match("mygene - filter by go evidence - versions") } + ) + } + } +} diff --git a/modules/nf-core/mygene/tests/main.nf.test.snap b/modules/nf-core/mygene/tests/main.nf.test.snap new file mode 100644 index 00000000..d6a334c7 --- /dev/null +++ b/modules/nf-core/mygene/tests/main.nf.test.snap @@ -0,0 +1,135 @@ +{ + "mygene - filter by go evidence - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:31.854823" + }, + "mygene - default options - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:19:43.081388" + }, + "mygene - default with tsv file - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.837699" + }, + "mygene - default options - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:19:43.060437" + }, + "mygene - filter by go category - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:17.233994" + }, + "mygene - filter by go evidence - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,da6b31a5f889e3aedb16b4154f9652af" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:31.827798" + }, + "mygene - default with tsv file - tsv": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.tsv:md5,018e23173b224cbf328751006593900e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.81872" + }, + "mygene - default with tsv file - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.79811" + }, + "mygene - filter by go category - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,213c1d1d2345df8ea51d67cb1670f4f7" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:17.208509" + } +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/tags.yml b/modules/nf-core/mygene/tests/tags.yml new file mode 100644 index 00000000..c867c978 --- /dev/null +++ b/modules/nf-core/mygene/tests/tags.yml @@ -0,0 +1,2 @@ +mygene: + - "modules/nf-core/mygene/**" diff --git a/nextflow.config b/nextflow.config index 8fdf6e3f..2d7ba2c3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,6 @@ params { // Input options input = null - study_name = 'study' study_type = 'rnaseq' study_abundance_type = 'counts' @@ -217,7 +216,6 @@ params { // Config options config_profile_name = null config_profile_description = null - custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null @@ -225,6 +223,36 @@ params { // Schema validation default options validate_params = true + + // ---------------------------------------------- // + // Experimental analysis options // + // ---------------------------------------------- // + + tools = "${projectDir}/assets/tools_samplesheet.csv" + pathway = null + + // propd options + propd_alpha = null + propd_moderated = true + propd_fdr = 0.05 + propd_permutation = 0 + propd_ncutoffs = 100 + propd_weighted_degree = false + + // propr options + propr_metric = 'rho' + propr_ivar = 'clr' + propr_alpha = null + propr_fdr = 0.05 + propr_permutation = 100 + propr_ncutoffs = 100 + propr_tails = "right" + + // grea options + grea_set_min = 15 + grea_set_max = 500 + grea_permutation = 100 + } // Load base.config by default for all pipelines @@ -329,18 +357,17 @@ profiles { executor.cpus = 4 executor.memory = 8.GB } - test { includeConfig 'conf/test.config' } - test_nogtf { includeConfig 'conf/test_nogtf.config' } - test_full { includeConfig 'conf/test_full.config' } - affy { includeConfig 'conf/affy.config' } - maxquant { includeConfig 'conf/maxquant.config' } - rnaseq { includeConfig 'conf/rnaseq.config' } - rnaseq_limma { includeConfig 'conf/rnaseq_limma.config' } - test_rnaseq_limma { includeConfig 'conf/test_rnaseq_limma.config' } - soft { includeConfig 'conf/soft.config' } - test_affy { includeConfig 'conf/test_affy.config' } - test_maxquant { includeConfig 'conf/test_maxquant.config' } - test_soft { includeConfig 'conf/test_soft.config' } + test { includeConfig 'conf/test.config' } + test_nogtf { includeConfig 'conf/test_nogtf.config' } + test_full { includeConfig 'conf/test_full.config' } + affy { includeConfig 'conf/affy.config' } + maxquant { includeConfig 'conf/maxquant.config' } + rnaseq { includeConfig 'conf/rnaseq.config' } + soft {includeConfig 'conf/soft.config'} + test_affy { includeConfig 'conf/test_affy.config' } + test_maxquant { includeConfig 'conf/test_maxquant.config' } + test_soft {includeConfig 'conf/test_soft.config' } + test_experimental {includeConfig 'conf/test_experimental.config' } } // Load nf-core custom profiles from different Institutions diff --git a/nextflow_schema.json b/nextflow_schema.json index 1d11361d..e7837773 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -24,7 +24,7 @@ "default": "rnaseq", "description": "A string identifying the technology used to produce the data", "help_text": "Currently 'rnaseq' or 'affy_array' may be specified.", - "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file"], + "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file", "experimental"], "fa_icon": "far fa-keyboard" }, "input": { @@ -61,6 +61,31 @@ } } }, + "run_experimental_branch_through_the_toolsheet_config": { + "title": "Run experimental branch through the toolsheet config", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Values required for experimental analysis", + "properties": { + "tools": { + "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/csv", + "schema": "assets/schema_tools.json", + "pattern": "^\\S+\\.(csv|tsv|yaml)$", + "description": "Path to comma-separated file containing samplesheet", + "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline", + "default": "${projectDir}/assets/tools_samplesheet.csv" + }, + "pathway": { + "type": "string", + "fa_icon": "fas fa-border-all", + "description": "(experimantal only): Choose a (list of) pathway from those predefined in the tool sheet", + "help_text": "Choose the a subset of pathways to run. Pathways are defined in the tool sheet." + } + } + }, "abundance_values": { "title": "Abundance values", "type": "object", @@ -84,14 +109,12 @@ }, "affy_cel_files_archive": { "type": "string", - "default": "null", "description": "Alternative to matrix: a compressed CEL files archive such as often found in GEO", "fa_icon": "fas fa-file-archive", "help_text": "Use this option to provide a raw archive of CEL files from Affymetrix arrays. Will be ignored if a matrix is specified." }, "querygse": { "type": "string", - "default": "null", "description": "Use SOFT files from GEO by providing the GSE study identifier", "fa_icon": "fas fa-keyboard", "help_text": "Use this option to provide a GSE study identifier." @@ -738,29 +761,86 @@ }, "fa_icon": "fas fa-border-all" }, - "immunedeconv": { - "title": "IMMUNEDECONV", + "propd_specific_options": { + "title": "propd specific options", "type": "object", - "description": "", + "description": "Parameters to run differential proportionality", "default": "", "properties": { - "immunedeconv_run": { + "propd_alpha": { + "type": "string", + "default": "null", + "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." + }, + "propd_moderated": { + "type": "boolean", + "default": true, + "description": "Use moderated version of differential proportionality coefficients. This is usually needed when p>>n." + }, + "propd_fdr": { + "type": "number", + "default": 0.05, + "description": "FDR threshold for filtering the significant pairs." + }, + "propd_permutation": { + "type": "integer", + "default": 0, + "description": "When this parameter is 0, use the default statistical test to determine the FDR. When this number is > 0, run permutation test to get the FDR with as many permutations as defined by this parameter. Usually a minimum number of 100 permutations is needed." + }, + "propd_ncutoffs": { + "type": "integer", + "default": 100, + "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + }, + "propd_weighted_degree": { "type": "boolean", - "description": "Set to run IMMUNEDECONV", "default": false, - "fa_icon": "fas fa-running" + "description": "If true, use weighted degree to filter the hub genes. Otherwie, use the degree." + } + } + }, + "propr_specific_options": { + "title": "propr specific options", + "type": "object", + "description": "Parameters to run correlation analysis through propr package", + "default": "", + "properties": { + "propr_metric": { + "type": "string", + "default": "rho", + "description": "The correlation metric to use.", + "enum": ["rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink", "vlr", "phi", "phs"] }, - "immunedeconv_method": { + "propr_ivar": { "type": "string", - "description": "Set method to run with IMMUNEDECONV. Available options can be found in 'https://omnideconv.org/immunedeconv/articles/immunedeconv.html'", - "default": "quantiseq", - "fa_icon": "fas fa-running" + "default": "clr", + "description": "Which logratio transformation to use. 'clr' means centered logratio transformation, which uses the sample geometric mean as reference. 'alr' means additive logratio transformation, and it can use any gene or genes as reference(s). One can give the gene name(s) or index(es) as reference(s)." }, - "immunedeconv_function": { + "propr_alpha": { "type": "string", - "description": "Set function to run with IMMUNEDECONV. Available options can be found in 'https://omnideconv.org/immunedeconv/articles/immunedeconv.html'", - "default": "deconvolute", - "fa_icon": "fas fa-running" + "default": "null", + "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." + }, + "propr_fdr": { + "type": "number", + "default": 0.05, + "description": "FDR threshold for filtering the significant pairs." + }, + "propr_permutation": { + "type": "integer", + "default": 100, + "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given correlation coefficient value by chance." + }, + "propr_ncutoffs": { + "type": "integer", + "default": 100, + "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + }, + "propr_tails": { + "type": "string", + "default": "right", + "enum": ["right", "both"], + "description": "Use one-sided 'right'-tailed test or 'both' for two-sided test with symmetric cutpoints." } } }, @@ -987,6 +1067,29 @@ }, "fa_icon": "fas fa-layer-group" }, + "grea_specific_options": { + "title": "GREA specific options", + "type": "object", + "description": "Parameters to run GREA (Gene Ratio Enrichment Analysis)", + "default": "", + "properties": { + "grea_set_min": { + "type": "integer", + "default": 15, + "description": "Min size: exclude smaller sets" + }, + "grea_set_max": { + "type": "integer", + "default": 500, + "description": "Max size: exclude larger sets" + }, + "grea_permutation": { + "type": "integer", + "default": 100, + "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given odds ratio by chance." + } + } + }, "shiny_app_settings": { "title": "Shiny app settings", "type": "object", @@ -1265,6 +1368,9 @@ { "$ref": "#/$defs/input_output_options" }, + { + "$ref": "#/$defs/run_experimental_branch_through_the_toolsheet_config" + }, { "$ref": "#/$defs/abundance_values" }, @@ -1298,12 +1404,21 @@ { "$ref": "#/$defs/immunedeconv" }, + { + "$ref": "#/$defs/propd_specific_options" + }, + { + "$ref": "#/$defs/propr_specific_options" + }, { "$ref": "#/$defs/gsea" }, { "$ref": "#/$defs/gprofiler2" }, + { + "$ref": "#/$defs/grea_specific_options" + }, { "$ref": "#/$defs/shiny_app_settings" }, diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf new file mode 100644 index 00000000..bb46c5de --- /dev/null +++ b/subworkflows/local/correlation/main.nf @@ -0,0 +1,38 @@ +// +// Perform correlation analysis +// +include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" + +workflow CORRELATION { + take: + ch_counts // [ meta, counts] with meta keys: method, args_cor + + main: + + // initialize empty results channels + ch_matrix = Channel.empty() + ch_adjacency = Channel.empty() + ch_versions = Channel.empty() + + // branch tools to select the correct correlation analysis method + ch_counts + .branch { + propr: it[0]["method"] == "propr" + } + .set { ch_counts } + + // ---------------------------------------------------- + // Perform correlation analysis with propr + // ---------------------------------------------------- + PROPR(ch_counts.propr.unique()) + ch_matrix = PROPR.out.matrix.mix(ch_matrix) + ch_adjacency = PROPR.out.adjacency.mix(ch_adjacency) + ch_versions = ch_versions.mix(PROPR.out.versions) + + // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. + + emit: + matrix = ch_matrix // channel: [ csv ] + adjacency = ch_adjacency // channel: [ csv ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf new file mode 100644 index 00000000..a271f871 --- /dev/null +++ b/subworkflows/local/differential/main.nf @@ -0,0 +1,171 @@ +// +// Perform differential analysis +// +include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from "../../../modules/nf-core/deseq2/differential/main" +include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' +include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' +include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_DESEQ2 } from '../../../modules/local/filter_difftable' + +workflow DIFFERENTIAL { + take: + ch_counts // [ meta_exp, counts ] with meta keys: method, args_diff + ch_samplesheet // [ meta_exp, samplesheet ] + ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] + ch_transcript_lengths + ch_control_features + + main: + + // initialize empty results channels + ch_results_pairwise = Channel.empty() + ch_results_pairwise_filtered = Channel.empty() + ch_results_genewise = Channel.empty() + ch_results_genewise_filtered = Channel.empty() + ch_adjacency = Channel.empty() + ch_versions = Channel.empty() + + // branch tools to select the correct differential analysis method + ch_counts + .branch { + propd: it[0]["method"] == "propd" + deseq2: it[0]["method"] == "deseq2" + limma: it[0]["method"] == "limma" + } + .set { ch_counts } + + // ---------------------------------------------------- + // Perform differential analysis with propd + // ---------------------------------------------------- + + // TODO propd currently don't support blocking, so we should not run propd with same contrast_variable, reference and target, + // but different blocking variable, since it will simply run the same analysis again. + + ch_counts.propd + .combine(ch_samplesheet) + .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } + .combine(ch_contrasts) + .map { + meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_data.clone() + ['contrast': meta_contrast.id] + return [ meta, counts, samplesheet, contrast_variable, reference, target ] + } + .set { ch_propd } + + PROPD(ch_propd.unique()) + ch_results_pairwise = PROPD.out.results.mix(ch_results_pairwise) + ch_results_pairwise_filtered = PROPD.out.results_filtered.mix(ch_results_pairwise_filtered) + ch_results_genewise = PROPD.out.connectivity.mix(ch_results_genewise) + ch_results_genewise_filtered = PROPD.out.hub_genes.mix(ch_results_genewise_filtered) + ch_adjacency = PROPD.out.adjacency.mix(ch_adjacency) + ch_versions = PROPD.out.versions.mix(ch_versions) + + // ---------------------------------------------------- + // Perform differential analysis with DESeq2 + // ---------------------------------------------------- + + ch_counts.deseq2 + .combine(ch_samplesheet) + .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } + .combine(ch_contrasts) + .multiMap { + meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_data.clone() + meta_contrast.clone() + contrast: [ meta, contrast_variable, reference, target ] + samples_and_matrix: [ meta, samplesheet, counts ] + } + .set { ch_deseq2 } + + // do we need this process DESEQ2_NORM? + DESEQ2_NORM ( + ch_deseq2.contrast.first(), + ch_deseq2.samples_and_matrix, + ch_control_features, + ch_transcript_lengths + ) + + DESEQ2_DIFFERENTIAL ( + ch_deseq2.contrast, + ch_deseq2.samples_and_matrix, + ch_control_features, + ch_transcript_lengths + ) + + ch_norm_deseq2 = DESEQ2_NORM.out.normalised_counts + ch_differential_deseq2 = DESEQ2_DIFFERENTIAL.out.results + ch_model_deseq2 = DESEQ2_DIFFERENTIAL.out.model + ch_versions = DESEQ2_DIFFERENTIAL.out.versions.mix(ch_versions) + + ch_processed_matrices = ch_norm_deseq2 + if ('rlog' in params.deseq2_vs_method){ + ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) + } + if ('vst' in params.deseq2_vs_method){ + ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) + } + ch_processed_matrices = ch_processed_matrices + .map{ it.tail() } + + // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does + ch_logfc_deseq2 = Channel.value([ "log2FoldChange", params.differential_min_fold_change ]) + ch_padj_deseq2 = Channel.value([ "padj", params.differential_max_qval ]) + + FILTER_DIFFTABLE_DESEQ2( + ch_differential_deseq2, + ch_logfc_deseq2, + ch_padj_deseq2 + ) + + ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results.mix(ch_results_genewise) + ch_results_genewise_filtered = FILTER_DIFFTABLE_DESEQ2.out.filtered.mix(ch_results_genewise_filtered) + ch_versions = FILTER_DIFFTABLE_DESEQ2.out.versions.mix(ch_versions) + + // ---------------------------------------------------- + // Perform differential analysis with limma + // ---------------------------------------------------- + + // combine the input channels with the tools information + // in this way, limma will only be run if the user have specified it, as informed by ch_tools + ch_counts.limma + .combine(ch_samplesheet) + .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } + .combine(ch_contrasts) + .unique() + .multiMap { + meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_data.clone() + meta_contrast.clone() + input1: [ meta, contrast_variable, reference, target ] + input2: [ meta, samplesheet, counts ] + } + .set { ch_limma } + + + // run limma + LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) + ch_versions = LIMMA_DIFFERENTIAL.out.versions.mix(ch_versions) + + // filter results + // note that these are column names specific for limma output table + // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does + ch_logfc_limma = Channel.value([ "logFC", params.differential_min_fold_change ]) + ch_padj_limma = Channel.value([ "adj.P.Val", params.differential_max_qval ]) + FILTER_DIFFTABLE_LIMMA( + LIMMA_DIFFERENTIAL.out.results, + ch_logfc_limma, + ch_padj_limma + ) + + // collect results + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results.mix(ch_results_genewise) + ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered.mix(ch_results_genewise_filtered) + ch_versions = FILTER_DIFFTABLE_LIMMA.out.versions.mix(ch_versions) + + emit: + results_pairwise = ch_results_pairwise // channel: [ tsv ] + results_pairwise_filtered = ch_results_pairwise_filtered // channel: [ tsv ] + results_genewise = ch_results_genewise // channel: [ tsv ] + results_genewise_filtered = ch_results_genewise_filtered // channel: [ tsv ] + adjacency = ch_adjacency // channel: [ tsv ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf new file mode 100644 index 00000000..30006c19 --- /dev/null +++ b/subworkflows/local/enrichment/main.nf @@ -0,0 +1,153 @@ +// +// Perform enrichment analysis +// +include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" +include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" +include { GPROFILER2_GOST } from "../../../modules/nf-core/gprofiler2/gost/main.nf" + +include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' +include { CUSTOM_TABULARTOGSEAGCT } from '../../../modules/nf-core/custom/tabulartogseagct/main.nf' +include { CUSTOM_TABULARTOGSEACLS } from '../../../modules/nf-core/custom/tabulartogseacls/main.nf' +include { TABULAR_TO_GSEA_CHIP } from '../../../modules/local/tabular_to_gsea_chip' + +workflow ENRICHMENT { + take: + ch_counts // [ meta, counts] with meta keys: method, args_cor + ch_results_genewise // [ meta, results] with meta keys: method, args_cor + ch_results_genewise_filtered // [ meta, results] with meta keys: method, args_cor + ch_adjacency // [ meta, adj_matrix] with meta keys: method, args_cor + ch_contrasts + ch_samplesheet + ch_featuresheet + ch_gene_sets + + // TODO: add ch_gm when provided by user, etc. + + main: + + // initialize empty results channels + ch_enriched = Channel.empty() + ch_gmt = Channel.empty() + ch_versions = Channel.empty() + + ch_counts + .branch { + gsea: it[0]["method"] == "gsea" + } + .set { ch_counts } + + ch_adjacency + .branch { + grea: it[0]["method"] == "grea" + } + .set { ch_adjacency } + + // ---------------------------------------------------- + // Construct gene set database + // ---------------------------------------------------- + + // TODO this should be optional, only run when there is no gene set data provided by user + // TODO Use ch_gene_sets if it is not null + MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline + ch_gmt = MYGENE.out.gmt + ch_versions = ch_versions.mix(MYGENE.out.versions) + + // ---------------------------------------------------- + // Perform enrichment analysis with GREA + // ---------------------------------------------------- + + GREA(ch_adjacency.grea.unique(), ch_gmt.collect()) + ch_enriched = ch_enriched.mix(GREA.out.results) + ch_versions = ch_versions.mix(GREA.out.versions) + + // ---------------------------------------------------- + // Perform enrichment analysis with GSEA + // ---------------------------------------------------- + + // For GSEA, we need to convert normalised counts to a GCT format for + // input, and process the sample sheet to generate class definitions + // (CLS) for the variable used in each contrast + + CUSTOM_TABULARTOGSEAGCT ( ch_counts ) + + // TODO: update CUSTOM_TABULARTOGSEACLS for value channel input per new + // guidlines (rather than meta usage employed here) + ch_contrasts_and_samples = ch_contrasts + .map{it[0]} // revert back to contrasts meta map + .combine( ch_samplesheet.map { it[1] } ) + + CUSTOM_TABULARTOGSEACLS(ch_contrasts_and_samples) + + TABULAR_TO_GSEA_CHIP( + ch_featuresheet.map{ it[1] }, + [params.features_id_col, params.features_name_col] + ) + + // The normalised matrix does not always have a contrast meta, so we + // need a combine rather than a join here + // Also add file name to metamap for easy access from modules.config + // TODO combine the input channel with the ch_tools + + ch_gsea_inputs = CUSTOM_TABULARTOGSEAGCT.out.gct + .map{ it.tail() } + .combine(CUSTOM_TABULARTOGSEACLS.out.cls) + .map{ tuple(it[1], it[0], it[2]) } + .combine( ch_gmt.map { meta, gmt -> gmt } ) + + println("__"+TABULAR_TO_GSEA_CHIP.out.chip) + GSEA_GSEA( + ch_gsea_inputs, + ch_gsea_inputs.map{ tuple(it[0].reference, it[0].target) }, // * + TABULAR_TO_GSEA_CHIP.out.chip.first() + ) + + // * Note: GSEA module currently uses a value channel for the mandatory + // non-file arguments used to define contrasts, hence the indicated + // usage of map to perform that transformation. An active subject of + // debate + GSEA_GSEA.out.report_tsvs_ref.view() + ch_gsea_results = GSEA_GSEA.out.report_tsvs_ref + .join(GSEA_GSEA.out.report_tsvs_target) + + ch_enriched = ch_enriched.combine(ch_gsea_results) + + + // Record GSEA versions + ch_versions = ch_versions + .mix(TABULAR_TO_GSEA_CHIP.out.versions) + .mix(GSEA_GSEA.out.versions) + + + // ---------------------------------------------------- + // Perform enrichment analysis with gprofiler2 + // ---------------------------------------------------- + + // todo: add gprofiler2 here + + // Define background file + if (!params.gprofiler2_background_file) { + // If deactivated, use empty list as "background" + ch_background = [] + } else if (params.gprofiler2_background_file == "auto") { + // If auto, use input matrix as background + ch_background = ch_counts.map { meta, counts -> counts } + } else { + ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) + } + + // rearrange channel for GPROFILER2_GOST process + ch_gmt = ch_gmt.map { meta, gmt -> gmt } + + ch_results_genewise_filtered + .branch { + grea: it[0]["method"] == "gprofiler2" + } + .set { ch_results_genewise_filtered } + + GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) + ch_versions = ch_versions.mix(GPROFILER2_GOST.out.versions) + + emit: + enriched = ch_enriched // channel: [ tsv ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf new file mode 100644 index 00000000..b08e92b9 --- /dev/null +++ b/subworkflows/local/experimental/main.nf @@ -0,0 +1,134 @@ +// +// Run experimental analysis +// +include { DIFFERENTIAL } from '../differential/main.nf' +include { CORRELATION } from '../correlation/main.nf' +include { ENRICHMENT } from '../enrichment/main.nf' + +def preprocess_subworkflow_output( ch_input, ch_tools_args, method_field_name) { + // add method arguments to channel meta + return ch_input + .combine(ch_tools_args) + .filter{ meta, input, pathway, arg_maps -> meta["pathway_name"] ? meta["pathway_name"] == pathway["pathway_name"] : true } + .map{ meta, input, pathway, arg_map -> + def meta_clone = meta.clone() + pathway + arg_map.clone() + meta_clone["method"] = meta_clone.remove(method_field_name) + return [meta_clone, input] + } +} + +def postprocess_subworkflow_output( ch_results, field_name ) { + // clean up meta data by removing tool arguments + return ch_results + .map{ meta, data -> + def meta_clone = meta.clone() + meta_clone.removeAll{it.key in field_name} + return [meta_clone, data] + } +} + +workflow EXPERIMENTAL { + take: + ch_contrasts // [ meta, contrast_variable, reference, target ] + ch_samplesheet // [ meta, samplesheet ] + ch_featuresheet // [ meta, featuresheet ] + ch_gene_sets + ch_counts // [ meta, counts] + ch_tools // [ pathway_name, differential_map, correlation_map, enrichment_map ] + ch_transcript_lengths + ch_control_features + + main: + + ch_versions = Channel.empty() + + // split toolsheet into channels + ch_tools.count() + .combine(ch_tools) + .multiMap{ + n, pathway, differential_map, correlation_map, enrichment_map -> + def pathway_name = n == 1 ? ["pathway_name":""] : pathway + diff: [ pathway_name, differential_map ] + corr: [ pathway_name, correlation_map ] + enr: [ pathway_name, enrichment_map ] + } + .set{ ch_tools } + + // initialize empty results channels + ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table + ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table + ch_results_genewise = Channel.empty() // differential results for genewise analysis - it should be a table + ch_results_genewise_filtered = Channel.empty() // differential results for genewise analysis - filtered - it should be a table + ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 + ch_matrix = Channel.empty() // correlation matrix + ch_enriched = Channel.empty() // output table from enrichment analysis + + // ---------------------------------------------------- + // DIFFERENTIAL ANALYSIS BLOCK + // ---------------------------------------------------- + + preprocess_subworkflow_output(ch_counts, ch_tools.diff, "diff_method") + .set{ ch_counts_diff } + DIFFERENTIAL( + ch_counts_diff, + ch_samplesheet, + ch_contrasts, + ch_transcript_lengths, + ch_control_features + ) + ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,["method", "args_diff"]).mix(ch_results_pairwise) + ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,["method", "args_diff"]).mix(ch_results_pairwise_filtered) + ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,["method", "args_diff"]).mix(ch_results_genewise) + ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,["method", "args_diff"]).mix(ch_results_genewise_filtered) + ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,["method", "args_diff"]).mix(ch_adjacency) + ch_versions = ch_versions.mix(DIFFERENTIAL.out.versions) + + // ---------------------------------------------------- + // CORRELATION ANALYSIS BLOCK + // ---------------------------------------------------- + + preprocess_subworkflow_output(ch_counts, ch_tools.corr, "cor_method") + .set{ ch_counts_corr } + + CORRELATION( + ch_counts_corr + ) + ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,["method", "args_cor"]).mix(ch_matrix) + ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,["method", "args_cor"]).mix(ch_adjacency) + ch_versions = ch_versions.mix(CORRELATION.out.versions) + + // ---------------------------------------------------- + // FUNCTIONAL ENRICHMENT BLOCK + // ---------------------------------------------------- + + preprocess_subworkflow_output(ch_counts, ch_tools.enr, "enr_method") + .set{ ch_counts_enr } + preprocess_subworkflow_output(ch_results_genewise, ch_tools.enr, "enr_method") + .set{ ch_results_genewise_enr } + preprocess_subworkflow_output(ch_results_genewise_filtered, ch_tools.enr, "enr_method") + .set{ ch_results_genewise_filtered_enr } + preprocess_subworkflow_output(ch_adjacency, ch_tools.enr, "enr_method") + .set{ ch_adjacency_enr } + + ENRICHMENT( + ch_counts_enr, + ch_results_genewise_enr, + ch_results_genewise_filtered_enr, + ch_adjacency_enr, + ch_contrasts, + ch_samplesheet, + ch_featuresheet, + ch_gene_sets + ) + ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) + ch_versions = ch_versions.mix(ENRICHMENT.out.versions) + + // ---------------------------------------------------- + // VISUALIZATION BLOCK + // ---------------------------------------------------- + + // TODO: call visualization stuff here + + emit: + versions = ch_versions +} diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 23b99506..b0d0dcf8 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -43,10 +43,10 @@ if (params.study_type == 'affy_array') { error("Query GSE not specified or features metadata columns not specified") } } else { - // If this is not microarray data or maxquant output, and this an RNA-seq dataset, + // If this is not microarray data or maxquant output, and this an RNA-seq dataset or experimental analysis, // then assume we're reading from a matrix - if (params.study_type == "rnaseq" && params.matrix) { + if (params.study_type in ["rnaseq", "experimental"] && params.matrix) { matrix_file = file(params.matrix, checkIfExists: true) ch_in_raw = Channel.of([ exp_meta, matrix_file]) } else { @@ -61,8 +61,8 @@ if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run +ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (run_gene_set_analysis) { - ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (params.gene_sets_files) { gene_sets_files = params.gene_sets_files.split(",") ch_gene_sets = Channel.of(gene_sets_files).map { file(it, checkIfExists: true) } @@ -98,8 +98,10 @@ citations_file = file(params.citations_file, checkIfExists: true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabulartogseachip' -include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' +include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabular_to_gsea_chip' +include { FILTER_DIFFTABLE } from '../modules/local/filter_difftable' +include { EXPERIMENTAL } from '../subworkflows/local/experimental/main.nf' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -134,6 +136,8 @@ include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/n include { IMMUNEDECONV } from '../modules/nf-core/immunedeconv/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { samplesheetToList } from 'plugin/nf-schema' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -307,7 +311,7 @@ workflow DIFFERENTIALABUNDANCE { ch_norm = VALIDATOR.out.assays } - if(params.study_type != 'rnaseq') { + if(params.study_type !in ['rnaseq', 'experimental']) { ch_matrix_for_differential = ch_norm } else{ @@ -366,6 +370,52 @@ workflow DIFFERENTIALABUNDANCE { ch_processed_matrices = ch_norm .map{ it.tail() } .first() +<<<<<<< HEAD +======= + } else if (params.study_type == 'experimental') { + + // Convert the toolsheet.csv in a channel with the proper format + ch_tools = Channel.fromList(samplesheetToList(params.tools, './assets/schema_tools.json')) + .map { + it -> + def pathway_name = it[0].subMap(["pathway_name"]) + def differential_map = it[0].subMap(["diff_method","args_diff"]) + def correlation_map = it[0].subMap(["cor_method","args_cor"]) + def enrichment_map = it[0].subMap(["enr_method","args_enr"]) + [ pathway_name, differential_map, correlation_map, enrichment_map ] + }.unique() + + // Filter the tools to the pathway(s) of interest, or run everything if requested + if (params.pathway == "all") { + ch_tools + .set{ ch_tools } + } else { + ch_tools + .filter{ + it[0]["pathway_name"] in params.pathway.tokenize(',') + } + .set{ ch_tools } + } + + EXPERIMENTAL( + ch_contrasts, + VALIDATOR.out.sample_meta, + VALIDATOR.out.feature_meta, + ch_gene_sets, + CUSTOM_MATRIXFILTER.out.filtered, + ch_tools, + ch_transcript_lengths, + ch_control_features + ) + + // TODO for the moment, these channels are allocated to not breaking the next part. + // they have to be properly handled afterwards + ch_norm = Channel.empty() + ch_differential = Channel.empty() + ch_processed_matrices = Channel.empty() + ch_model = Channel.empty() + } else { +>>>>>>> origin/dev-ratio } else { DESEQ2_NORM ( @@ -496,7 +546,6 @@ workflow DIFFERENTIALABUNDANCE { } // For gprofiler2, token and organism have priority and will override a gene_sets file - GPROFILER2_GOST( ch_filtered_diff, ch_gene_sets.first(), From 4ae788897d5f0520fca7e589df0c2ab6ee410d34 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 27 Jan 2025 15:04:00 +0100 Subject: [PATCH 02/29] Revert squashed commit of dev-ratio to updated dev code. The purpose is to keep the contribution record, but the dev code clean. This reverts commit a64d4d7df121e71813c396e182e388149465e35e. --- .github/workflows/ci.yml | 10 +- .nf-core.yml | 1 - CHANGELOG.md | 10 + assets/schema_tools.json | 45 -- assets/tools_samplesheet.csv | 13 - conf/modules.config | 84 --- conf/test_experimental.config | 52 -- modules.json | 5 - modules/local/propr/grea/main.nf | 24 - modules/local/propr/grea/templates/grea.R | 279 ------- modules/local/propr/propd/main.nf | 33 - modules/local/propr/propd/templates/propd.R | 713 ------------------ modules/local/propr/propr/main.nf | 27 - modules/local/propr/propr/templates/propr.R | 318 -------- modules/nf-core/mygene/environment.yml | 7 - modules/nf-core/mygene/main.nf | 23 - modules/nf-core/mygene/meta.yml | 54 -- modules/nf-core/mygene/templates/mygene.py | 347 --------- .../nf-core/mygene/tests/default_tsv.config | 3 - .../nf-core/mygene/tests/go_category.config | 3 - .../nf-core/mygene/tests/go_evidence.config | 3 - modules/nf-core/mygene/tests/main.nf.test | 106 --- .../nf-core/mygene/tests/main.nf.test.snap | 135 ---- modules/nf-core/mygene/tests/tags.yml | 2 - nextflow.config | 55 +- nextflow_schema.json | 149 +--- subworkflows/local/correlation/main.nf | 38 - subworkflows/local/differential/main.nf | 171 ----- subworkflows/local/enrichment/main.nf | 153 ---- subworkflows/local/experimental/main.nf | 134 ---- workflows/differentialabundance.nf | 63 +- 31 files changed, 53 insertions(+), 3007 deletions(-) delete mode 100644 assets/schema_tools.json delete mode 100644 assets/tools_samplesheet.csv delete mode 100644 conf/test_experimental.config delete mode 100644 modules/local/propr/grea/main.nf delete mode 100644 modules/local/propr/grea/templates/grea.R delete mode 100644 modules/local/propr/propd/main.nf delete mode 100644 modules/local/propr/propd/templates/propd.R delete mode 100644 modules/local/propr/propr/main.nf delete mode 100644 modules/local/propr/propr/templates/propr.R delete mode 100644 modules/nf-core/mygene/environment.yml delete mode 100644 modules/nf-core/mygene/main.nf delete mode 100644 modules/nf-core/mygene/meta.yml delete mode 100644 modules/nf-core/mygene/templates/mygene.py delete mode 100644 modules/nf-core/mygene/tests/default_tsv.config delete mode 100644 modules/nf-core/mygene/tests/go_category.config delete mode 100644 modules/nf-core/mygene/tests/go_evidence.config delete mode 100644 modules/nf-core/mygene/tests/main.nf.test delete mode 100644 modules/nf-core/mygene/tests/main.nf.test.snap delete mode 100644 modules/nf-core/mygene/tests/tags.yml delete mode 100644 subworkflows/local/correlation/main.nf delete mode 100644 subworkflows/local/differential/main.nf delete mode 100644 subworkflows/local/enrichment/main.nf delete mode 100644 subworkflows/local/experimental/main.nf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14c77428..15e73b37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,11 +39,11 @@ jobs: - "latest-stable" test_profile: - "test" - - "test_nogtf" - - "test_affy" - - "test_maxquant" - - "test_soft" - - "test_experimental" + - "nogtf" + - "affy" + - "maxquant" + - "soft" + - "rnaseq_limma" compute_profile: - "docker" - "singularity" diff --git a/.nf-core.yml b/.nf-core.yml index 29a057fb..af82ac6a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,6 @@ lint: - params.css_file - params.citations_file - params.report_file - - params.tools multiqc_config: False files_exist: - assets/multiqc_config.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d1ca320..9f8e3816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.6.0dev - xxxx-xx-xx +### Added + +- [[#421](https://github.com/nf-core/differentialabundance/pull/421)] - Add immunedeconv module ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) +- [[#380](https://github.com/nf-core/differentialabundance/pull/380)] - Replace local filter_diff_table module with nf-core one, and create nf-tests for tabular_to_gsea_chip. ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) +- [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Added software version check in nf-tests and gene biotype column check in `.Rmd` ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) +- [[#354](https://github.com/nf-core/differentialabundance/pull/354)] - Warning message within the R Markdown report to control when genes don't have annotation data ([@alanmmobbs93](https://github.com/alanmmobbs93)). Review by [@WackerO](https://github.com/WackerO) and [@pinin4fjords](https://github.com/pinin4fjords). +- [[#345](https://github.com/nf-core/differentialabundance/pull/345)] - Plot differentially expressed genes by gene biotype ([@atrigila](https://github.com/atrigila), review by [@grst](https://github.com/grst)) +- [[#343](https://github.com/nf-core/differentialabundance/pull/343)] - Add pipeline-level nf-tests ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords) and [@nschcolnicov](https://github.com/nschcolnicov)) +- [[#286](https://github.com/nf-core/differentialabundance/pull/286)] - Integration of limma voom for rnaseq data ([@KamilMaliszArdigen](https://github.com/KamilMaliszArdigen), review by [@pinin4fjords](https://github.com/pinin4fjords)) + ### Fixed - [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Fixed nf-tests not running due to `--changed-since HEAD^`([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) diff --git a/assets/schema_tools.json b/assets/schema_tools.json deleted file mode 100644 index dcbbe9f8..00000000 --- a/assets/schema_tools.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "nf-core/differentialabundance - params.tools schema", - "description": "Schema for the file provided with params.tools", - "type": "array", - "items": { - "type": "object", - "properties": { - "pathway_name": { - "type": "string", - "meta": ["pathway_name"] - }, - "diff_method": { - "type": "string", - "errorMessage": "choose a differential analysis method (eg. deseq2, limma, propd) or none", - "meta": ["diff_method"], - "enum": ["propd", "deseq2", "limma", "none"] - }, - "args_diff": { - "type": "string", - "meta": ["args_diff"] - }, - "cor_method": { - "type": "string", - "meta": ["cor_method"], - "errorMessage": "choose a correlation method (eg. propr) or none", - "enum": ["propr", "none"] - }, - "args_cor": { - "type": "string", - "meta": ["args_cor"] - }, - "enr_method": { - "type": "string", - "meta": ["enr_method"], - "errorMessage": "choose a functional enrichment analysis method (eg. gsea, grea, gprofiler, etc) or none" - }, - "args_enr": { - "type": "string", - "meta": ["args_enr"] - } - }, - "required": [] - } -} diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv deleted file mode 100644 index 94592a22..00000000 --- a/assets/tools_samplesheet.csv +++ /dev/null @@ -1,13 +0,0 @@ -pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr -propd,propd,,,,, -propd_fdr,propd,--permutation 100,,,, -propd_grea,propd,,,,grea, -propd_ora,propd,,,,gprofiler2, -deseq2_gsea,deseq2,,,,gsea, -deseq2_ora,deseq2,,,,gprofiler2, -limma,limma,,,,, -limma_ora,limma,,,,gprofiler2, -pcorbshrink,,,propr,--metric pcor.bshrink,, -propr,,,propr,--metric rho,, -cor,,,propr,--metric cor,, -deseq2,deseq2,,,,, diff --git a/conf/modules.config b/conf/modules.config index 043183df..fe083970 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -499,88 +499,4 @@ process { enabled: false ] } - - // TODO - // for the moment, the parameters from toolsheet are parsed here. - // For the repeated arguments, since the R argument parser will only take the first one, - // here I add the toolsheet arguments at the beginning of ext.args to make sure they are - // taken into account instead of the default options. - // However, later we need to better handle this, maybe by a bit of groovy scripting to - // overwrite the repeated parameters (?) - - withName: "PROPR"{ - tag = { [ - "$meta.id", - (meta.args_cor ? "args_cor = $meta.args_cor" : '') - ].join(',').trim() } - ext.args = { [ - (meta.args_cor ? "${meta.args_cor}" : ''), - "--features_id_col ${params.features_id_col}", - "--metric ${params.propr_metric}", - "--ivar ${params.propr_ivar}", - (params.propr_alpha ? "--alpha ${params.propr_alpha}" : ''), - "--fdr ${params.propr_fdr}", - "--tails ${params.propr_tails}", - "--permutation ${params.propr_permutation}", - "--number_of_cutoffs ${params.propr_ncutoffs}" - ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/correlation_analysis/propr-${meta.pathway_name ?: params.pathway}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "PROPD"{ - tag = { [ - "$meta.id", - "$meta.contrast", - (meta.args_diff ? "args_diff = $meta.args_diff" : '') - ].join(',').trim() } - ext.args = { [ - (meta.args_diff ? "${meta.args_diff}" : ''), - "--features_id_col ${params.features_id_col}", - "--obs_id_col ${params.observations_id_col}", - (params.propd_alpha ? "--alpha ${params.propd_alpha}" : ''), - "--moderated ${params.propd_moderated}", - "--fdr ${params.propd_fdr}", - "--permutation ${params.propd_permutation}", - "--number_of_cutoffs ${params.propd_ncutoffs}", - "--weighted_degree ${params.propd_weighted_degree}" - ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/differential_analysis/propr-${meta.pathway_name ?: params.pathway}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "GREA"{ - tag = { [ - "$meta.id", - (meta.args_enr ? "args_enr = $meta.args_enr" : '') - ].join(',').trim() } - ext.args = { [ - (meta.args_enr ? "${meta.args_enr}" : ''), - "--set_min ${params.grea_set_min}", - "--set_max ${params.grea_set_max}", - "--permutation ${params.grea_permutation}" - ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/enrichment_analysis/propr-${meta.pathway_name ?: params.pathway}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: "MYGENE" { - ext.args = [ - "--columname ${params.features_id_col}" - ].join(' ').trim() - publishDir = [ - path: "${params.outdir}/enrichment_analysis/mygene", - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } diff --git a/conf/test_experimental.config b/conf/test_experimental.config deleted file mode 100644 index d85f52a4..00000000 --- a/conf/test_experimental.config +++ /dev/null @@ -1,52 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests without a GTF -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple - pipeline test of the CoDA experimental mode. - - Use as follows: - nextflow run nf-core/differentialabundance -profile test_nogtf, --outdir - ----------------------------------------------------------------------------------------- -*/ - -process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h' - ] -} - -params { - study_name = 'SRP254919' - study_type = 'experimental' - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - - // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' - matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' - contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - deseq2_vst_nsub = 900 // only 982 features in this dataset, so nsub=1000 not feasible - pathway = "propd,propd_grea,limma,propr,cor,propd_ora,limma_ora,deseq2_ora,deseq2" - - // some pathways are not included in the test, because they don't make sense to test for this dataset - // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped - // and pcor.bshrink is taking too long for this test (15min), and it should be tested on matrices with n > p, or n close to p. (eg. specific pathways, or on DE genes only, etc) - - //Features - features_metadata_cols = 'gene_id,gene_name' - - // Observations - observations_id_col = 'sample' - observations_name_col = 'sample' - - // Apply a higher filter to check that the filtering works - filtering_min_abundance = 10 - - // Exploratory - exploratory_main_variable = 'contrasts' - -} diff --git a/modules.json b/modules.json index e9ee1102..094bfc3e 100644 --- a/modules.json +++ b/modules.json @@ -70,11 +70,6 @@ "git_sha": "136f443c0a6d5c526410c7c9b73ce51ef457c341", "installed_by": ["modules"] }, - "mygene": { - "branch": "master", - "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", - "installed_by": ["modules"] - }, "proteus/readproteingroups": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf deleted file mode 100644 index 2b503133..00000000 --- a/modules/local/propr/grea/main.nf +++ /dev/null @@ -1,24 +0,0 @@ -process PROPR_GREA { - tag "$meta.id" - label 'process_high' - - // conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" - - input: - tuple val(meta), path(adj) - tuple val(meta2), path(gmt) - - output: - tuple val(meta), path("*.grea.tsv"), emit: results - path "versions.yml", emit: versions - path "*.R_sessionInfo.log", emit: session_info - - when: - task.ext.when == null || task.ext.when - - script: - template 'grea.R' -} diff --git a/modules/local/propr/grea/templates/grea.R b/modules/local/propr/grea/templates/grea.R deleted file mode 100644 index f5d50374..00000000 --- a/modules/local/propr/grea/templates/grea.R +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env Rscript - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files (determined by file extension) -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension - - if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file - separator <- "\\t" # Set the separator variable to tab - } else if (ext == "csv") { # If the file is a csv file - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( # Read the file - file, - sep = separator, # Set the separator defined above - header = header, - row.names = row.names, - check.names = check.names - ) -} - -#' Loads the .gmt file and converts it into a knowledge database -#' -#' @param filename path of the .gmt file -#' @param genes vector of gene names. Note that this set should be as complete as possible. -#' So it should not only contain the target genes but also the background genes. -#' @return output a list with: `db` A knowledge database where each row is a graph node (eg. gene) -#' and each column is a concept (eg. GO term, pathway, etc) and `description` A list of descriptions -#' for each concept -load_gmt <- function(filename, nodes) { - - # read gmt file - gmt <- readLines(filename) - gmt <- strsplit(gmt, "\\t") - - # initialize database matrix - db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) - rownames(db) <- nodes - colnames(db) <- sapply(gmt, function(entry) entry[[1]]) - - # description of the concepts - description <- list() - - # for concept in gmt - for (i in 1:length(gmt)) { - - # get concept and description - concept <- gmt[[i]][[1]] - description[[concept]] <- gmt[[i]][[2]] - - # fill 1 if gene is in concept - nodes_in_concept <- gmt[[i]][-c(1, 2)] - nodes_in_concept <- nodes_in_concept[nodes_in_concept %in% nodes] - db[nodes_in_concept, i] <- 1 - } - - return(list(db = db, description = description)) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -# Set defaults and classes - -opt <- list( - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - - # input data - adj = '$adj', # adjacency matrix - gmt = '$gmt', # knowledge database .gmt file - - # parameters for gene sets - set_min = 15, # minimum number of genes in a set - set_max = 500, # maximum number of genes in a set - - # parameters for permutation test - permutation = 100, - - # other options - seed = NA, - ncores = as.integer('$task.cpus') -) - -opt_types <- list( - prefix = 'character', - adj = 'character', - gmt = 'character', - set_min = 'numeric', - set_max = 'numeric', - permutation = 'numeric', - seed = 'numeric', - ncores = 'numeric' -) - -# Apply parameter overrides - -args_opt <- parse_args('$task.ext.args') -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - - # handle NA, and avoid errors when NA is provided by user as character - if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA - - # replace values - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided - -required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -# Check file inputs are valid -for (file_input in c('adj', 'gmt')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -# TODO maybe add a function to pretty print the arguments? -print(opt) - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(propr) - -################################################ -################################################ -## Enrichment analysis ## -################################################ -################################################ - -# set seed when required - -if (!is.na(opt\$seed)) { - warning('Setting seed ', opt\$seed, ' for reproducibility') - set.seed(opt\$seed) -} - -# load adjacency matrix -# this matrix should have gene x gene dimensions - -adj <- as.matrix(read_delim_flexible( - opt\$adj, - header = TRUE, - row.names = 1, - check.names = TRUE -)) -if (nrow(adj) != ncol(adj)) { - stop('Adjacency matrix is not square') -} -if (!all(rownames(adj) == colnames(adj))) { - stop('Adjacency matrix row names are not equal to column names') -} - -# load and process knowledge database - -gmt <- load_gmt( - opt\$gmt, - rownames(adj) -) - -# filter gene sets -# gene sets with less than set_min or more than set_max genes are removed - -idx <- which(colSums(gmt\$db) > opt\$set_min & colSums(gmt\$db) < opt\$set_max) -gmt\$db <- gmt\$db[, idx] -gmt\$description <- gmt\$description[idx] - -# run GREA -# Basically, it calculates the odds ratio of the graph being enriched in each concept, -# and the FDR of the odds ratio through permutation tests - -odds <- runGraflex( - adj, - gmt\$db, - p=opt\$permutation, - ncores=opt\$ncores -) -odds\$Description <- sapply(odds\$Concept, function(concept) - gmt\$description[[concept]] -) - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -write.table( - odds, - file = paste0(opt\$prefix, '.grea.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE - -) - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf deleted file mode 100644 index 8bfd9e3a..00000000 --- a/modules/local/propr/propd/main.nf +++ /dev/null @@ -1,33 +0,0 @@ -process PROPR_PROPD { - tag "$meta.id" - label 'process_medium' - - // conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" - - input: - tuple val(meta), path(count), path(samplesheet), val(contrast_variable), val(reference), val(target) - - output: - tuple val(meta), path("*.propd.rds") , emit: rds - tuple val(meta), path("*.propd.results.tsv") , emit: results - tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered, optional: true - tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional: true - tuple val(meta), path("*.propd.connectivity.tsv") , emit: connectivity , optional: true - tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes , optional: true - tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true - tuple val(meta), path("*.propd.red_pairs.pdf") , emit: red_pairs , optional: true - tuple val(meta), path("*.propd.yellow_pairs.pdf") , emit: yellow_pairs , optional: true - tuple val(meta), path("*.propd.green_pairs.pdf") , emit: green_pairs , optional: true - path "*.warnings.log" , emit: warnings - path "*.R_sessionInfo.log" , emit: session_info - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template 'propd.R' -} diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R deleted file mode 100644 index c4aae21a..00000000 --- a/modules/local/propr/propd/templates/propd.R +++ /dev/null @@ -1,713 +0,0 @@ -#!/usr/bin/env Rscript - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header, - row.names = row.names, - check.names = check.names - ) -} - -#' Get connectivity of genes from adjacency matrix -#' -#' The connectivity of a gene is the number of connections it has with other genes. -#' In other words, the degree of a gene. This connectivity can be weighted. In this -#' way, the strength of the theta value can be taken into account. -#' These information can be used to summarize the network and identify genes that are -#' potentially changing between groups. -#' -#' @param pd propd object -#' @param adj Adjacency matrix -#' @param de Differential proportionality values for each gene with respect to the -#' normalization reference -#' @param cutoff Cutoff value for de values to be considered significant -#' -#' @return data frame with the following columns: gene_id, degree, weighted_degree, -#' genewise_theta, average_theta, classification -get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ - - # initialize empty data frame - connectivity <- data.frame(matrix(NA, nrow=ncol(pd@counts), ncol=6)) - colnames(connectivity) <- c( - features_id_col, - 'degree', - 'weighted_degree', - 'genewise_theta', - 'average_theta', - 'classification' - ) - - # add features ids - connectivity[,1] <- colnames(pd@counts) - - # add degree - # degree is the number of connections a gene has with other genes - connectivity[,2] <- colSums(adj) - - # add weighted degree - # each connection is weighted by the theta value - # so lower theta values (higher between group variance than within group variance) will have a higher weight - # NOTE this is a placeholder for the proper weighted degree, maybe we are gonna change the way how we compute it - mat <- getMatrix(pd) - diag(mat) <- NA - connectivity[,3] <- colSums((1 - mat) * adj, na.rm=TRUE) - - # add genewise theta - # a theta value can be associated to each gene by calculating the between group variance vs within group variance - # of the gene normalized with respect to a reference (in this case the geometric mean of the sample) - connectivity[,4] <- de - - # add average theta of the connections - connectivity[,5] <- colSums(mat * adj, na.rm=TRUE) / colSums(adj) - - # classification - # green for DE genes, and red for non-DE genes - connectivity[,6] <- 'green' - connectivity[which(de > cutoff), 6] <- 'red' - - return(connectivity) -} - -#' Determine hub genes based on connectivity -#' -#' Here hub genes are those that have a degree higher than the expected degree. -#' The expected degree is the number of connections that each gene would have -#' if the connections were distributed uniformly. In other words, the average -#' degree by node. -#' -#' @param connectivity Data frame with connectivity -#' @param cutoff Theta value for which DP pairs are considered significant. -#' @param weighted Boolean. If TRUE, use weighted degree to determine hub genes. -#' Otherwise, use degree. -#' -#' @return filtered and sorted connectivity data frame with hub genes -get_hub_genes <- function(connectivity, cutoff, weighted=FALSE){ - - # get the expected degree - total_degree <- if (weighted) sum(connectivity\$weighted_degree) else sum(connectivity\$degree) - n_nodes <- sum(connectivity\$degree > 0) - expected_degree <- total_degree / n_nodes - - # get hub genes - hub_genes <- connectivity[which(connectivity\$degree > expected_degree),] - - # sort hub genes - if (weighted) { - hub_genes <- hub_genes[order(hub_genes\$weighted_degree, decreasing=TRUE),] - } else { - hub_genes <- hub_genes[order(hub_genes\$degree, decreasing=TRUE),] - } - - return(hub_genes) -} - -#' Plot pairs of genes -#' -#' This function plots the following pairs of genes: -#' - xy vs sample -#' - x vs y -#' - x vs sample -#' - y vs sample -#' - xr vs yr -#' - xr vs sample -#' - yr vs sample -#' The pairs are colored according to the group they belong to. -#' -#' @param df Data frame with the following columns: xy, x, y, xr, yr, sample, group, color -#' @param x Name of the gene x -#' @param y Name of the gene y -#' @param title Title of the plot -plot_pairs <- function(df, x, y, title){ - - # Define the layout - layout_matrix <- matrix(c( - 0, 1, 8, # First row - 2, 3, 4, # Second row - 5, 6, 7 # Third row - ), nrow = 3, ncol = 3, byrow = TRUE) - layout(layout_matrix, widths = c(1, 1, 1), heights = c(1, 1, 1)) - - # Adjust margins and text sizes - par(mar = c(4, 4, 1, 1), cex = 1.5, lwd = 1.5) - - # plot xy vs sample - plot(x=df\$sample, y=df\$xy, xlab='sample', ylab=paste0(x, '/', y), col=df\$color) - - # plot x vs y - plot(x=df\$x, y=df\$y, xlab=x, ylab=y, col=df\$color) - - # plot x vs sample - plot(x=df\$sample, y=df\$x, xlab='sample', ylab=x, col=df\$color) - - # plot y vs sample - plot(x=df\$sample, y=df\$y, xlab='sample', ylab=y, col=df\$color) - - # plot xr vs yr - plot(x=df\$xr, y=df\$yr, xlab=paste0(x, '/ref'), ylab=paste0(y, '/ref'), col=df\$color) - - # plot xr vs sample - plot(x=df\$sample, y=df\$xr, xlab='sample', ylab=paste0(x, '/ref'), col=df\$color) - - # plot yr vs sample - plot(x=df\$sample, y=df\$yr, xlab='sample', ylab=paste0(y, '/ref'), col=df\$color) - - # add legend - plot.new() - par(mar = c(0, 0, 0, 0)) - legend( - "center", - legend = unique(df\$group), - col = unique(df\$color), - pch = 19, - cex = 1.5, - bty = "n") - - # TODO the title does not appear somehow, fix it - # Add main title - mtext( - title, - side = 3, - outer = TRUE, - line = 1, - cex = 2, - font = 2) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -# Set defaults and classes - -opt <- list( - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - - # input count matrix - count = '$count', - features_id_col = 'gene_id', # column name of feature ids - - # comparison groups - samplesheet = '$samplesheet', - obs_id_col = 'sample', # column name of observation ids - contrast_variable = "$contrast_variable", # column name of contrast variable - reference_group = "$reference", # reference group for contrast variable - target_group = "$target", # target group for contrast variable - - # parameters for computing differential proportionality - alpha = NA, # alpha for boxcox transformation - moderated = TRUE, # use moderated theta - - # parameters for getting the significant differentially proportional pairs - fdr = 0.05, # FDR threshold - permutation = 0, # if permutation > 0, use permutation test to compute FDR - number_of_cutoffs = 100, # number of cutoffs for permutation test - - # parameters for getting the hub genes - weighted_degree = FALSE, # use weighted degree for hub genes or not - - # other parameters - seed = NA, # seed for reproducibility - ncores = as.integer('$task.cpus') -) - -opt_types <- list( - prefix = 'character', - count = 'character', - samplesheet = 'character', - features_id_col = 'character', - obs_id_col = 'character', - contrast_variable = 'character', - reference_group = 'character', - target_group = 'character', - alpha = 'numeric', - moderated = 'logical', - fdr = 'numeric', - permutation = 'numeric', - number_of_cutoffs = 'numeric', - weighted_degree = 'logical', - seed = 'numeric', - ncores = 'numeric' -) - -# Apply parameter overrides - -args_opt <- parse_args('$task.ext.args') -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - - # handle NA, and avoid errors when NA is provided by user as character - if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA - - # replace values - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided - -required_opts <- c('count','samplesheet','contrast_variable','reference_group','target_group') -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -# Check file inputs are valid - -for (file_input in c('count','samplesheet')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -# check parameters are valid - -if (opt\$permutation < 0) { - stop('permutation should be a positive integer') -} - -# TODO maybe add a function to pretty print the arguments? -print(opt) - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(propr) - -################################################ -################################################ -## Perform differential proportionality ## -################################################ -################################################ - -# set seed when required - -if (!is.na(opt\$seed)) { - warning('Setting seed ', opt\$seed, ' for reproducibility') - set.seed(opt\$seed) -} - -# read matrix - -mat <- read_delim_flexible( - opt\$count, - header = TRUE, - row.names = opt\$features_id_col, - check.names = FALSE -) -mat <- t(mat) # transpose matrix to have features (genes) as columns - -# parse group -# and filter matrix and group values, so that only the contrasted groups are kept -# TODO propd can also handle more than two groups -# but that dont work properly with the contrast format -# Should we provide an alternative way to do that? - -samplesheet <- read_delim_flexible( - opt\$samplesheet, - header = TRUE, - row.names = NULL, - check.names = FALSE -) -samplesheet <- samplesheet[,c(opt\$obs_id_col, opt\$contrast_variable)] -idx <- which(samplesheet[,2] %in% c(opt\$reference_group, opt\$target_group)) -mat <- mat[idx,] -samplesheet <- samplesheet[idx,] -group <- as.vector(samplesheet[,2]) -if (length(group) != nrow(mat)) stop('Error when parsing group') -if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') - -# compute differential proportionality - -pd <- propd( - mat, - group = group, - alpha = opt\$alpha, - weighted = FALSE, - p = opt\$permutation -) - -# compute DE theta values -# this is the theta value for each gene with respect to the normalization reference -# in this case, the reference is the geometric mean of the sample -# These DE values are only for interpreting purposes. -# TODO if we want to use the outcome from other DE analysis, at some point we should -# divide the below part into maybe a separate module that can take the DE and DP values as input -# and coordinate them through the pipeline - -ref <- exp(rowMeans(log(pd@counts))) -de <- runNormalization(pd, ref) - -# use F-stat FDR-adjusted p-values to get significant pairs, if permutation == 0 -# otherwise, get FDR values using permutation tests (more computationally expensive but likely more conservative FDRs) - -if (opt\$permutation == 0) { - - warning('FDR-adjusted p-values are used to get significant pairs.') - - # update FDR-adjusted p-values - - pd <- updateF( - pd, - moderated = opt\$moderated - ) - if (opt\$moderated) pd <- setActive(pd, what='theta_mod') - - # get theta value for which FDR is below desired threshold - # theta_cutoff is FALSE when no theta value has FDR below desired threshold - # otherwise it is the theta value for which FDR is below desired threshold - # Only when there is a meaningful theta, we can compute the next steps - # that involve extracting the significant pairs. - - theta_cutoff <- getCutoffFstat( - pd, - pval=opt\$fdr, - fdr_adjusted=TRUE - ) - if (theta_cutoff) { - - warning('Significant theta value found: ', theta_cutoff) - - # get adjacency matrix - # this matrix will have 1s for significant pairs and 0s for the rest - # diagonals are set to 0 - - adj <- getAdjacencyFstat( - pd, - pval=opt\$fdr, - fdr_adjusted=TRUE - ) - - # calculate gene connectivity and get hub genes - - connectivity <- get_connectivity( - pd, - adj, - de, - theta_cutoff, - features_id_col=opt\$features_id_col - ) - hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) - - # get significant pairs and classify them into red/yellow/green pairs - - results <- getSignificantResultsFstat( - pd, - pval=opt\$fdr, - fdr_adjusted=TRUE - ) - results <- results[,c("Partner", "Pair", "theta")] - results\$classification <- "red" - results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" - results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" - - # sort significant pairs - - results <- results[order(results\$theta),] - } - -} else { - - warning('Permutation tests are used to compute FDR values.') - - # calculate FDR values using permutation tests - # this part will call the updateCutoffs function iteratively - # as far as it does not find a meaningful theta value - # and does not reach the maximum number of iterations - - theta_cutoff <- FALSE - max_cutoff <- 1 - ntry <- 0 - while (!theta_cutoff & max_cutoff > 0 & ntry < 10) { - ntry <- ntry + 1 - - # get theta cutoffs to test the FDR - - if (ntry > 1) { - part <- pd@fdr[which(pd@fdr\$truecounts > 0),] - if (nrow(part) > 1) { - max_cutoff <- min(part\$cutoff) - } else { - break - } - } - - cutoffs <- as.numeric(quantile( - pd@results[pd@results\$theta < max_cutoff, 'theta'], - seq(0, 1, length.out = opt\$number_of_cutoffs) - )) - - # update FDR values - - pd <- updateCutoffs( - pd, - custom_cutoffs = cutoffs, - ncores = opt\$ncores - ) - - # check if any theta value has FDR below desired threshold - - theta_cutoff <- getCutoffFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) - } - - if (theta_cutoff) { - - warning('Significant theta value found: ', theta_cutoff) - - # get adjacency matrix - - adj <- getAdjacencyFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) - - # calculate gene connectivity and get hub genes - - connectivity <- get_connectivity( - pd, - adj, - de, - theta_cutoff, - features_id_col=opt\$features_id_col - ) - hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) - - # get significant pairs and classify them into red/yellow/green pairs - - results <- getSignificantResultsFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) - results <- results[,c("Partner", "Pair", "theta")] - results\$classification <- "red" - results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" - results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" - - # sort significant pairs - - results <- results[order(results\$theta),] - } -} - -# deal with the situation when no significant thetas are found -# For the moment, we just print a warning and set adj, hub_genes and results to NULL -# TODO take top n pairs when no cutoff has FDR below desired threshold - -if (!theta_cutoff) { - warning('No theta value has FDR below desired threshold.') - adj <- NULL - connectivity <- NULL - hub_genes <- NULL - results <- NULL -} - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -saveRDS( - pd, - file = paste0(opt\$prefix, '.propd.rds') -) - -write.table( - getResults(pd), - file = paste0(opt\$prefix, '.propd.results.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE -) - -if (theta_cutoff) { - write.table( - results, - file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE - ) - write.table( - adj, - file = paste0(opt\$prefix, '.propd.adjacency.csv'), - col.names = TRUE, - row.names = TRUE, - sep = ',', - quote = FALSE - ) - write.table( - connectivity, - file = paste0(opt\$prefix, '.propd.connectivity.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE - ) - write.table( - hub_genes, - file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE - ) -} - -if (opt\$permutation > 0) { - write.table( - pd@fdr, - file = paste0(opt\$prefix, '.propd.fdr.tsv'), - col.names = TRUE, - sep = '\\t', - quote = FALSE - ) -} - -################################################ -################################################ -## Plot red pairs ## -################################################ -################################################ - -if (theta_cutoff){ - - # get ratios between each gene and the normalization reference - ratios <- exp(logratio(pd@counts, 'clr', NA)) - - # plot for each pair type - for (pair_type in c("red", "yellow", "green")){ - pdf(paste0(opt\$prefix, '.propd.', pair_type, '_pairs.pdf'), width = 18, height = 18) - - # get pairs - pairs <- results[results\$classification == pair_type,] - - # for the top pairs - for (idx in c(1:3)){ - - # get x and y genes - x <- pairs[idx,'Partner'] - y <- pairs[idx,'Pair'] - - # create data frame - df <- data.frame( - xy=pd@counts[,x]/pd@counts[,y], - x=pd@counts[,x], - y=pd@counts[,y], - xr=ratios[,x], - yr=ratios[,y], - sample=c(1:nrow(pd@counts)), - group=group, - color=ifelse(group == opt\$target_group, 'red', 'blue')) - df <- df[order(df\$group, df\$sample),] - - # plot - title <- paste0("top ", idx, " ", pair_type, " pair with theta=", round(results[idx, 'theta'], 6)) - plot_pairs(df, x, y, title) - } - - } -} - -################################################ -################################################ -## WARNINGS ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".warnings.log")) -print(warnings()) -sink() - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf deleted file mode 100644 index 99e7770e..00000000 --- a/modules/local/propr/propr/main.nf +++ /dev/null @@ -1,27 +0,0 @@ -process PROPR_PROPR { - tag "$meta.id" - label 'process_medium' - - // conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" - - input: - tuple val(meta), path(count) - - output: - tuple val(meta), path("*.propr.rds") , emit: propr - tuple val(meta), path("*.propr.matrix.csv") , emit: matrix - tuple val(meta), path("*.propr.fdr.tsv") , emit: fdr , optional:true - tuple val(meta), path("*.propr.adjacency.csv"), emit: adjacency , optional:true - path "*.warnings.log" , emit: warnings - path "*.R_sessionInfo.log" , emit: session_info - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template 'propr.R' -} diff --git a/modules/local/propr/propr/templates/propr.R b/modules/local/propr/propr/templates/propr.R deleted file mode 100644 index afbc35e6..00000000 --- a/modules/local/propr/propr/templates/propr.R +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env Rscript - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse - -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header, - row.names = row.names, - check.names = check.names - ) - - return(mat) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -# Set defaults and classes - -opt <- list( - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - - # input count matrix - count = '$count', - features_id_col = 'gene_id', # column name for features (genes) - - # parameters for computing correlation coefficients - metric = 'rho', # correlation metric: rho, phi, phs, cor, vlr, pcor, pcor.shrink, pcor.bshrink - ivar = 'clr', # transformation: clr, alr, or the name(s) or index(es) of the variable(s) to be used as reference(s) - alpha = NA, # alpha value for Box-Cox transformation - - # parameters for getting the significant coefficients - fdr = 0.05, # FDR threshold - tails = "right", # FDR tail: right or both - permutation = 100, # number of permutations - number_of_cutoffs = 100, # number of cutoffs for which compute the FDRs - - # other parameters - seed = NA, # seed for reproducibility - ncores = as.integer('$task.cpus') -) - -opt_types <- list( - prefix = 'character', - count = 'character', - features_id_col = 'character', - metric = 'character', - ivar = 'character', - alpha = 'numeric', - fdr = 'numeric', - tails = 'character', - permutation = 'numeric', - number_of_cutoffs = 'numeric', - seed = 'numeric', - ncores = 'numeric' -) - -# Apply parameter overrides - -args_opt <- parse_args('$task.ext.args') - -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - - # handle NA, and avoid errors when NA is provided by user as character - if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA - - # replace values - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided - -required_opts <- c('count') # only count data is strictly required, other parameters have defaults -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -# Check file inputs are valid - -for (file_input in c('count')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -# check parameters - -if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { - stop('Please make sure you provided the correct metric') -} - -if (opt\$metric == 'pcor.bshrink'){ - if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') - if (!opt\$ivar %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') - -} else { - if (is.na(opt\$ivar)) warning('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') -} - -# TODO maybe add a function to pretty print the arguments? -print(opt) - - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(propr) - -################################################ -################################################ -## Perform correlation analysis ## -################################################ -################################################ - -# set seed when required - -if (!is.na(opt\$seed)) { - warning('Setting seed ', opt\$seed, ' for reproducibility') - set.seed(opt\$seed) -} - -# load count matrix - -mat <- read_delim_flexible( - opt\$count, - header = TRUE, - row.names = opt\$features_id_col, - check.names = FALSE -) -mat <- t(mat) # transpose matrix to have features (genes) as columns - -# Compute correlation coefficients - -pr <- propr( - mat, - metric = opt\$metric, - ivar = opt\$ivar, - alpha = opt\$alpha, - p = opt\$permutation -) - -if (opt\$permutation > 0) { - - # update FDRs for each coefficient cutoff - - pr <- updateCutoffs( - pr, - number_of_cutoffs=opt\$number_of_cutoffs, - tails=opt\$tails, - ncores=opt\$ncores - ) - - # get cutoff at given FDR threshold - - cutoff <- getCutoffFDR( - pr, - fdr=opt\$fdr, - window_size=1 - ) - - if (cutoff) { - - # get adjacency matrix with the significant edges - - adj <- getAdjacencyFDR( - pr, - fdr=opt\$fdr, - window_size=1 - ) - - } else { - # TODO take top n pairs when no cutoff has FDR below desired threshold - # For the moment, we just print a warning and set adj to NULL - warning('No significant results found at FDR threshold ', opt\$fdr) - adj <- NULL - } -} - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -saveRDS( - pr, - file = paste0(opt\$prefix, '.propr.rds') -) - -write.table( - round(pr@matrix, 8), # round matrix decimals to avoid floating point inconsistencies - file = paste0(opt\$prefix, '.propr.matrix.csv'), - col.names = TRUE, - row.names = TRUE, - sep = ',', - quote = FALSE -) - -if (!is.null(adj)) { - write.table( - adj, - file = paste0(opt\$prefix, '.propr.adjacency.csv'), - col.names = TRUE, - row.names = FALSE, - sep = '\t', - quote = FALSE - ) -} - -if (opt\$permutation > 0) { - write.table( - pr@fdr, - file = paste0(opt\$prefix, '.propr.fdr.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\t', - quote = FALSE - ) -} - -################################################ -################################################ -## WARNINGS ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".warnings.log")) -print(warnings()) -sink() - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/nf-core/mygene/environment.yml b/modules/nf-core/mygene/environment.yml deleted file mode 100644 index 45442c49..00000000 --- a/modules/nf-core/mygene/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: mygene -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::mygene=3.2.2 diff --git a/modules/nf-core/mygene/main.nf b/modules/nf-core/mygene/main.nf deleted file mode 100644 index 25a21d8f..00000000 --- a/modules/nf-core/mygene/main.nf +++ /dev/null @@ -1,23 +0,0 @@ -process MYGENE { - tag "$meta.id" - label 'process_low' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mygene:3.2.2--pyh5e36f6f_0': - 'biocontainers/mygene:3.2.2--pyh5e36f6f_0' }" - - input: - tuple val(meta), path(gene_list) - - output: - tuple val(meta), path("*.gmt"), emit: gmt - tuple val(meta), path("*.tsv"), emit: tsv , optional: true - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template "mygene.py" -} diff --git a/modules/nf-core/mygene/meta.yml b/modules/nf-core/mygene/meta.yml deleted file mode 100644 index f7aaa455..00000000 --- a/modules/nf-core/mygene/meta.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: "mygene" -description: Fetch the GO concepts for a list of genes -keywords: - - mygene - - go - - annotation -tools: - - "mygene": - description: "A python wrapper to query/retrieve gene annotation data from Mygene.info." - homepage: "https://mygene.info/" - documentation: "https://docs.mygene.info/projects/mygene-py/en/latest/" - tool_dev_url: "https://github.com/biothings/mygene.py" - doi: "10.1093/nar/gks1114" - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - gene_list: - type: file - description: A tsv/csv file that contains a list of gene ids in one of the columns. - By default, the column name should be "gene_id", but this can be changed - by using "--columname gene_id" in ext.args. - pattern: "*.{csv,tsv}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - gmt: - type: file - description: | - Each row contains the GO id, a description, and a list of gene ids. - pattern: "*.gmt" - - tsv: - type: file - description: | - (optional) A tsv file with the following columns: - query, mygene_id, go_id, go_term, go_evidence, go_category, symbol, name, taxid - pattern: "*.tsv" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@suzannejin" -maintainers: - - "@suzannejin" diff --git a/modules/nf-core/mygene/templates/mygene.py b/modules/nf-core/mygene/templates/mygene.py deleted file mode 100644 index 2717c467..00000000 --- a/modules/nf-core/mygene/templates/mygene.py +++ /dev/null @@ -1,347 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import mygene -import shlex - - -""" -This python script uses the mygene module to query the MyGene.info API and -retrieve the go terms associated with a list of gene ids. The gene ids should -ideally be Ensembl or Entrez ids. The script generates two outputs: - 1. A tsv file containing information related to each query. The columns - include query, mygene_id, go_id, go_term, go_evidence, go_category, - symbol, name, and taxid. - 2. A gmt file containing information related to each go term. Each row - includes the go id, go term, and the genes associated with that go term. - -Author: Suzanne Jin -License: Apache 2.0 (same as the mygene library) -""" - - -class Arguments: - """ - Parses the argments, including the ones coming from $task.ext.args. - """ - - def __init__(self) -> None: - self.input = "$gene_list" - self.prefix = "$task.ext.prefix" if "$task.ext.prefix" != "null" else "$meta.id" - self.output_gmt = self.prefix + ".gmt" - self.output_tsv = self.prefix + ".tsv" - self.parse_ext_args("$task.ext.args") - - def parse_ext_args(self, args_string: str) -> None: - """ - It parses the extended arguments. - """ - # skip when there are no extended arguments - if args_string == "null": - args_string = "" - - # Parse the extended arguments - args_list = shlex.split(args_string) # Split the string into a list of arguments - parser = argparse.ArgumentParser() - # input parameters - parser.add_argument( - "--columname", - default="gene_id", - help="Name of the column where the gene ids are stored in the input file. Default: gene_id", - ) - # filtering parameters - parser.add_argument( - "--species", - default=None, - help="Comma separated of common name of the species or taxon ids", - ) - parser.add_argument( - "--go_category", - default=None, - help="Comma separated list of GO categories to keep. Default: all", - ) - parser.add_argument( - "--go_evidence", - default=None, - help="Comma separated list of GO evidence codes to keep. Default: all", - ) - # additional parameters for querymany - parser.add_argument( - "--scopes", - default=None, - help="Comma separated list of scopes to search for.", - ) - parser.add_argument( - "--entrezonly", - default=False, - help="When true, the query returns only the hits with valid Entrez gene ids. Default: false.", - ) - parser.add_argument( - "--ensemblonly", - default=False, - help="When true, the query returns only the hits with valid Ensembl gene ids. Default: False", - ) - # output parameters - parser.add_argument( - "--generate_tsv", - default=False, - help="Also generate a tsv file with the gene based information. Default: False", - ) - args = parser.parse_args(args_list) - - # Convert "null" values to default values - # convert true to True and false to False - for attr in vars(args): - value = getattr(args, attr) - if value == "null": - setattr(args, attr, parser.get_default(attr)) - elif value == "true": - setattr(args, attr, True) - elif value == "false": - setattr(args, attr, False) - - # check if the arguments are valid - if args.go_category: - args.go_category = args.go_category.upper() - for category in args.go_category.split(","): - if category not in ["BP", "MF", "CC"]: - raise ValueError("The GO category should be one of BP, MF, or CC.") - if args.go_evidence: - args.go_evidence = args.go_evidence.upper() - - # Assign args attributes to self attributes - for attr in vars(args): - setattr(self, attr, getattr(args, attr)) - - def print_args(self) -> None: - """ - Print the arguments. - """ - for attr in vars(self): - print(f"{attr}: {getattr(self, attr)}") - - -class Version: - """ - Parse the versions of the modules used in the script. - """ - - @staticmethod - def get_versions(modules: list) -> dict: - """ - This function takes a list of modules and returns a dictionary with the - versions of each module. - """ - return {module.__name__: module.__version__ for module in modules} - - @staticmethod - def format_yaml_like(data: dict, indent: int = 0) -> str: - """ - Formats a dictionary to a YAML-like string. - - Args: - data (dict): The dictionary to format. - indent (int): The current indentation level. - - Returns: - yaml_str: A string formatted as YAML. - """ - yaml_str = "" - for key, value in data.items(): - spaces = " " * indent - if isinstance(value, dict): - yaml_str += f"{spaces}{key}:\\n{Version.format_yaml_like(value, indent + 1)}" - else: - yaml_str += f"{spaces}{key}: {value}\\n" - return yaml_str - - -class MyGene: - """ - This class will query the MyGene.info API and retrieve the go terms - associated with a list of gene ids. - - In concrete, if first queries the mygene API to get the mygene ids for each - of the query gene. Then, it queries for the annotations, and parses the go - terms all together with all the other information. - """ - - def __init__( - self, - query: list, - species: str, - scopes: str, - entrezonly: bool, - ensemblonly: bool, - go_category: str = None, - go_evidence: str = None, - ) -> None: - self.query = query - self.fields = "go,symbol,name,taxid" - self.species = species - self.scopes = scopes - self.entrezonly = entrezonly - self.ensemblonly = ensemblonly - self.go_category = go_category - self.go_evidence = go_evidence - self.mg = mygene.MyGeneInfo() - self.idmap = self.query2idmap() - print(f"fetched {len(self.idmap)} ids from {len(self.query)} queries") - - def query2idmap(self) -> dict: - """ - It returns a dictionary with the mygene ids as keys and the query ids as values. - """ - q = self.mg.querymany( - self.query, - scopes=self.scopes, - species=self.species, - entrezonly=self.entrezonly, - ensemblonly=self.ensemblonly, - returnall=True, - ) - return {dic["_id"]: dic["query"] for dic in q["out"] if "_id" in dic} - - def id2info(self) -> list: - """ - It returns a list of dictionaries with the info returned from getgenes for all the query ids. - Each dictionary contains the annotations for the corresponding query gene. - """ - return self.mg.getgenes(list(set(self.idmap)), fields=self.fields, species=self.species) - - def parse_go_based_info(self) -> dict: - """ - It queries the annotations for all query ids and then parses a go - centric dictionary. It is a dictionary of dictionaries with the - following format: {{go_id1: [go_term, gene1, gene2, ...]}, ...} - """ - info = {} - for dic in self.id2info(): - if "go" not in dic: - continue - if self.go_category: - dic["go"] = { - category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] - } - for category, go_list in dic["go"].items(): - if not isinstance(go_list, list): - go_list = [go_list] - for go in go_list: - if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): - continue - - if go["id"] not in info: - info[go["id"]] = [go["term"], self.idmap[dic["_id"]]] - else: - info[go["id"]].append(self.idmap[dic["_id"]]) - return info - - def parse_gene_based_info(self) -> dict: - """ - It queries the annotations for all query ids and then parses a go - centric dictionary. - - At the end it returns a dictionary {query gene: {}} of dictionaries - with the following keys: query, mygene_id, go_id, go_term, go_evidence, - go_category, symbol, name, taxid. - """ - info = {} - for dic in self.id2info(): - if "go" not in dic: - continue - if self.go_category: - dic["go"] = { - category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] - } - for category, go_list in dic["go"].items(): - if not isinstance(go_list, list): - go_list = [go_list] - for go in go_list: - if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): - continue - - current_info = { - "query": self.idmap[dic["_id"]], - "mygene_id": dic["_id"], - "go_id": go["id"], - "go_term": go["term"], - "go_evidence": go["evidence"], - "go_category": category, - "symbol": dic["symbol"], - "name": dic["name"], - "taxid": dic["taxid"], - } - info[self.idmap[dic["_id"]]] = current_info - return info - - def parse_and_save_to_gmt(self, filename: str) -> list: - """ - It parses and saves go centric information to a gmt file. - The final gmt output will be sorted following the go id order. - """ - info = self.parse_go_based_info() - info = dict(sorted(info.items(), key=lambda x: x[0])) - with open(filename, "w") as f: - for go_id, go_list in info.items(): - tmp = sorted(go_list[1:]) - f.write(go_id + "\\t" + go_list[0] + "\\t" + "\\t".join(tmp) + "\\n") - print(f"saved {len(info)} go terms to {filename}") - - def parse_and_save_to_tsv(self, filename: str) -> None: - """ - It parses and saves gene centric information in a tsv file. - The final tsv output will be sorted following the input query gene list order. - """ - info = self.parse_gene_based_info() - with open(filename, "w") as f: - f.write("\\t".join(info[self.query[0]].keys()) + "\\n") - for gene in self.query: # sorted by query gene list - if gene in info: - f.write("\\t".join([str(val) for val in info[gene].values()]) + "\\n") - print(f"saved {len(info)} gene centric info to {filename}") - - -def load_list(filename: str, columname: str) -> list: - """ - It loads the list of gene ids from a file. - The columname is the name of the column where the gene ids are stored. - """ - if filename.split(".")[-1] == "tsv": - sep = "\\t" - elif filename.split(".")[-1] == "csv": - sep = "," - else: - raise ValueError("The input file extension should be either tsv or csv.") - with open(filename, "r") as f: - idx = f.readline().strip().split(sep).index(columname) - return [line.strip().split(sep)[idx] for line in f] - - -if __name__ == "__main__": - # parse and print arguments - args = Arguments() - args.print_args() - - # load gene list - gene_list = load_list(args.input, args.columname) - - # run mygene api - mg = MyGene( - gene_list, - species=args.species, - scopes=args.scopes, - entrezonly=args.entrezonly, - ensemblonly=args.ensemblonly, - go_category=args.go_category, - go_evidence=args.go_evidence, - ) - - # parse annotations and save output files - mg.parse_and_save_to_gmt(args.output_gmt) - if args.generate_tsv: - mg.parse_and_save_to_tsv(args.output_tsv) - - # write versions to file - versions_this_module = {} - versions_this_module["${task.process}"] = Version.get_versions([argparse, mygene]) - with open("versions.yml", "w") as f: - f.write(Version.format_yaml_like(versions_this_module)) diff --git a/modules/nf-core/mygene/tests/default_tsv.config b/modules/nf-core/mygene/tests/default_tsv.config deleted file mode 100644 index 08bd6fac..00000000 --- a/modules/nf-core/mygene/tests/default_tsv.config +++ /dev/null @@ -1,3 +0,0 @@ -process{ - ext.args = "--generate_tsv true" -} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_category.config b/modules/nf-core/mygene/tests/go_category.config deleted file mode 100644 index 771f8f4d..00000000 --- a/modules/nf-core/mygene/tests/go_category.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--go_category bp,mf" -} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_evidence.config b/modules/nf-core/mygene/tests/go_evidence.config deleted file mode 100644 index b19de214..00000000 --- a/modules/nf-core/mygene/tests/go_evidence.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--go_evidence EXP,IDA" -} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/main.nf.test b/modules/nf-core/mygene/tests/main.nf.test deleted file mode 100644 index e5ba64ca..00000000 --- a/modules/nf-core/mygene/tests/main.nf.test +++ /dev/null @@ -1,106 +0,0 @@ -nextflow_process { - - name "Test Process MYGENE" - script "../main.nf" - process "MYGENE" - - tag "modules" - tag "modules_nfcore" - tag "mygene" - - test("mygene - default options") { - - tag "default" - - when { - process { - """ - input[0] = [ - [id : 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") - ] - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.gmt).match("mygene - default options - gmt") }, - { assert snapshot(process.out.versions).match("mygene - default options - versions") } - ) - } - } - - test("mygene - default with tsv file") { - - tag "default_with_tsv" - config "./default_tsv.config" - - when { - process { - """ - input[0] = [ - [id : 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") - ] - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.gmt).match("mygene - default with tsv file - gmt") }, - { assert snapshot(process.out.tsv).match("mygene - default with tsv file - tsv") }, - { assert snapshot(process.out.versions).match("mygene - default with tsv file - versions") } - ) - } - } - - test("mygene - filter by go category") { - - tag "filter_by_go_category" - config "./go_category.config" - - when { - process { - """ - input[0] = [ - [id : 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") - ] - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.gmt).match("mygene - filter by go category - gmt") }, - { assert snapshot(process.out.versions).match("mygene - filter by go category - versions") } - ) - } - } - - test("mygene - filter by go evidence") { - - tag "filter_by_go_evidence" - config "./go_evidence.config" - - when { - process { - """ - input[0] = [ - [id : 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") - ] - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.gmt).match("mygene - filter by go evidence - gmt") }, - { assert snapshot(process.out.versions).match("mygene - filter by go evidence - versions") } - ) - } - } -} diff --git a/modules/nf-core/mygene/tests/main.nf.test.snap b/modules/nf-core/mygene/tests/main.nf.test.snap deleted file mode 100644 index d6a334c7..00000000 --- a/modules/nf-core/mygene/tests/main.nf.test.snap +++ /dev/null @@ -1,135 +0,0 @@ -{ - "mygene - filter by go evidence - versions": { - "content": [ - [ - "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:31.854823" - }, - "mygene - default options - versions": { - "content": [ - [ - "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:19:43.081388" - }, - "mygene - default with tsv file - versions": { - "content": [ - [ - "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:01.837699" - }, - "mygene - default options - gmt": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:19:43.060437" - }, - "mygene - filter by go category - versions": { - "content": [ - [ - "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:17.233994" - }, - "mygene - filter by go evidence - gmt": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.gmt:md5,da6b31a5f889e3aedb16b4154f9652af" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:31.827798" - }, - "mygene - default with tsv file - tsv": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.tsv:md5,018e23173b224cbf328751006593900e" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:01.81872" - }, - "mygene - default with tsv file - gmt": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:01.79811" - }, - "mygene - filter by go category - gmt": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.gmt:md5,213c1d1d2345df8ea51d67cb1670f4f7" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-20T17:20:17.208509" - } -} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/tags.yml b/modules/nf-core/mygene/tests/tags.yml deleted file mode 100644 index c867c978..00000000 --- a/modules/nf-core/mygene/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -mygene: - - "modules/nf-core/mygene/**" diff --git a/nextflow.config b/nextflow.config index 2d7ba2c3..8fdf6e3f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,6 +11,7 @@ params { // Input options input = null + study_name = 'study' study_type = 'rnaseq' study_abundance_type = 'counts' @@ -216,6 +217,7 @@ params { // Config options config_profile_name = null config_profile_description = null + custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null @@ -223,36 +225,6 @@ params { // Schema validation default options validate_params = true - - // ---------------------------------------------- // - // Experimental analysis options // - // ---------------------------------------------- // - - tools = "${projectDir}/assets/tools_samplesheet.csv" - pathway = null - - // propd options - propd_alpha = null - propd_moderated = true - propd_fdr = 0.05 - propd_permutation = 0 - propd_ncutoffs = 100 - propd_weighted_degree = false - - // propr options - propr_metric = 'rho' - propr_ivar = 'clr' - propr_alpha = null - propr_fdr = 0.05 - propr_permutation = 100 - propr_ncutoffs = 100 - propr_tails = "right" - - // grea options - grea_set_min = 15 - grea_set_max = 500 - grea_permutation = 100 - } // Load base.config by default for all pipelines @@ -357,17 +329,18 @@ profiles { executor.cpus = 4 executor.memory = 8.GB } - test { includeConfig 'conf/test.config' } - test_nogtf { includeConfig 'conf/test_nogtf.config' } - test_full { includeConfig 'conf/test_full.config' } - affy { includeConfig 'conf/affy.config' } - maxquant { includeConfig 'conf/maxquant.config' } - rnaseq { includeConfig 'conf/rnaseq.config' } - soft {includeConfig 'conf/soft.config'} - test_affy { includeConfig 'conf/test_affy.config' } - test_maxquant { includeConfig 'conf/test_maxquant.config' } - test_soft {includeConfig 'conf/test_soft.config' } - test_experimental {includeConfig 'conf/test_experimental.config' } + test { includeConfig 'conf/test.config' } + test_nogtf { includeConfig 'conf/test_nogtf.config' } + test_full { includeConfig 'conf/test_full.config' } + affy { includeConfig 'conf/affy.config' } + maxquant { includeConfig 'conf/maxquant.config' } + rnaseq { includeConfig 'conf/rnaseq.config' } + rnaseq_limma { includeConfig 'conf/rnaseq_limma.config' } + test_rnaseq_limma { includeConfig 'conf/test_rnaseq_limma.config' } + soft { includeConfig 'conf/soft.config' } + test_affy { includeConfig 'conf/test_affy.config' } + test_maxquant { includeConfig 'conf/test_maxquant.config' } + test_soft { includeConfig 'conf/test_soft.config' } } // Load nf-core custom profiles from different Institutions diff --git a/nextflow_schema.json b/nextflow_schema.json index e7837773..1d11361d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -24,7 +24,7 @@ "default": "rnaseq", "description": "A string identifying the technology used to produce the data", "help_text": "Currently 'rnaseq' or 'affy_array' may be specified.", - "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file", "experimental"], + "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file"], "fa_icon": "far fa-keyboard" }, "input": { @@ -61,31 +61,6 @@ } } }, - "run_experimental_branch_through_the_toolsheet_config": { - "title": "Run experimental branch through the toolsheet config", - "type": "object", - "fa_icon": "fas fa-terminal", - "description": "Values required for experimental analysis", - "properties": { - "tools": { - "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/csv", - "schema": "assets/schema_tools.json", - "pattern": "^\\S+\\.(csv|tsv|yaml)$", - "description": "Path to comma-separated file containing samplesheet", - "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline", - "default": "${projectDir}/assets/tools_samplesheet.csv" - }, - "pathway": { - "type": "string", - "fa_icon": "fas fa-border-all", - "description": "(experimantal only): Choose a (list of) pathway from those predefined in the tool sheet", - "help_text": "Choose the a subset of pathways to run. Pathways are defined in the tool sheet." - } - } - }, "abundance_values": { "title": "Abundance values", "type": "object", @@ -109,12 +84,14 @@ }, "affy_cel_files_archive": { "type": "string", + "default": "null", "description": "Alternative to matrix: a compressed CEL files archive such as often found in GEO", "fa_icon": "fas fa-file-archive", "help_text": "Use this option to provide a raw archive of CEL files from Affymetrix arrays. Will be ignored if a matrix is specified." }, "querygse": { "type": "string", + "default": "null", "description": "Use SOFT files from GEO by providing the GSE study identifier", "fa_icon": "fas fa-keyboard", "help_text": "Use this option to provide a GSE study identifier." @@ -761,86 +738,29 @@ }, "fa_icon": "fas fa-border-all" }, - "propd_specific_options": { - "title": "propd specific options", + "immunedeconv": { + "title": "IMMUNEDECONV", "type": "object", - "description": "Parameters to run differential proportionality", + "description": "", "default": "", "properties": { - "propd_alpha": { - "type": "string", - "default": "null", - "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." - }, - "propd_moderated": { - "type": "boolean", - "default": true, - "description": "Use moderated version of differential proportionality coefficients. This is usually needed when p>>n." - }, - "propd_fdr": { - "type": "number", - "default": 0.05, - "description": "FDR threshold for filtering the significant pairs." - }, - "propd_permutation": { - "type": "integer", - "default": 0, - "description": "When this parameter is 0, use the default statistical test to determine the FDR. When this number is > 0, run permutation test to get the FDR with as many permutations as defined by this parameter. Usually a minimum number of 100 permutations is needed." - }, - "propd_ncutoffs": { - "type": "integer", - "default": 100, - "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." - }, - "propd_weighted_degree": { + "immunedeconv_run": { "type": "boolean", + "description": "Set to run IMMUNEDECONV", "default": false, - "description": "If true, use weighted degree to filter the hub genes. Otherwie, use the degree." - } - } - }, - "propr_specific_options": { - "title": "propr specific options", - "type": "object", - "description": "Parameters to run correlation analysis through propr package", - "default": "", - "properties": { - "propr_metric": { - "type": "string", - "default": "rho", - "description": "The correlation metric to use.", - "enum": ["rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink", "vlr", "phi", "phs"] - }, - "propr_ivar": { - "type": "string", - "default": "clr", - "description": "Which logratio transformation to use. 'clr' means centered logratio transformation, which uses the sample geometric mean as reference. 'alr' means additive logratio transformation, and it can use any gene or genes as reference(s). One can give the gene name(s) or index(es) as reference(s)." + "fa_icon": "fas fa-running" }, - "propr_alpha": { + "immunedeconv_method": { "type": "string", - "default": "null", - "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." - }, - "propr_fdr": { - "type": "number", - "default": 0.05, - "description": "FDR threshold for filtering the significant pairs." - }, - "propr_permutation": { - "type": "integer", - "default": 100, - "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given correlation coefficient value by chance." - }, - "propr_ncutoffs": { - "type": "integer", - "default": 100, - "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + "description": "Set method to run with IMMUNEDECONV. Available options can be found in 'https://omnideconv.org/immunedeconv/articles/immunedeconv.html'", + "default": "quantiseq", + "fa_icon": "fas fa-running" }, - "propr_tails": { + "immunedeconv_function": { "type": "string", - "default": "right", - "enum": ["right", "both"], - "description": "Use one-sided 'right'-tailed test or 'both' for two-sided test with symmetric cutpoints." + "description": "Set function to run with IMMUNEDECONV. Available options can be found in 'https://omnideconv.org/immunedeconv/articles/immunedeconv.html'", + "default": "deconvolute", + "fa_icon": "fas fa-running" } } }, @@ -1067,29 +987,6 @@ }, "fa_icon": "fas fa-layer-group" }, - "grea_specific_options": { - "title": "GREA specific options", - "type": "object", - "description": "Parameters to run GREA (Gene Ratio Enrichment Analysis)", - "default": "", - "properties": { - "grea_set_min": { - "type": "integer", - "default": 15, - "description": "Min size: exclude smaller sets" - }, - "grea_set_max": { - "type": "integer", - "default": 500, - "description": "Max size: exclude larger sets" - }, - "grea_permutation": { - "type": "integer", - "default": 100, - "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given odds ratio by chance." - } - } - }, "shiny_app_settings": { "title": "Shiny app settings", "type": "object", @@ -1368,9 +1265,6 @@ { "$ref": "#/$defs/input_output_options" }, - { - "$ref": "#/$defs/run_experimental_branch_through_the_toolsheet_config" - }, { "$ref": "#/$defs/abundance_values" }, @@ -1404,21 +1298,12 @@ { "$ref": "#/$defs/immunedeconv" }, - { - "$ref": "#/$defs/propd_specific_options" - }, - { - "$ref": "#/$defs/propr_specific_options" - }, { "$ref": "#/$defs/gsea" }, { "$ref": "#/$defs/gprofiler2" }, - { - "$ref": "#/$defs/grea_specific_options" - }, { "$ref": "#/$defs/shiny_app_settings" }, diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf deleted file mode 100644 index bb46c5de..00000000 --- a/subworkflows/local/correlation/main.nf +++ /dev/null @@ -1,38 +0,0 @@ -// -// Perform correlation analysis -// -include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" - -workflow CORRELATION { - take: - ch_counts // [ meta, counts] with meta keys: method, args_cor - - main: - - // initialize empty results channels - ch_matrix = Channel.empty() - ch_adjacency = Channel.empty() - ch_versions = Channel.empty() - - // branch tools to select the correct correlation analysis method - ch_counts - .branch { - propr: it[0]["method"] == "propr" - } - .set { ch_counts } - - // ---------------------------------------------------- - // Perform correlation analysis with propr - // ---------------------------------------------------- - PROPR(ch_counts.propr.unique()) - ch_matrix = PROPR.out.matrix.mix(ch_matrix) - ch_adjacency = PROPR.out.adjacency.mix(ch_adjacency) - ch_versions = ch_versions.mix(PROPR.out.versions) - - // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. - - emit: - matrix = ch_matrix // channel: [ csv ] - adjacency = ch_adjacency // channel: [ csv ] - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf deleted file mode 100644 index a271f871..00000000 --- a/subworkflows/local/differential/main.nf +++ /dev/null @@ -1,171 +0,0 @@ -// -// Perform differential analysis -// -include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" -include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' -include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from "../../../modules/nf-core/deseq2/differential/main" -include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' -include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' -include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_DESEQ2 } from '../../../modules/local/filter_difftable' - -workflow DIFFERENTIAL { - take: - ch_counts // [ meta_exp, counts ] with meta keys: method, args_diff - ch_samplesheet // [ meta_exp, samplesheet ] - ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] - ch_transcript_lengths - ch_control_features - - main: - - // initialize empty results channels - ch_results_pairwise = Channel.empty() - ch_results_pairwise_filtered = Channel.empty() - ch_results_genewise = Channel.empty() - ch_results_genewise_filtered = Channel.empty() - ch_adjacency = Channel.empty() - ch_versions = Channel.empty() - - // branch tools to select the correct differential analysis method - ch_counts - .branch { - propd: it[0]["method"] == "propd" - deseq2: it[0]["method"] == "deseq2" - limma: it[0]["method"] == "limma" - } - .set { ch_counts } - - // ---------------------------------------------------- - // Perform differential analysis with propd - // ---------------------------------------------------- - - // TODO propd currently don't support blocking, so we should not run propd with same contrast_variable, reference and target, - // but different blocking variable, since it will simply run the same analysis again. - - ch_counts.propd - .combine(ch_samplesheet) - .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } - .combine(ch_contrasts) - .map { - meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> - def meta = meta_data.clone() + ['contrast': meta_contrast.id] - return [ meta, counts, samplesheet, contrast_variable, reference, target ] - } - .set { ch_propd } - - PROPD(ch_propd.unique()) - ch_results_pairwise = PROPD.out.results.mix(ch_results_pairwise) - ch_results_pairwise_filtered = PROPD.out.results_filtered.mix(ch_results_pairwise_filtered) - ch_results_genewise = PROPD.out.connectivity.mix(ch_results_genewise) - ch_results_genewise_filtered = PROPD.out.hub_genes.mix(ch_results_genewise_filtered) - ch_adjacency = PROPD.out.adjacency.mix(ch_adjacency) - ch_versions = PROPD.out.versions.mix(ch_versions) - - // ---------------------------------------------------- - // Perform differential analysis with DESeq2 - // ---------------------------------------------------- - - ch_counts.deseq2 - .combine(ch_samplesheet) - .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } - .combine(ch_contrasts) - .multiMap { - meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> - def meta = meta_data.clone() + meta_contrast.clone() - contrast: [ meta, contrast_variable, reference, target ] - samples_and_matrix: [ meta, samplesheet, counts ] - } - .set { ch_deseq2 } - - // do we need this process DESEQ2_NORM? - DESEQ2_NORM ( - ch_deseq2.contrast.first(), - ch_deseq2.samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - DESEQ2_DIFFERENTIAL ( - ch_deseq2.contrast, - ch_deseq2.samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - ch_norm_deseq2 = DESEQ2_NORM.out.normalised_counts - ch_differential_deseq2 = DESEQ2_DIFFERENTIAL.out.results - ch_model_deseq2 = DESEQ2_DIFFERENTIAL.out.model - ch_versions = DESEQ2_DIFFERENTIAL.out.versions.mix(ch_versions) - - ch_processed_matrices = ch_norm_deseq2 - if ('rlog' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) - } - if ('vst' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) - } - ch_processed_matrices = ch_processed_matrices - .map{ it.tail() } - - // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does - ch_logfc_deseq2 = Channel.value([ "log2FoldChange", params.differential_min_fold_change ]) - ch_padj_deseq2 = Channel.value([ "padj", params.differential_max_qval ]) - - FILTER_DIFFTABLE_DESEQ2( - ch_differential_deseq2, - ch_logfc_deseq2, - ch_padj_deseq2 - ) - - ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results.mix(ch_results_genewise) - ch_results_genewise_filtered = FILTER_DIFFTABLE_DESEQ2.out.filtered.mix(ch_results_genewise_filtered) - ch_versions = FILTER_DIFFTABLE_DESEQ2.out.versions.mix(ch_versions) - - // ---------------------------------------------------- - // Perform differential analysis with limma - // ---------------------------------------------------- - - // combine the input channels with the tools information - // in this way, limma will only be run if the user have specified it, as informed by ch_tools - ch_counts.limma - .combine(ch_samplesheet) - .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } - .combine(ch_contrasts) - .unique() - .multiMap { - meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> - def meta = meta_data.clone() + meta_contrast.clone() - input1: [ meta, contrast_variable, reference, target ] - input2: [ meta, samplesheet, counts ] - } - .set { ch_limma } - - - // run limma - LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) - ch_versions = LIMMA_DIFFERENTIAL.out.versions.mix(ch_versions) - - // filter results - // note that these are column names specific for limma output table - // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does - ch_logfc_limma = Channel.value([ "logFC", params.differential_min_fold_change ]) - ch_padj_limma = Channel.value([ "adj.P.Val", params.differential_max_qval ]) - FILTER_DIFFTABLE_LIMMA( - LIMMA_DIFFERENTIAL.out.results, - ch_logfc_limma, - ch_padj_limma - ) - - // collect results - ch_results_genewise = LIMMA_DIFFERENTIAL.out.results.mix(ch_results_genewise) - ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered.mix(ch_results_genewise_filtered) - ch_versions = FILTER_DIFFTABLE_LIMMA.out.versions.mix(ch_versions) - - emit: - results_pairwise = ch_results_pairwise // channel: [ tsv ] - results_pairwise_filtered = ch_results_pairwise_filtered // channel: [ tsv ] - results_genewise = ch_results_genewise // channel: [ tsv ] - results_genewise_filtered = ch_results_genewise_filtered // channel: [ tsv ] - adjacency = ch_adjacency // channel: [ tsv ] - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf deleted file mode 100644 index 30006c19..00000000 --- a/subworkflows/local/enrichment/main.nf +++ /dev/null @@ -1,153 +0,0 @@ -// -// Perform enrichment analysis -// -include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" -include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" -include { GPROFILER2_GOST } from "../../../modules/nf-core/gprofiler2/gost/main.nf" - -include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' -include { CUSTOM_TABULARTOGSEAGCT } from '../../../modules/nf-core/custom/tabulartogseagct/main.nf' -include { CUSTOM_TABULARTOGSEACLS } from '../../../modules/nf-core/custom/tabulartogseacls/main.nf' -include { TABULAR_TO_GSEA_CHIP } from '../../../modules/local/tabular_to_gsea_chip' - -workflow ENRICHMENT { - take: - ch_counts // [ meta, counts] with meta keys: method, args_cor - ch_results_genewise // [ meta, results] with meta keys: method, args_cor - ch_results_genewise_filtered // [ meta, results] with meta keys: method, args_cor - ch_adjacency // [ meta, adj_matrix] with meta keys: method, args_cor - ch_contrasts - ch_samplesheet - ch_featuresheet - ch_gene_sets - - // TODO: add ch_gm when provided by user, etc. - - main: - - // initialize empty results channels - ch_enriched = Channel.empty() - ch_gmt = Channel.empty() - ch_versions = Channel.empty() - - ch_counts - .branch { - gsea: it[0]["method"] == "gsea" - } - .set { ch_counts } - - ch_adjacency - .branch { - grea: it[0]["method"] == "grea" - } - .set { ch_adjacency } - - // ---------------------------------------------------- - // Construct gene set database - // ---------------------------------------------------- - - // TODO this should be optional, only run when there is no gene set data provided by user - // TODO Use ch_gene_sets if it is not null - MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline - ch_gmt = MYGENE.out.gmt - ch_versions = ch_versions.mix(MYGENE.out.versions) - - // ---------------------------------------------------- - // Perform enrichment analysis with GREA - // ---------------------------------------------------- - - GREA(ch_adjacency.grea.unique(), ch_gmt.collect()) - ch_enriched = ch_enriched.mix(GREA.out.results) - ch_versions = ch_versions.mix(GREA.out.versions) - - // ---------------------------------------------------- - // Perform enrichment analysis with GSEA - // ---------------------------------------------------- - - // For GSEA, we need to convert normalised counts to a GCT format for - // input, and process the sample sheet to generate class definitions - // (CLS) for the variable used in each contrast - - CUSTOM_TABULARTOGSEAGCT ( ch_counts ) - - // TODO: update CUSTOM_TABULARTOGSEACLS for value channel input per new - // guidlines (rather than meta usage employed here) - ch_contrasts_and_samples = ch_contrasts - .map{it[0]} // revert back to contrasts meta map - .combine( ch_samplesheet.map { it[1] } ) - - CUSTOM_TABULARTOGSEACLS(ch_contrasts_and_samples) - - TABULAR_TO_GSEA_CHIP( - ch_featuresheet.map{ it[1] }, - [params.features_id_col, params.features_name_col] - ) - - // The normalised matrix does not always have a contrast meta, so we - // need a combine rather than a join here - // Also add file name to metamap for easy access from modules.config - // TODO combine the input channel with the ch_tools - - ch_gsea_inputs = CUSTOM_TABULARTOGSEAGCT.out.gct - .map{ it.tail() } - .combine(CUSTOM_TABULARTOGSEACLS.out.cls) - .map{ tuple(it[1], it[0], it[2]) } - .combine( ch_gmt.map { meta, gmt -> gmt } ) - - println("__"+TABULAR_TO_GSEA_CHIP.out.chip) - GSEA_GSEA( - ch_gsea_inputs, - ch_gsea_inputs.map{ tuple(it[0].reference, it[0].target) }, // * - TABULAR_TO_GSEA_CHIP.out.chip.first() - ) - - // * Note: GSEA module currently uses a value channel for the mandatory - // non-file arguments used to define contrasts, hence the indicated - // usage of map to perform that transformation. An active subject of - // debate - GSEA_GSEA.out.report_tsvs_ref.view() - ch_gsea_results = GSEA_GSEA.out.report_tsvs_ref - .join(GSEA_GSEA.out.report_tsvs_target) - - ch_enriched = ch_enriched.combine(ch_gsea_results) - - - // Record GSEA versions - ch_versions = ch_versions - .mix(TABULAR_TO_GSEA_CHIP.out.versions) - .mix(GSEA_GSEA.out.versions) - - - // ---------------------------------------------------- - // Perform enrichment analysis with gprofiler2 - // ---------------------------------------------------- - - // todo: add gprofiler2 here - - // Define background file - if (!params.gprofiler2_background_file) { - // If deactivated, use empty list as "background" - ch_background = [] - } else if (params.gprofiler2_background_file == "auto") { - // If auto, use input matrix as background - ch_background = ch_counts.map { meta, counts -> counts } - } else { - ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) - } - - // rearrange channel for GPROFILER2_GOST process - ch_gmt = ch_gmt.map { meta, gmt -> gmt } - - ch_results_genewise_filtered - .branch { - grea: it[0]["method"] == "gprofiler2" - } - .set { ch_results_genewise_filtered } - - GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) - ch_versions = ch_versions.mix(GPROFILER2_GOST.out.versions) - - emit: - enriched = ch_enriched // channel: [ tsv ] - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf deleted file mode 100644 index b08e92b9..00000000 --- a/subworkflows/local/experimental/main.nf +++ /dev/null @@ -1,134 +0,0 @@ -// -// Run experimental analysis -// -include { DIFFERENTIAL } from '../differential/main.nf' -include { CORRELATION } from '../correlation/main.nf' -include { ENRICHMENT } from '../enrichment/main.nf' - -def preprocess_subworkflow_output( ch_input, ch_tools_args, method_field_name) { - // add method arguments to channel meta - return ch_input - .combine(ch_tools_args) - .filter{ meta, input, pathway, arg_maps -> meta["pathway_name"] ? meta["pathway_name"] == pathway["pathway_name"] : true } - .map{ meta, input, pathway, arg_map -> - def meta_clone = meta.clone() + pathway + arg_map.clone() - meta_clone["method"] = meta_clone.remove(method_field_name) - return [meta_clone, input] - } -} - -def postprocess_subworkflow_output( ch_results, field_name ) { - // clean up meta data by removing tool arguments - return ch_results - .map{ meta, data -> - def meta_clone = meta.clone() - meta_clone.removeAll{it.key in field_name} - return [meta_clone, data] - } -} - -workflow EXPERIMENTAL { - take: - ch_contrasts // [ meta, contrast_variable, reference, target ] - ch_samplesheet // [ meta, samplesheet ] - ch_featuresheet // [ meta, featuresheet ] - ch_gene_sets - ch_counts // [ meta, counts] - ch_tools // [ pathway_name, differential_map, correlation_map, enrichment_map ] - ch_transcript_lengths - ch_control_features - - main: - - ch_versions = Channel.empty() - - // split toolsheet into channels - ch_tools.count() - .combine(ch_tools) - .multiMap{ - n, pathway, differential_map, correlation_map, enrichment_map -> - def pathway_name = n == 1 ? ["pathway_name":""] : pathway - diff: [ pathway_name, differential_map ] - corr: [ pathway_name, correlation_map ] - enr: [ pathway_name, enrichment_map ] - } - .set{ ch_tools } - - // initialize empty results channels - ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table - ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table - ch_results_genewise = Channel.empty() // differential results for genewise analysis - it should be a table - ch_results_genewise_filtered = Channel.empty() // differential results for genewise analysis - filtered - it should be a table - ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 - ch_matrix = Channel.empty() // correlation matrix - ch_enriched = Channel.empty() // output table from enrichment analysis - - // ---------------------------------------------------- - // DIFFERENTIAL ANALYSIS BLOCK - // ---------------------------------------------------- - - preprocess_subworkflow_output(ch_counts, ch_tools.diff, "diff_method") - .set{ ch_counts_diff } - DIFFERENTIAL( - ch_counts_diff, - ch_samplesheet, - ch_contrasts, - ch_transcript_lengths, - ch_control_features - ) - ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,["method", "args_diff"]).mix(ch_results_pairwise) - ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,["method", "args_diff"]).mix(ch_results_pairwise_filtered) - ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,["method", "args_diff"]).mix(ch_results_genewise) - ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,["method", "args_diff"]).mix(ch_results_genewise_filtered) - ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,["method", "args_diff"]).mix(ch_adjacency) - ch_versions = ch_versions.mix(DIFFERENTIAL.out.versions) - - // ---------------------------------------------------- - // CORRELATION ANALYSIS BLOCK - // ---------------------------------------------------- - - preprocess_subworkflow_output(ch_counts, ch_tools.corr, "cor_method") - .set{ ch_counts_corr } - - CORRELATION( - ch_counts_corr - ) - ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,["method", "args_cor"]).mix(ch_matrix) - ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,["method", "args_cor"]).mix(ch_adjacency) - ch_versions = ch_versions.mix(CORRELATION.out.versions) - - // ---------------------------------------------------- - // FUNCTIONAL ENRICHMENT BLOCK - // ---------------------------------------------------- - - preprocess_subworkflow_output(ch_counts, ch_tools.enr, "enr_method") - .set{ ch_counts_enr } - preprocess_subworkflow_output(ch_results_genewise, ch_tools.enr, "enr_method") - .set{ ch_results_genewise_enr } - preprocess_subworkflow_output(ch_results_genewise_filtered, ch_tools.enr, "enr_method") - .set{ ch_results_genewise_filtered_enr } - preprocess_subworkflow_output(ch_adjacency, ch_tools.enr, "enr_method") - .set{ ch_adjacency_enr } - - ENRICHMENT( - ch_counts_enr, - ch_results_genewise_enr, - ch_results_genewise_filtered_enr, - ch_adjacency_enr, - ch_contrasts, - ch_samplesheet, - ch_featuresheet, - ch_gene_sets - ) - ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) - ch_versions = ch_versions.mix(ENRICHMENT.out.versions) - - // ---------------------------------------------------- - // VISUALIZATION BLOCK - // ---------------------------------------------------- - - // TODO: call visualization stuff here - - emit: - versions = ch_versions -} diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index b0d0dcf8..23b99506 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -43,10 +43,10 @@ if (params.study_type == 'affy_array') { error("Query GSE not specified or features metadata columns not specified") } } else { - // If this is not microarray data or maxquant output, and this an RNA-seq dataset or experimental analysis, + // If this is not microarray data or maxquant output, and this an RNA-seq dataset, // then assume we're reading from a matrix - if (params.study_type in ["rnaseq", "experimental"] && params.matrix) { + if (params.study_type == "rnaseq" && params.matrix) { matrix_file = file(params.matrix, checkIfExists: true) ch_in_raw = Channel.of([ exp_meta, matrix_file]) } else { @@ -61,8 +61,8 @@ if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run -ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (run_gene_set_analysis) { + ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (params.gene_sets_files) { gene_sets_files = params.gene_sets_files.split(",") ch_gene_sets = Channel.of(gene_sets_files).map { file(it, checkIfExists: true) } @@ -98,10 +98,8 @@ citations_file = file(params.citations_file, checkIfExists: true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabular_to_gsea_chip' -include { FILTER_DIFFTABLE } from '../modules/local/filter_difftable' -include { EXPERIMENTAL } from '../subworkflows/local/experimental/main.nf' - +include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabulartogseachip' +include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -136,8 +134,6 @@ include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/n include { IMMUNEDECONV } from '../modules/nf-core/immunedeconv/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { samplesheetToList } from 'plugin/nf-schema' - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -311,7 +307,7 @@ workflow DIFFERENTIALABUNDANCE { ch_norm = VALIDATOR.out.assays } - if(params.study_type !in ['rnaseq', 'experimental']) { + if(params.study_type != 'rnaseq') { ch_matrix_for_differential = ch_norm } else{ @@ -370,52 +366,6 @@ workflow DIFFERENTIALABUNDANCE { ch_processed_matrices = ch_norm .map{ it.tail() } .first() -<<<<<<< HEAD -======= - } else if (params.study_type == 'experimental') { - - // Convert the toolsheet.csv in a channel with the proper format - ch_tools = Channel.fromList(samplesheetToList(params.tools, './assets/schema_tools.json')) - .map { - it -> - def pathway_name = it[0].subMap(["pathway_name"]) - def differential_map = it[0].subMap(["diff_method","args_diff"]) - def correlation_map = it[0].subMap(["cor_method","args_cor"]) - def enrichment_map = it[0].subMap(["enr_method","args_enr"]) - [ pathway_name, differential_map, correlation_map, enrichment_map ] - }.unique() - - // Filter the tools to the pathway(s) of interest, or run everything if requested - if (params.pathway == "all") { - ch_tools - .set{ ch_tools } - } else { - ch_tools - .filter{ - it[0]["pathway_name"] in params.pathway.tokenize(',') - } - .set{ ch_tools } - } - - EXPERIMENTAL( - ch_contrasts, - VALIDATOR.out.sample_meta, - VALIDATOR.out.feature_meta, - ch_gene_sets, - CUSTOM_MATRIXFILTER.out.filtered, - ch_tools, - ch_transcript_lengths, - ch_control_features - ) - - // TODO for the moment, these channels are allocated to not breaking the next part. - // they have to be properly handled afterwards - ch_norm = Channel.empty() - ch_differential = Channel.empty() - ch_processed_matrices = Channel.empty() - ch_model = Channel.empty() - } else { ->>>>>>> origin/dev-ratio } else { DESEQ2_NORM ( @@ -546,6 +496,7 @@ workflow DIFFERENTIALABUNDANCE { } // For gprofiler2, token and organism have priority and will override a gene_sets file + GPROFILER2_GOST( ch_filtered_diff, ch_gene_sets.first(), From b68f1e1e261f6b45057d64a5c2b670e4751e8b20 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 27 Jan 2025 15:10:21 +0100 Subject: [PATCH 03/29] installed subworkflows and associated modules --- modules.json | 39 +- .../custom/tabulartogseachip/environment.yml | 5 + .../nf-core/custom/tabulartogseachip/main.nf | 56 + .../nf-core/custom/tabulartogseachip/meta.yml | 53 + .../tabulartogseachip/tests/main.nf.test | 68 + .../tabulartogseachip/tests/main.nf.test.snap | 42 + modules/nf-core/propr/grea/environment.yml | 7 + modules/nf-core/propr/grea/main.nf | 24 + modules/nf-core/propr/grea/meta.yml | 75 ++ modules/nf-core/propr/grea/templates/grea.R | 300 +++++ .../nf-core/propr/grea/tests/grea_test.config | 14 + modules/nf-core/propr/grea/tests/main.nf.test | 66 + .../propr/grea/tests/main.nf.test.snap | 26 + modules/nf-core/propr/grea/tests/tags.yml | 2 + modules/nf-core/propr/propd/environment.yml | 7 + modules/nf-core/propr/propd/main.nf | 30 + modules/nf-core/propr/propd/meta.yml | 172 +++ modules/nf-core/propr/propd/templates/propd.R | 725 +++++++++++ .../nf-core/propr/propd/tests/boxcox.config | 5 + .../nf-core/propr/propd/tests/default.config | 5 + .../nf-core/propr/propd/tests/main.nf.test | 176 +++ .../propr/propd/tests/main.nf.test.snap | 140 +++ .../propr/propd/tests/permutation.config | 5 + .../nf-core/propr/propd/tests/save_all.config | 5 + modules/nf-core/propr/propd/tests/tags.yml | 2 + .../abundance_differential_filter/main.nf | 192 +++ .../abundance_differential_filter/meta.yml | 140 +++ .../tests/deseq2_basic.config | 14 + .../tests/deseq2_limmavoom_basic.config | 28 + .../tests/deseq2_limmavoom_propd_basic.config | 33 + .../tests/limma_basic_microarray.config | 22 + .../tests/limma_voom.config | 17 + .../tests/main.nf.test | 527 ++++++++ .../tests/main.nf.test.snap | 1091 +++++++++++++++++ .../tests/propd_basic.config | 5 + .../main.nf | 149 +++ .../meta.yml | 151 +++ .../tests/all.config | 64 + .../tests/deseq2_gprofiler2.config | 30 + .../tests/deseq2_gsea.config | 23 + .../tests/gprofiler2.config | 17 + .../tests/main.nf.test | 490 ++++++++ .../tests/main.nf.test.snap | 600 +++++++++ .../tests/propd_grea.config | 15 + 44 files changed, 5650 insertions(+), 7 deletions(-) create mode 100644 modules/nf-core/custom/tabulartogseachip/environment.yml create mode 100644 modules/nf-core/custom/tabulartogseachip/main.nf create mode 100644 modules/nf-core/custom/tabulartogseachip/meta.yml create mode 100644 modules/nf-core/custom/tabulartogseachip/tests/main.nf.test create mode 100644 modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/grea/environment.yml create mode 100644 modules/nf-core/propr/grea/main.nf create mode 100644 modules/nf-core/propr/grea/meta.yml create mode 100644 modules/nf-core/propr/grea/templates/grea.R create mode 100644 modules/nf-core/propr/grea/tests/grea_test.config create mode 100644 modules/nf-core/propr/grea/tests/main.nf.test create mode 100644 modules/nf-core/propr/grea/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/grea/tests/tags.yml create mode 100644 modules/nf-core/propr/propd/environment.yml create mode 100644 modules/nf-core/propr/propd/main.nf create mode 100644 modules/nf-core/propr/propd/meta.yml create mode 100644 modules/nf-core/propr/propd/templates/propd.R create mode 100644 modules/nf-core/propr/propd/tests/boxcox.config create mode 100644 modules/nf-core/propr/propd/tests/default.config create mode 100755 modules/nf-core/propr/propd/tests/main.nf.test create mode 100644 modules/nf-core/propr/propd/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/propd/tests/permutation.config create mode 100644 modules/nf-core/propr/propd/tests/save_all.config create mode 100755 modules/nf-core/propr/propd/tests/tags.yml create mode 100644 subworkflows/nf-core/abundance_differential_filter/main.nf create mode 100644 subworkflows/nf-core/abundance_differential_filter/meta.yml create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config create mode 100644 subworkflows/nf-core/differential_functional_enrichment/main.nf create mode 100644 subworkflows/nf-core/differential_functional_enrichment/meta.yml create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/all.config create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config diff --git a/modules.json b/modules.json index 094bfc3e..d20dd016 100644 --- a/modules.json +++ b/modules.json @@ -18,27 +18,32 @@ "custom/filterdifferentialtable": { "branch": "master", "git_sha": "833a65446ea117d092d4940f098236b6766e7aac", - "installed_by": ["modules"] + "installed_by": ["abundance_differential_filter", "modules"] }, "custom/matrixfilter": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", "installed_by": ["modules"] }, + "custom/tabulartogseachip": { + "branch": "master", + "git_sha": "7900e49fb84969a2479ecfbeef7bcbe296513c90", + "installed_by": ["differential_functional_enrichment"] + }, "custom/tabulartogseacls": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "installed_by": ["differential_functional_enrichment", "modules"] }, "custom/tabulartogseagct": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "installed_by": ["differential_functional_enrichment", "modules"] }, "deseq2/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": ["modules"] + "installed_by": ["abundance_differential_filter", "modules"] }, "geoquery/getgeo": { "branch": "master", @@ -48,12 +53,12 @@ "gprofiler2/gost": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "installed_by": ["differential_functional_enrichment", "modules"] }, "gsea/gsea": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "installed_by": ["differential_functional_enrichment", "modules"] }, "gunzip": { "branch": "master", @@ -68,7 +73,17 @@ "limma/differential": { "branch": "master", "git_sha": "136f443c0a6d5c526410c7c9b73ce51ef457c341", - "installed_by": ["modules"] + "installed_by": ["abundance_differential_filter", "modules"] + }, + "propr/grea": { + "branch": "master", + "git_sha": "138b2c45dde12b2075d6fe15a5d374b48d166d4a", + "installed_by": ["differential_functional_enrichment"] + }, + "propr/propd": { + "branch": "master", + "git_sha": "0e9cb409c32d3ec4f0d3804588e4778971c09b7e", + "installed_by": ["abundance_differential_filter"] }, "proteus/readproteingroups": { "branch": "master", @@ -114,6 +129,16 @@ }, "subworkflows": { "nf-core": { + "abundance_differential_filter": { + "branch": "master", + "git_sha": "2b977a47af8a319f6ef6e7b918e7bb64babbaa04", + "installed_by": ["subworkflows"] + }, + "differential_functional_enrichment": { + "branch": "master", + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", + "installed_by": ["subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", diff --git a/modules/nf-core/custom/tabulartogseachip/environment.yml b/modules/nf-core/custom/tabulartogseachip/environment.yml new file mode 100644 index 00000000..cc49deff --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - "conda-forge::gawk=5.1.0" diff --git a/modules/nf-core/custom/tabulartogseachip/main.nf b/modules/nf-core/custom/tabulartogseachip/main.nf new file mode 100644 index 00000000..c0622cda --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/main.nf @@ -0,0 +1,56 @@ +process CUSTOM_TABULARTOGSEACHIP { + + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : + 'biocontainers/gawk:5.1.0' }" + + input: + tuple val(meta), path(tabular) + tuple val(id) , val(symbol) + + output: + tuple val(meta), path("*.chip"), emit: chip + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + function find_column_number { + file=\$1 + column=\$2 + + head -n 1 \$file | tr '\\t' '\\n' | grep -n "^\${column}\$" | awk -F':' '{print \$1}' + } + + id_col=\$(find_column_number $tabular $id) + symbol_col=\$(find_column_number $tabular $symbol) + outfile=${prefix}.chip + + echo -e "Probe Set ID\\tGene Symbol\\tGene Title" > \${outfile}.tmp + tail -n +2 $tabular | awk -F'\\t' -v id=\$id_col -v symbol=\$symbol_col '{print \$id"\\t"\$symbol"\\tNA"}' >> \${outfile}.tmp + mv \${outfile}.tmp \${outfile} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + outfile=${prefix}.chip + touch \$outfile + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/custom/tabulartogseachip/meta.yml b/modules/nf-core/custom/tabulartogseachip/meta.yml new file mode 100644 index 00000000..5759874c --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/meta.yml @@ -0,0 +1,53 @@ +name: "custom_tabulartogseachip" +description: Make a GSEA class file (.chip) from tabular inputs +keywords: + - gsea + - chip + - convert + - tabular +tools: + - custom: + description: "Make a GSEA annotation file (.chip) from tabular inputs" + tool_dev_url: "https://github.com/nf-core/modules/blob/master/modules/nf-core/custom/tabulartogseachip/main.nf" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - tabular: + type: file + description: | + Tabular (NOTE that for the moment it only works for TSV file) containing a column with the + features ids, and another column with the features symbols. + pattern: "*.{tsv}" + - - id: + type: string + description: The name of the column containing feature ids + - symbol: + type: string + description: The name of the column containing feature symbols +output: + - chip: + - meta: + type: map + description: Groovy Map containing metadata e.g. [ id:'test', ... ] + - "*.chip": + type: file + description: | + A categorical class format file (.chip) as defined by the Broad + documentation at + https://software.broadinstitute.org/cancer/software/gsea/wiki/index.php/Data_formats + pattern: "*.chip" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@pinin4fjords" + - "@suzannejin" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test new file mode 100644 index 00000000..6c2025a1 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test @@ -0,0 +1,68 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEACHIP" + script "../main.nf" + process "CUSTOM_TABULARTOGSEACHIP" + + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "custom/tabulartogseachip" + + test("test tsv to chip") { + + when { + process { + """ + input[0] = Channel + .fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + .map { it -> [ + [id:it.baseName], it + ]} + input[1] = Channel.of(['gene_id', 'gene_name']) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.chip, + process.out.versions + ).match() } + ) + } + + } + + test("test tsv to chip - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel + .fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + .map { it -> [ + [id:it.baseName], it + ]} + input[1] = Channel.of(['gene_id', 'gene_name']) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.chip, + process.out.versions + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap new file mode 100644 index 00000000..bb66d232 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap @@ -0,0 +1,42 @@ +{ + "test tsv to chip": { + "content": [ + [ + [ + { + "id": "SRP254919.salmon.merged.gene_counts.top1000cov" + }, + "SRP254919.salmon.merged.gene_counts.top1000cov.chip:md5,2ab8a685c675ce2fb97142526766044a" + ] + ], + [ + "versions.yml:md5,61dab2d2b9aa1333c4c3bfd7bd893ce5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-16T18:05:22.341224384" + }, + "test tsv to chip - stub": { + "content": [ + [ + [ + { + "id": "SRP254919.salmon.merged.gene_counts.top1000cov" + }, + "SRP254919.salmon.merged.gene_counts.top1000cov.chip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + "versions.yml:md5,61dab2d2b9aa1333c4c3bfd7bd893ce5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-17T13:14:53.792845507" + } +} diff --git a/modules/nf-core/propr/grea/environment.yml b/modules/nf-core/propr/grea/environment.yml new file mode 100644 index 00000000..9744dab9 --- /dev/null +++ b/modules/nf-core/propr/grea/environment.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::bioconductor-limma=3.58.1 + - conda-forge::r-propr=5.1.5 diff --git a/modules/nf-core/propr/grea/main.nf b/modules/nf-core/propr/grea/main.nf new file mode 100644 index 00000000..fd727208 --- /dev/null +++ b/modules/nf-core/propr/grea/main.nf @@ -0,0 +1,24 @@ +process PROPR_GREA { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b6/b65f7192866fbd9a947df15b104808abb720e7a224bbe3ca8f7f8f680f52c97a/data' : + 'community.wave.seqera.io/library/bioconductor-limma_r-propr:f52f1d4fea746393' }" + + input: + tuple val(meta), path(adjacency) + tuple val(meta2), path(gmt) + + output: + tuple val(meta), path("*.grea.tsv"), emit: results + path "versions.yml", emit: versions + path "*.R_sessionInfo.log", emit: session_info + + when: + task.ext.when == null || task.ext.when + + script: + template 'grea.R' +} diff --git a/modules/nf-core/propr/grea/meta.yml b/modules/nf-core/propr/grea/meta.yml new file mode 100644 index 00000000..cc0613d3 --- /dev/null +++ b/modules/nf-core/propr/grea/meta.yml @@ -0,0 +1,75 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "propr_grea" +description: Perform Gene Ratio Enrichment Analysis +keywords: + - propr + - grea + - logratio + - differential expression + - functional enrichment + - functional analysis +tools: + - "grea": + description: "Gene Ratio Enrichment Analysis" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.2202/1544-6115.1175" + licence: ["GPL-2"] + identifier: biotools:propr +input: + - - meta: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - adjacency: + type: file + description: | + Adjacency matrix representing the graph connections (ie. 1 for edges, 0 otherwise). + This can be the adjacency matrix output from gene ratio approaches like propr/propd. + pattern: "*.{csv,tsv}" + - - meta2: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - gmt: + type: file + description: | + A tab delimited file format that describes gene sets. The first column is the + concept id (eg. GO term, pathway, etc), the second column is the concept description, and the + rest are nodes (eg. genes) that is associated to the given concept. + pattern: "*.{gmt}" +output: + - results: + - meta: + type: file + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - "*.grea.tsv": + type: file + description: | + Output file containing the information about the tested concepts (ie. gene sets) + and enrichment statistics. + pattern: "*.grea.tsv" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + - session_info: + - "*.R_sessionInfo.log": + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" +authors: + - "@caraiz2001" + - "@suzannejin" +maintainers: + - "@caraiz2001" + - "@suzannejin" diff --git a/modules/nf-core/propr/grea/templates/grea.R b/modules/nf-core/propr/grea/templates/grea.R new file mode 100644 index 00000000..3b761f89 --- /dev/null +++ b/modules/nf-core/propr/grea/templates/grea.R @@ -0,0 +1,300 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files (determined by file extension) +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension + + if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file + separator <- "\\t" # Set the separator variable to tab + } else if (ext == "csv") { # If the file is a csv file + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( # Read the file + file, + sep = separator, # Set the separator defined above + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Loads the .gmt file and converts it into a knowledge database +#' +#' @param filename path of the .gmt file +#' @param nodes vector of node (eg. gene) names. Note that this set should be as +#' complete as possible. So it should not only contain the target genes but also +#' the background genes. +#' @return a list with: +#' `db` A knowledge database (matrix) where each row is a graph node (eg. gene) +#' and each column is a concept (eg. GO term, pathway, etc). +#' `description` A list of descriptions for each concept. +load_gmt <- function(filename, nodes) { + + # read gmt file + gmt <- readLines(filename) + gmt <- strsplit(gmt, "\\t") + + # initialize database matrix + db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) + rownames(db) <- nodes + colnames(db) <- sapply(gmt, function(entry) entry[[1]]) + + # description of the concepts + description <- list() + + # for concept in gmt + for (i in 1:length(gmt)) { + + # get concept and description + concept <- gmt[[i]][[1]] + description[[concept]] <- gmt[[i]][[2]] + + # fill 1 if gene is in concept + nodes_in_concept <- gmt[[i]][-c(1, 2)] + nodes_in_concept <- nodes_in_concept[nodes_in_concept %in% nodes] + db[nodes_in_concept, i] <- 1 + } + + return(list(db = db, description = description)) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input data + adj = '$adjacency', # adjacency matrix + gmt = '$gmt', # knowledge database .gmt file + + # parameters for gene sets + set_min = 15, # minimum number of genes in a set + set_max = 500, # maximum number of genes in a set + + # parameters for permutation test + permutation = 100, # number of permutations to perform + + # other parameters + seed = NA, # seed for reproducibility + round_digits = NA, # number of digits to round results + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + adj = 'character', + gmt = 'character', + set_min = 'numeric', + set_max = 'numeric', + permutation = 'numeric', + seed = 'numeric', + round_digits = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_ext <- ifelse('$task.ext.args' == 'null', '', '$task.ext.args') +args_opt <- parse_args(args_ext) +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('adj', 'gmt')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters are valid + +if (opt\$permutation < 0) { + stop('permutation should be a positive integer') +} + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Enrichment analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load adjacency matrix +# this matrix should have gene x gene dimensions + +message("Loading input data") + +adj <- as.matrix(read_delim_flexible( + opt\$adj, + header = TRUE, + row.names = 1, + check.names = FALSE +)) +if (nrow(adj) != ncol(adj)) { + stop('Adjacency matrix should be a squared matrix that reflects the connections between all the nodes') +} +if (!all(rownames(adj) == colnames(adj))) { + stop('Adjacency matrix row names are not equal to column names') +} + +# load and process knowledge database + +gmt <- load_gmt( + opt\$gmt, + rownames(adj) # adj should contain all the nodes (target and background) +) + +# filter gene sets +# gene sets with less than set_min or more than set_max genes are removed + +idx <- which(colSums(gmt\$db) > opt\$set_min & colSums(gmt\$db) < opt\$set_max) +if (length(idx) == 0){ + stop("No gene set pass the filter of set_min=", opt\$set_min, " and set_max=", opt\$set_max) +} +gmt\$db <- gmt\$db[, idx] +gmt\$description <- gmt\$description[idx] + +# run GREA +# Basically, it calculates the odds ratio of the graph being enriched in each concept, +# and the FDR of the odds ratio through permutation tests + +message("Running GREA") + +odds <- runGraflex( + adj, + gmt\$db, + p=opt\$permutation, + ncores=opt\$ncores +) +odds\$Description <- sapply(odds\$Concept, function(concept) + gmt\$description[[concept]] +) + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +if (!is.na(opt\$round_digits)) { + for (col in c('Odds', 'LogOR', 'FDR.under', 'FDR.over')){ + odds[,col] <- round(odds[,col], opt\$round_digits) + } +} + +write.table( + odds, + file = paste0(opt\$prefix, '.grea.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/grea/tests/grea_test.config b/modules/nf-core/propr/grea/tests/grea_test.config new file mode 100644 index 00000000..7d354c01 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/grea_test.config @@ -0,0 +1,14 @@ +process { + // set single core for reproducibility + // NOTE this method relies on parallelization and permutation tests + // The permutations are done within each node, which makes set.seed not working properly when + // different nodes are starting/ending depending on the case + cpus = 1 + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/grea/tests/main.nf.test b/modules/nf-core/propr/grea/tests/main.nf.test new file mode 100644 index 00000000..38a015e4 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test @@ -0,0 +1,66 @@ +nextflow_process { + + name "Test Process PROPR_GREA" + script "../main.nf" + process "PROPR_GREA" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/grea" + tag "propr/propd" + + test("test grea chained to propd") { + + tag "default" + config "./grea_test.config" + + setup { + run("PROPR_PROPD") { + script "../../propd/main.nf" + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + } + + when { + process { + """ + input[0] = PROPR_PROPD.out.adjacency + input[1] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.versions + ).match()} + ) + } + } +} diff --git a/modules/nf-core/propr/grea/tests/main.nf.test.snap b/modules/nf-core/propr/grea/tests/main.nf.test.snap new file mode 100644 index 00000000..6c5dd533 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test.snap @@ -0,0 +1,26 @@ +{ + "test grea chained to propd": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + [ + "versions.yml:md5,060fcd8ce4afc482e237fa75686a0aba" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-11T13:00:02.026244403" + } +} diff --git a/modules/nf-core/propr/grea/tests/tags.yml b/modules/nf-core/propr/grea/tests/tags.yml new file mode 100644 index 00000000..e7f80baf --- /dev/null +++ b/modules/nf-core/propr/grea/tests/tags.yml @@ -0,0 +1,2 @@ +propr/grea: + - "modules/nf-core/propr/grea/**" diff --git a/modules/nf-core/propr/propd/environment.yml b/modules/nf-core/propr/propd/environment.yml new file mode 100644 index 00000000..9744dab9 --- /dev/null +++ b/modules/nf-core/propr/propd/environment.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::bioconductor-limma=3.58.1 + - conda-forge::r-propr=5.1.5 diff --git a/modules/nf-core/propr/propd/main.nf b/modules/nf-core/propr/propd/main.nf new file mode 100644 index 00000000..54b81c8e --- /dev/null +++ b/modules/nf-core/propr/propd/main.nf @@ -0,0 +1,30 @@ +process PROPR_PROPD { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b6/b65f7192866fbd9a947df15b104808abb720e7a224bbe3ca8f7f8f680f52c97a/data' : + 'community.wave.seqera.io/library/bioconductor-limma_r-propr:f52f1d4fea746393' }" + + input: + tuple val(meta), val(contrast_variable), val(reference), val(target) + tuple val(meta2), path(samplesheet), path(counts) + + output: + tuple val(meta), path("*.propd.genewise.tsv") , emit: results_genewise + tuple val(meta), path("*.propd.genewise.png") , emit: genewise_plot + tuple val(meta), path("*.propd.rds") , emit: rdata , optional:true + tuple val(meta), path("*.propd.pairwise.tsv") , emit: results_pairwise , optional:true + tuple val(meta), path("*.propd.pairwise_filtered.tsv"), emit: results_pairwise_filtered, optional:true + tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional:true + tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional:true + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propd.R' +} diff --git a/modules/nf-core/propr/propd/meta.yml b/modules/nf-core/propr/propd/meta.yml new file mode 100644 index 00000000..57f1521f --- /dev/null +++ b/modules/nf-core/propr/propd/meta.yml @@ -0,0 +1,172 @@ +name: "propr_propd" +description: Perform differential proportionality analysis +keywords: + - differential + - proportionality + - logratio + - expression + - propr + - propd +tools: + - "propr": + description: "Logratio methods for omics data" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.1038/s41598-017-16520-0" + licence: ["GPL-2"] + identifier: biotools:propr +input: + - - meta: + type: map + description: | + Groovy Map containing contrast information. This can be used at the + workflow level to pass optional parameters to the module, e.g. + [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: + '--blocking_variable $meta.blocking'. + - contrast_variable: + type: string + description: | + The column in the sample sheet that should be used to define groups for + comparison + - reference: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the reference samples + - target: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the target samples + - - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the sample sheet + and matrix + - samplesheet: + type: file + description: | + CSV or TSV format sample sheet with sample metadata + - counts: + type: file + description: | + Raw TSV or CSV format expression matrix as output from the nf-core + RNA-seq workflow +output: + - results_genewise: + - meta: + type: file + description: | + TSV-format table of genes associated with differential expression + information as compiled from the propd results + pattern: "*.propd.genewise.tsv" + - "*.propd.genewise.tsv": + type: file + description: | + TSV-format table of genes associated with differential expression + information as compiled from the propd results + pattern: "*.propd.genewise.tsv" + - genewise_plot: + - meta: + type: file + description: | + PNG-format plot of accumulated between group variance vs median log + fold change. Genes with high between group variance and high log fold + change are likely to be differentially expressed. + pattern: "*.propd.genewise.png" + - "*.propd.genewise.png": + type: file + description: | + PNG-format plot of accumulated between group variance vs median log + fold change. Genes with high between group variance and high log fold + change are likely to be differentially expressed. + pattern: "*.propd.genewise.png" + - rdata: + - meta: + type: file + description: | + (Optional) R data containing propd object + pattern: "*.propd.rds" + - "*.propd.rds": + type: file + description: | + (Optional) R data containing propd object + pattern: "*.propd.rds" + - results_pairwise: + - meta: + type: file + description: | + (Optional) TSV-format table of the native propd pairwise results. This + table contains the differential proportionality values associated to + each pair of genes. + pattern: "*.propd.pairwise.tsv" + - "*.propd.pairwise.tsv": + type: file + description: | + (Optional) TSV-format table of the native propd pairwise results. This + table contains the differential proportionality values associated to + each pair of genes. + pattern: "*.propd.pairwise.tsv" + - results_pairwise_filtered: + - meta: + type: file + description: | + (Optional) TSV-format table of the filtered propd pairwise results. This + table contains the pairs of genes with significant differential + proportionality values. + pattern: "*.propd.pairwise_filtered.tsv" + - "*.propd.pairwise_filtered.tsv": + type: file + description: | + (Optional) TSV-format table of the filtered propd pairwise results. This + table contains the pairs of genes with significant differential + proportionality values. + pattern: "*.propd.pairwise_filtered.tsv" + - adjacency: + - meta: + type: file + description: | + (Optional) CSV-format table of the adjacency matrix defining a graph, with + edges (1) associated to pairs of genes that are significantly differentially + proportional. + pattern: "*.propd.adjacency.csv" + - "*.propd.adjacency.csv": + type: file + description: | + (Optional) CSV-format table of the adjacency matrix defining a graph, with + edges (1) associated to pairs of genes that are significantly differentially + proportional. + pattern: "*.propd.adjacency.csv" + - fdr: + - meta: + type: file + description: | + (Optional) TSV-format table of FDR values. When permutation tests is performed, + this table is generated with the FDR values calculated by the permutation tests. + This is a more conservative test than the default BH method, but more + computationally expensive. + pattern: "*.propd.fdr.tsv" + - "*.propd.fdr.tsv": + type: file + description: | + (Optional) TSV-format table of FDR values. When permutation tests is performed, + this table is generated with the FDR values calculated by the permutation tests. + This is a more conservative test than the default BH method, but more + computationally expensive. + pattern: "*.propd.fdr.tsv" + - session_info: + - "*.R_sessionInfo.log": + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@suzannejin" + - "@caraiz2001" +maintainers: + - "@suzannejin" diff --git a/modules/nf-core/propr/propd/templates/propd.R b/modules/nf-core/propr/propd/templates/propd.R new file mode 100644 index 00000000..d75e3d2c --- /dev/null +++ b/modules/nf-core/propr/propd/templates/propd.R @@ -0,0 +1,725 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Get genewise table with logfold changes and connectivity information +#' +#' This function calculates the logfold changes of genes with respect to the reference set, +#' which is dynamically defined as the set of genes that are significantly proportional to +#' each target gene. Note that the output table will only contain genes that are significantly +#' proportional to at least one other gene. +#' +#' @param results Data frame with significant pairs +#' @return Data frame with the following columns: +#' - lfc = overall logfold change of the gene with respect to the reference set +#' - lfc_error = median average deviation of the logfold changes -> this reflects the error +#' - connectivity = size of the reference set -> this also reflects the connectivity of the gene +# - weighted_connectivity = this reflects the weighted connectivity of the gene, so the lower +#' the theta the closer to 1 full connectivity. One can also interpret this as the accumulated +#' between group variance of the gene (as the theta values reflects the between group variance +#' vs within group variance). +get_genewise_information <- function(results) { + + message("Alert: Genewise information is computed based on pairwise ratios.") + + # get unique genes + + genes <- unique(c(results\$Pair, results\$Partner)) + n_genes <- length(genes) + + # create empty matrix + + mat <- data.frame( + 'features_id_col' = character(n_genes), + lfc = numeric(n_genes), + lfc_error = numeric(n_genes), + connectivity = numeric(n_genes), + weighted_connectivity = numeric(n_genes) + ) + colnames(mat) <- c(opt\$features_id_col, 'lfc', 'lfc_error', 'connectivity', 'weighted_connectivity') + mat[, 1] <- genes + + i <- 0 + for (gene in genes){ + i <- i + 1 + + # get rows with this gene involved + # NOTE that gene can be a partner or a pair and we have to consider both cases. + # NOTE that reference set is the set of genes that are partners or pairs of the gene. + # In other words, the set of genes that are significantly proportional to the gene, + # hence connected to the gene in the network. + + idx1 <- which(results[,1] == gene) + idx2 <- which(results[,2] == gene) + reference_idx <- union(idx1, idx2) + + # calculate logfold changes of the gene with respect to the reference set + # Differently to the approach usually implemented in methods like DESeq2, + # here we have a dynamic reference defined by all the genes significantly proportional to the target gene. + + logfoldchange1 <- results[idx1, 'lrm1'] - results[idx1, 'lrm2'] + logfoldchange2 <- results[idx2, 'lrm2'] - results[idx2, 'lrm1'] + logfoldchanges <- union(logfoldchange1, logfoldchange2) + + # fill in matrix values + + mat[i, 'lfc'] <- median(logfoldchanges) + mat[i, 'lfc_error'] <- mad(logfoldchanges) + mat[i, 'connectivity'] <- length(reference_idx) + mat[i, 'weighted_connectivity'] <- sum(1 - results[reference_idx, 'theta']) + } + + return(mat) +} + +#' Plot genewise information +#' +#' This function plots the genewise information, which is a scatter plot of the logfold changes +#' of the genes with respect to the reference set (x-axis) and the accumulated between group variance +#' of the genes (y-axis). The accumulated between group variance is calculated as the sum of 1 - theta +#' values of the genes that are significantly proportional to the target gene. This can be interpreted +#' as the weighted connectivity of the gene in the network. +#' +#' @param results Data frame with genewise information +#' @param output Output png file name +plot_genewise_information <- function(results, output) { + + # create figure + png(output, width=1200, height=600) # Adjust width to accommodate two plots side by side + par(mfrow = c(1, 2)) + + # plot scatter plot with normal y-axis + plot( + results\$lfc, + results\$weighted_connectivity, + xlab = 'Logfold change', + ylab = 'Accumulated between group variance', + main = 'Normal Y-axis' + ) + + # plot scatter plot with log10 y-axis + plot( + results\$lfc, + results\$weighted_connectivity, + xlab = 'Logfold change', + ylab = 'Accumulated between group variance', + log = 'y', + main = 'Log10 Y-axis' + ) + + dev.off() +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix + counts = '$counts', + features_id_col = 'gene_id', # column name of feature ids + + # comparison groups + samplesheet = '$samplesheet', + obs_id_col = 'sample', # column name of observation ids + contrast_variable = "$contrast_variable", # column name of contrast variable + reference_group = "$reference", # reference group for contrast variable + target_group = "$target", # target group for contrast variable + + # parameters for computing differential proportionality + alpha = NA, # alpha for boxcox transformation + moderated = TRUE, # use moderated theta + + # parameters for getting the significant differentially proportional pairs + fdr = 0.05, # FDR threshold + permutation = 0, # if permutation > 0, use permutation test to compute FDR + number_of_cutoffs = 100, # number of cutoffs for permutation test + + # saving options + # note that pairwise outputs are very large, so it is recommended to save them only when needed + save_pairwise_full = FALSE, # save full pairwise results + save_pairwise = FALSE, # save filtered pairwise results + save_adjacency = FALSE, # save adjacency matrix + save_rdata = FALSE, # save rdata + + # other parameters + seed = NA, # seed for reproducibility + round_digits = NA, # number of digits to round results + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + counts = 'character', + samplesheet = 'character', + features_id_col = 'character', + obs_id_col = 'character', + contrast_variable = 'character', + reference_group = 'character', + target_group = 'character', + alpha = 'numeric', + moderated = 'logical', + fdr = 'numeric', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + save_pairwise_full = 'logical', + save_pairwise = 'logical', + save_adjacency = 'logical', + save_rdata = 'logical', + seed = 'numeric', + round_digits = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_ext <- ifelse('$task.ext.args' == 'null', '', '$task.ext.args') +args_opt <- parse_args(args_ext) +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('counts','samplesheet','contrast_variable','reference_group','target_group') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('counts','samplesheet')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters are valid + +if (opt\$permutation < 0) { + stop('permutation should be a positive integer') +} + +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Load data ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# read input matrix + +counts <- read_delim_flexible( + opt\$counts, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +counts <- t(counts) # transpose matrix to have features (genes) as columns + +# read input samplesheet + +samplesheet <- read_delim_flexible( + opt\$samplesheet, + header = TRUE, + row.names = opt\$obs_id_col, + check.names = FALSE +) + +# Check that all samples specified in the input samplesheet are present in the counts +# table. Assuming they are, subset and sort the count table to match the samplesheet + +missing_samples <- + samplesheet[!rownames(samplesheet) %in% rownames(counts), opt\$sample_id_col] + +if (length(missing_samples) > 0) { + stop(paste( + length(missing_samples), + 'specified samples missing from count table:', + paste(missing_samples, collapse = ',') + )) +} else{ + counts <- counts[rownames(samplesheet),] # this will remove non-sample columns, such as metadata columns + counts <- apply(counts, 2, as.numeric) # if there is a column with non-numeric values, the rest of the matrix will be coerced to character. This will convert it back to numeric +} + +# parse group and filter matrix and group values, keeping only the contrasted groups +# TODO propd can also handle more than two groups but that don't work properly with +# the current contrast format. Should we provide an alternative way to do that? + +idx <- which(samplesheet[,opt\$contrast_variable] %in% c(opt\$reference_group, opt\$target_group)) +counts <- counts[idx,] +samplesheet <- samplesheet[idx,] +group <- as.vector(samplesheet[,opt\$contrast_variable]) +group <- as.character(group) +if (length(group) != nrow(counts)) stop('Error when parsing group') +if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') + +################################################ +################################################ +## Perform differential proportionality ## +################################################ +################################################ + +# calculate the differential proportionality theta values + +pd <- propd( + counts, + group = group, + alpha = opt\$alpha, + weighted = FALSE, + p = opt\$permutation +) + +# calculate theta moderated, when required +# and calculate F-stat + +pd <- updateF( + pd, + moderated = opt\$moderated +) +if (opt\$moderated) pd <- setActive(pd, what='theta_mod') + +# get significant results based on the FDR-adjusted F-stat p-values, if permutation == 0 +# otherwise get them based on the FDR obtained from permutation tests (more computationally expensive but likely more conservative FDRs) + +if (opt\$permutation == 0) { + + warning('FDR-adjusted p-values are used to get significant pairs.') + + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. + + theta_cutoff <- getCutoffFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + if (opt\$save_adjacency) { + adj <- getAdjacencyFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + } + + # get significant pairs + + results_pairwise <- getSignificantResultsFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + + # parse genewise information from pairwise results + + results_genewise <- get_genewise_information(results_pairwise) + } + +} else { + + warning('Permutation tests are used to compute FDR values.') + + # calculate FDR values using permutation tests + # This test is computationally expensive but it is likely to + # provide more conservative FDR values. + # This part will call the updateCutoffs function iteratively + # as far as it does not find a meaningful theta value + # and does not reach the maximum number of iterations. + + fdr_table <- data.frame( + 'cutoff' = numeric(0), + 'randcounts' = numeric(0), + 'truecounts' = numeric(0), + 'FDR' = numeric(0) + ) + theta_cutoff <- FALSE + max_cutoff <- 1 + ntry <- 0 + while (!theta_cutoff & max_cutoff > 0 & ntry < 10) { + ntry <- ntry + 1 + + # get a list of theta values served as cutoff to calculate the FDR values + # Given a theta value as cutoff, the FDR is defined as the proportion of + # false positives obtained from the null distribution vs the total number + # of positives obtained from the real data. + + cutoffs <- as.numeric(quantile( + pd@results[pd@results\$theta < max_cutoff, 'theta'], + seq(0, 1, length.out = opt\$number_of_cutoffs) + )) + + # update FDR values + + pd <- updateCutoffs( + pd, + custom_cutoffs = cutoffs, + ncores = opt\$ncores + ) + fdr_table <- rbind( + pd@fdr[pd@fdr\$cutoff < max_cutoff,], + fdr_table + ) + + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. + + theta_cutoff <- getCutoffFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + + # update maximum theta value to test the FDR values for the next iteration + + part <- pd@fdr[which(pd@fdr\$truecounts > 0),] + max_cutoff <- ifelse(nrow(part) > 1, min(part\$cutoff), 0) + } + + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + if (opt\$save_adjacency) { + adj <- getAdjacencyFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + } + + # get significant pairs + + results_pairwise <- getSignificantResultsFDR( + pd, + fdr = opt\$fdr, + window_size = 1 + ) + + # parse genewise information from pairwise results + + results_genewise <- get_genewise_information(results_pairwise) + } +} + +# deal with the situation when no significant thetas are found +# For the moment, we just create empty tables with the same data structure + +if (!theta_cutoff) { + warning('No theta value has FDR below desired threshold.') + + # create empty adjacency matrix + + if (opt\$save_adjacency) { + adj <- matrix(0, nrow=ncol(counts), ncol=ncol(counts)) + colnames(adj) <- rownames(adj) <- colnames(counts) + } + + # create empty pairwise results table + + if (opt\$save_pairwise) { + results <- data.frame( + 'Pair' = character(0), + 'Partner' = character(0), + 'theta' = numeric(0), + 'Fstat' = numeric(0), + 'Pval' = numeric(0), + 'FDR' = numeric(0) + ) + results_pairwise <- results + } + + # create empty genewise results table + + results_genewise <- data.frame( + 'features_id_col' = character(0), + lfc = numeric(0), + lfc_error = numeric(0), + connectivity = numeric(0), + weighted_connectivity = numeric(0) + ) + colnames(results_genewise) <- c(opt\$features_id_col, 'lfc', 'lfc_error', 'connectivity', 'weighted_connectivity') + +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +# save plot of genewise information +# save empty plot if no DE genes were found + +if (nrow(results_genewise) > 0) { + plot_genewise_information( + results_genewise, + paste0(opt\$prefix, '.propd.genewise.png') + ) +} else { + warning('No genewise information to plot.') + png(paste0(opt\$prefix, '.propd.genewise.png')) + plot.new() + dev.off() +} + +# save main results - genewise + +results_genewise <- results_genewise[order( + results_genewise\$weighted_connectivity, + abs(results_genewise\$lfc), + decreasing = TRUE +),] + +if (!is.na(opt\$round_digits)) { + cols <- sapply(results_genewise, is.numeric) + results_genewise[,cols] <- round( + results_genewise[,cols], + digits = opt\$round_digits + ) +} + +write.table( + results_genewise, + file = paste0(opt\$prefix, '.propd.genewise.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +# save rdata, if required + +if (opt\$save_rdata) { + saveRDS( + pd, + file = paste0(opt\$prefix, '.propd.rds') + ) +} + +# save pairwise results, if required + +if (opt\$save_pairwise) { + + # unfiltered pairwise results table + + if (opt\$save_pairwise_full) { + results <- getResults(pd) + rm(pd) + results <- results[order( + results\$theta, + results\$FDR + ), c('Pair', 'Partner', 'theta', 'Fstat', 'Pval', 'FDR')] + + if (!is.na(opt\$round_digits)) { + cols <- sapply(results, is.numeric) + results[,cols] <- round( + results[,cols], + digits = opt\$round_digits + ) + } + + write.table( + results, + file = paste0(opt\$prefix, '.propd.pairwise.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) + } + + # filtered pairwise results table + + results_pairwise <- results_pairwise[order( + results_pairwise\$theta, + results_pairwise\$FDR + ), c('Pair', 'Partner', 'theta', 'Fstat', 'Pval', 'FDR')] + + if (!is.na(opt\$round_digits)) { + cols <- sapply(results_pairwise, is.numeric) + results_pairwise[,cols] <- round( + results_pairwise[,cols], + digits = opt\$round_digits + ) + } + + write.table( + results_pairwise, + file = paste0(opt\$prefix, '.propd.pairwise_filtered.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) +} + +# save adjacency matrix, if required + +if (opt\$save_adjacency) { + write.table( + adj, + file = paste0(opt\$prefix, '.propd.adjacency.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) +} + +# save FDR values, if permutation tests were run + +if (opt\$permutation > 0) { + fdr_table <- fdr_table[order(fdr_table\$cutoff),] + + if (!is.na(opt\$round_digits)) { + fdr_table\$FDR <- round( + fdr_table\$FDR, + digits = opt\$round_digits + ) + } + + write.table( + fdr_table, + file = paste0(opt\$prefix, '.propd.fdr.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) +} + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propd/tests/boxcox.config b/modules/nf-core/propr/propd/tests/boxcox.config new file mode 100644 index 00000000..f288b876 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/boxcox.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--alpha 0.1 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/default.config b/modules/nf-core/propr/propd/tests/default.config new file mode 100644 index 00000000..ee1ed788 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/default.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/main.nf.test b/modules/nf-core/propr/propd/tests/main.nf.test new file mode 100755 index 00000000..ed0de177 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test @@ -0,0 +1,176 @@ +nextflow_process { + + name "Test Process PROPR_PROPD" + script "../main.nf" + process "PROPR_PROPD" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/propd" + + test("Test propr/propd using default params") { + + tag "default" + config "./default.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when saving all outputs") { + + tag "save_all" + config "./save_all.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.results_pairwise, + process.out.results_pairwise_filtered, + process.out.results_adjacency, + process.out.versions, + file(process.out.genewise_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when using Box-cox transformation") { + + tag "boxcox" + config "./boxcox.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when using permutation tests") { + + tag "permutation" + config "./permutation.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.fdr, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test.snap b/modules/nf-core/propr/propd/tests/main.nf.test.snap new file mode 100644 index 00000000..318a5f0b --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test.snap @@ -0,0 +1,140 @@ +{ + "Test propr/propd using default params": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:11:40.654796611" + }, + "Test propr/propd when using Box-cox transformation": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,6e8f9c57051a286b85cee317a87c8162" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:12:22.252395938" + }, + "Test propr/propd when using permutation tests": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,0ae150edfbd22a35f9ed1c7213217579" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.fdr.tsv:md5,9c7011afa34a2ce7e33da9a6a6820c7e" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:13:03.55054778" + }, + "Test propr/propd when saving all outputs": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.pairwise.tsv:md5,ff79479ea826c54aa178b0376784cbf1" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.pairwise_filtered.tsv:md5,9473f045ca1acfe1f9d6138528f743d1" + ] + ], + null, + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png", + "treatment_mCherry_hND6_.propd.rds" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:12:01.936451896" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/permutation.config b/modules/nf-core/propr/propd/tests/permutation.config new file mode 100644 index 00000000..c7718a74 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/permutation.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--permutation 10 --number_of_cutoffs 10 --seed 123 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/save_all.config b/modules/nf-core/propr/propd/tests/save_all.config new file mode 100644 index 00000000..ba7edfd5 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/save_all.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--save_pairwise_full true --save_pairwise true --save_adjacency true --save_rdata true --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/tags.yml b/modules/nf-core/propr/propd/tests/tags.yml new file mode 100755 index 00000000..ba65ca0a --- /dev/null +++ b/modules/nf-core/propr/propd/tests/tags.yml @@ -0,0 +1,2 @@ +propr/propd: + - "modules/nf-core/propr/propd/**" diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf new file mode 100644 index 00000000..8c11efa5 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -0,0 +1,192 @@ +// +// Perform differential analysis +// + +include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' +include { LIMMA_DIFFERENTIAL as LIMMA_NORM } from '../../../modules/nf-core/limma/differential/main' +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../../../modules/nf-core/deseq2/differential/main' +include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' +include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../../../modules/nf-core/custom/filterdifferentialtable/main' + +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} + +workflow ABUNDANCE_DIFFERENTIAL_FILTER { + take: + // Things we may need to iterate + ch_input // [[meta_input], counts, analysis method, fc_threshold, stat_threshold] + + // Workflow-wide things, we don't need to iterate + ch_samplesheet // [ meta_exp, samplesheet ] + ch_transcript_lengths // [ meta_exp, transcript_lengths] + ch_control_features // [meta_exp, control_features] + ch_contrasts // [[ meta_contrast, contrast_variable, reference, target ]] + + main: + + // Set up how the channels crossed below will be used to generate channels for processing + def criteria = multiMapCriteria { meta_input, abundance, analysis_method, fc_threshold, stat_threshold, meta_exp, samplesheet, meta_contrasts, variable, reference, target -> + def meta_for_diff = mergeMaps(meta_contrasts, meta_input) + [ 'method': analysis_method ] + def meta_input_new = meta_input + [ 'method': analysis_method ] + samples_and_matrix: + [ meta_input_new, samplesheet, abundance ] + contrasts_for_diff: + [ meta_for_diff, variable, reference, target ] + filter_params: + [ meta_for_diff, [ 'fc_threshold': fc_threshold, 'stat_threshold': stat_threshold ]] + contrasts_for_norm: + [ meta_input_new, variable, reference, target ] + } + + // For DIFFERENTIAL modules we need to cross the things we're iterating so we + // run differential analysis for every combination of matrix and contrast + inputs = ch_input + .combine(ch_samplesheet) + .combine(ch_contrasts) + .multiMap(criteria) + + // We only need a normalised matrix from one contrast. The reason we don't + // simply use the first output from DIFFERENTIAL modules is that depending + // on the contrast setting etc, these modules may subset matrices, hence + // not returning the full normalized matrix as NORM modules would do. + norm_inputs = ch_input + .combine(ch_samplesheet) + .combine(ch_contrasts.first()) // Just taking the first contrast + .multiMap(criteria) + + // ---------------------------------------------------- + // Run Limma + // ---------------------------------------------------- + + // NOTE that we run LIMMA_NORM just once to generate a normalised matrix. + // As explained above, this is done to avoid obtaining a subset matrix + // from LIMMA_DIFFERENTIAL. + + // Also NOTE that LIMMA_DIFFERENTIAL don't use the normalized matrix from + // LIMMA_NORM directly. It internally runs normalization + DE analysis. + + LIMMA_NORM( + norm_inputs.contrasts_for_norm.filter{it[0].method == 'limma'}, + norm_inputs.samples_and_matrix.filter{it[0].method == 'limma'} + ) + + LIMMA_DIFFERENTIAL( + inputs.contrasts_for_diff.filter{ it[0].method == 'limma' }, + inputs.samples_and_matrix.filter{ it[0].method == 'limma' } + ) + + // ---------------------------------------------------- + // Run DESeq2 + // ---------------------------------------------------- + + // NOTE that we run DESEQ2_NORM just once to generate a normalised matrix. + // As explained above, this is done to avoid obtaining a subset matrix + // from DESEQ2_DIFFERENTIAL. + + // Also NOTE that DESEQ2_DIFFERENTIAL don't use the normalized matrix from + // DESEQ2_NORM directly. It internally runs normalization + DE analysis. + + DESEQ2_NORM( + norm_inputs.contrasts_for_norm.filter{it[0].method == 'deseq2'}, + norm_inputs.samples_and_matrix.filter{it[0].method == 'deseq2'}, + ch_control_features.first(), + ch_transcript_lengths.first() + ) + + DESEQ2_DIFFERENTIAL( + inputs.contrasts_for_diff.filter{it[0].method == 'deseq2'}, + inputs.samples_and_matrix.filter{it[0].method == 'deseq2'}, + ch_control_features.first(), + ch_transcript_lengths.first() + ) + + // ---------------------------------------------------- + // Run propd + // ---------------------------------------------------- + + // NOTE that this method don't rely on normalization, hence it does + // not produce a normalized matrix. + + PROPR_PROPD( + inputs.contrasts_for_diff.filter{it[0].method == 'propd'}, + inputs.samples_and_matrix.filter { it[0].method == 'propd' } + ) + + // ---------------------------------------------------- + // Collect results + // ---------------------------------------------------- + + ch_results = DESEQ2_DIFFERENTIAL.out.results + .mix(LIMMA_DIFFERENTIAL.out.results) + .mix(PROPR_PROPD.out.results_genewise) + + ch_normalised_matrix = DESEQ2_NORM.out.normalised_counts + .mix(LIMMA_NORM.out.normalised_counts) + + ch_model = DESEQ2_DIFFERENTIAL.out.model + .mix(LIMMA_DIFFERENTIAL.out.model) + + ch_versions = DESEQ2_DIFFERENTIAL.out.versions + .mix(LIMMA_DIFFERENTIAL.out.versions) + .mix(PROPR_PROPD.out.versions) + + // ---------------------------------------------------- + // Filter DE results + // ---------------------------------------------------- + + ch_diff_filter_params = ch_results + .join(inputs.filter_params) + .multiMap { meta, results, filter_meta -> + def method_params = [ + 'deseq2': [ + fc_column: 'log2FoldChange', fc_cardinality: '>=', + stat_column: 'padj', stat_cardinality: '<=' + ], + 'limma' : [ + fc_column: 'logFC', fc_cardinality: '>=', + stat_column: 'adj.P.Val', stat_cardinality: '<=' + ], + 'propd' : [ + fc_column: 'lfc', fc_cardinality: '>=', + stat_column: 'weighted_connectivity', stat_cardinality: '>=' + ] + ] + filter_input: [meta + filter_meta, results] + fc_input: [ + method_params[meta.method].fc_column, + filter_meta.fc_threshold, + method_params[meta.method].fc_cardinality + ] + stat_input: [ + method_params[meta.method].stat_column, + filter_meta.stat_threshold, + method_params[meta.method].stat_cardinality + ] + } + + // Filter differential results + CUSTOM_FILTERDIFFERENTIALTABLE( + ch_diff_filter_params.filter_input, + ch_diff_filter_params.fc_input, + ch_diff_filter_params.stat_input + ) + + emit: + // main results + results_genewise = ch_results + results_genewise_filtered = CUSTOM_FILTERDIFFERENTIALTABLE.out.filtered + + // pairwise results + adjacency = PROPR_PROPD.out.adjacency + + // other + normalised_matrix = ch_normalised_matrix + variance_stabilised_matrix = DESEQ2_NORM.out.rlog_counts.mix(DESEQ2_NORM.out.vst_counts) + model = ch_model + versions = ch_versions +} diff --git a/subworkflows/nf-core/abundance_differential_filter/meta.yml b/subworkflows/nf-core/abundance_differential_filter/meta.yml new file mode 100644 index 00000000..cc22f805 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/meta.yml @@ -0,0 +1,140 @@ +input: + - ch_input: + description: Channel with input data for differential analysis + structure: + - meta_input: + type: map + description: Metadata map + - counts: + type: file + description: Count matrix file + - analysis_method: + type: value + description: Analysis method (deseq2, limma, or propd) + - fc_threshold: + type: value + description: Fold change threshold for filtering + - stat_threshold: + type: value + description: | + Threshold for filtering the significance statistics + (eg. adjusted p-values in the case of deseq2 or limma, + weighted connectivity in the case of propd) + - ch_samplesheet: + description: Channel with sample information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - samplesheet: + type: file + description: Sample information file + - ch_transcript_lengths: + description: Channel with transcript length information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - transcript_lengths: + type: file + description: Transcript length information file + - ch_control_features: + description: Channel with control features information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - control_features: + type: file + description: Control features information file + - ch_contrasts: + description: Channel with contrast information + structure: + - meta_contrast: + type: map + description: Contrast metadata map + - contrast_variable: + type: value + description: Contrast variable + - reference: + type: value + description: Reference level + - target: + type: value + description: Target level + +output: + - versions: + description: Channel containing software versions file + structure: + - versions.yml: + type: file + description: File containing versions of the software used + - results_genewise: + description: Channel containing unfiltered differential analysis results + structure: + - meta: + type: map + description: Metadata map + - results: + type: file + description: Unfiltered differential analysis results file + pattern: "*.{csv,tsv}" + - results_genewise_filtered: + description: Channel containing filtered differential analysis results + structure: + - meta: + type: map + description: Metadata map + - filtered_results: + type: file + description: Filtered differential analysis results file + pattern: "*.{csv,tsv}" + - adjacency: + description: Channel containing the adjacency matrix suited for downstream graph-based functional analysis + structure: + - meta: + type: map + description: Metadata map + - adjacency_matrix: + type: file + description: Adjacency matrix file + pattern: "*.{csv,tsv}" + - normalised_matrix: + description: Channel containing normalised count matrix + structure: + - meta: + type: map + description: Metadata map + - matrix: + type: file + description: Normalised count matrix file + pattern: "*.{csv,tsv}" + - variance_stabilised_matrix: + description: Channel containing variance stabilised count matrix (DESeq2 only) + structure: + - meta: + type: map + description: Metadata map + - matrix: + type: file + description: Variance stabilised count matrix file + pattern: "*.{csv,tsv}" + - model: + description: Channel containing statistical model object from differential analysis + structure: + - meta: + type: map + description: Metadata map + - model: + type: file + description: Statistical model object file + pattern: "*.rds" +authors: + - "@pinin4fjords" + - "@bjlang" + - "@caraiz2001" + - "@suzannejin" +maintainers: + - "@pinin4fjords" + - "@suzannejin" diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config new file mode 100644 index 00000000..d6918e56 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config @@ -0,0 +1,14 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config new file mode 100644 index 00000000..14fcfefa --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config @@ -0,0 +1,28 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config new file mode 100644 index 00000000..dda5df4b --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config @@ -0,0 +1,33 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } + + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5 --save_adjacency true"} + ext.prefix = { "${meta.id}_${meta.method}" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config b/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config new file mode 100644 index 00000000..59eddbc3 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config @@ -0,0 +1,22 @@ +process { + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--sample_id_col name", + "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'AFFY_JUSTRMA' { + ext.args = "--sample_name_col name" + publishDir = [ enabled: false ] + } + withName: 'UNTAR' { + publishDir = [ enabled: false ] + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config b/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config new file mode 100644 index 00000000..241679da --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config @@ -0,0 +1,17 @@ +process { + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test new file mode 100644 index 00000000..500a2e80 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test @@ -0,0 +1,527 @@ +nextflow_workflow { + + name "Test Workflow ABUNDANCE_DIFFERENTIAL_FILTER" + script "../main.nf" + workflow "ABUNDANCE_DIFFERENTIAL_FILTER" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/abundance_differential_filter" + tag "custom/filterdifferentialtable" + tag "limma/differential" + tag "deseq2/differential" + tag "propr/propd" + tag "affy/justrma" + tag "untar" + + test("deseq2 - mouse - basic") { + config './deseq2_basic.config' + tag "deseq2_basic" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("limma - basic - microarray") { + config './limma_basic_microarray.config' + tag "limma_basic_microarray" + + setup { + run("UNTAR") { + script "../../../../modules/nf-core/untar/main.nf" + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/homo_sapiens/array_expression/GSE38751_RAW.tar", checkIfExists: true) + ] + """ + } + } + run("AFFY_JUSTRMA") { + script "../../../../modules/nf-core/affy/justrma/main.nf" + process { + """ + ch_samplesheet = Channel.of([ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/homo_sapiens/array_expression/GSE38751.csv", checkIfExists: true) + ] + ) + input[0] = ch_samplesheet.join(UNTAR.out.untar) + input[1] = [[],[]] + """ + } + } + } + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/homo_sapiens/array_expression/', + contrasts_file: 'GSE38751.contrasts.csv', + samplesheet_file: 'GSE38751.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.of(['id': 'diagnosis_normal_uremia', 'variable': 'diagnosis', 'reference': 'normal', 'target': 'uremia']) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = AFFY_JUSTRMA.out.expression.map{ meta, file -> [ + meta, + file, + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]} + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("limma - voom") { + config './limma_voom.config' + tag "limma_voom" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert path(workflow.out.results_genewise[0][1]).getText().contains("ENSMUSG00000023978\t2.84055986312942") }, + { assert snapshot( + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 - with transcript lengths") { + config './deseq2_basic.config' + tag "deseq2_with_lengths" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv', + lengths_file: 'SRP254919.spoofed_lengths.tsv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.lengths_file) + ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("propd - mouse - basic") { + tag 'propd' + config './propd_basic.config' + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', // analysis method + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.adjacency, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 and limma - mouse - basic") { + config './deseq2_limmavoom_basic.config' + tag "deseq2+limmavoom" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.value([ [], [] ]) + ch_control_features = Channel.value([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 + limma-voom + propd - mouse - basic") { + tag "deseq2+limmavoom+propd" + config './deseq2_limmavoom_propd_basic.config' + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.value([ [], [] ]) + ch_control_features = Channel.value([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.adjacency, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("stub") { + config './deseq2_basic.config' + tag "stub" + + options "-stub" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap new file mode 100644 index 00000000..6795359a --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap @@ -0,0 +1,1091 @@ +{ + "limma - basic - microarray": { + "content": [ + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma" + }, + "diagnosis_normal_uremia_test_limma.limma.results.tsv:md5,4f0944b54b3ab7aa6ded5dd4b4e82802" + ] + ], + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "diagnosis_normal_uremia_test_filtered.tsv:md5,a971455ece4ae3c3ab902407b36fc6a5" + ] + ], + [ + + ], + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma" + }, + "diagnosis_normal_uremia_test_limma.limma.model.txt:md5,70b000f632b8bdba4917046362dd876b" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:51:17.162826924" + }, + "deseq2 and limma - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.results.tsv:md5,ff36827b7869a8a3c3c905efedcafc93" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.results.tsv:md5,5f34e79dbcb5ba1908d797548921d7fc" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:53:11.245100955" + }, + "limma - voom": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ] + ], + [ + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:51:32.460857013" + }, + "deseq2 + limma-voom + propd - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.results.tsv:md5,ff36827b7869a8a3c3c905efedcafc93" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test_propd.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.results.tsv:md5,5f34e79dbcb5ba1908d797548921d7fc" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test_propd.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test_propd.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test_propd.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:53:54.80697542" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03", + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03" + ], + "adjacency": [ + + ], + "model": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "normalised_matrix": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results_genewise": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results_genewise_filtered": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "variance_stabilised_matrix": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03", + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:54:12.823125892" + }, + "deseq2 - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:50:35.085607799" + }, + "deseq2 - with transcript lengths": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,944176b73455aa7c8de3ec32c03edef6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,6a9bc76c9d54034c90fa159372f97516" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,a48241fb5f24d961d3cce208f060b624" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,04d6911dce789f284c929694aa3d99b0" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:52:07.822745077" + }, + "propd - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ] + ], + [ + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:52:25.336720308" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config new file mode 100644 index 00000000..3c9167c4 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5 --save_adjacency true"} + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/main.nf b/subworkflows/nf-core/differential_functional_enrichment/main.nf new file mode 100644 index 00000000..ff18aedc --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/main.nf @@ -0,0 +1,149 @@ + +// +// Perform enrichment analysis +// +include { GPROFILER2_GOST } from "../../../modules/nf-core/gprofiler2/gost/main.nf" +include { CUSTOM_TABULARTOGSEAGCT } from '../../../modules/nf-core/custom/tabulartogseagct/main.nf' +include { CUSTOM_TABULARTOGSEACLS } from '../../../modules/nf-core/custom/tabulartogseacls/main.nf' +include { CUSTOM_TABULARTOGSEACHIP } from '../../../modules/nf-core/custom/tabulartogseachip/main.nf' +include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' +include { PROPR_GREA } from "../../../modules/nf-core/propr/grea/main.nf" + +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} + +workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { + take: + // input data for functional analysis + // Note that genesets and background are optional depending on the method. + // Please set to [] if not provided, eg: [meta, input, [], [], method] + ch_input // [ meta_input, input file, genesets file, background file, method to run ] + + // other - for the moment these files are only needed for GSEA + // as it is the only one that takes expression data as input + // if in the future this setting is changed, this section could be removed + ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] + ch_samplesheet // [ meta_exp, samples sheet ] + ch_featuresheet // [ meta_exp, features sheet, features id, features symbol ] + + main: + + ch_versions = Channel.empty() + + // Add method information into meta map of ch_input + // This information is used later to determine which method to run for each input + // Also, reorganize the structure to match them with the modules' input organization + + ch_input = ch_input + .multiMap { + meta_input, file, genesets, background, analysis_method -> + def meta_new = meta_input + [ 'method': analysis_method ] + input: + [ meta_new, file ] + genesets: + [ meta_new, genesets ] // NOTE here we assume that the modules will not make use of meta_genesets and meta_background + background: + [ meta_new, background ] + } + + // In the case of GSEA, it needs additional files coming from other channels that other methods don't use + // here we define the input channel for the GSEA section + + def criteria = multiMapCriteria { meta_input, input, genesets, meta_exp, samplesheet, featuresheet, features_id, features_symbol, meta_contrasts, variable, reference, target -> + def meta_contrasts_new = meta_contrasts + [ 'variable': variable, 'reference': reference, 'target': target ] // make sure variable, reference, target are in the meta + def meta_all = mergeMaps(meta_contrasts_new, meta_input) + input: + [ meta_all, input ] + genesets: + [ meta_all, genesets ] + contrasts_and_samples: + [ meta_all, samplesheet ] + features: + [ meta_exp, featuresheet ] + features_cols: + [ features_id, features_symbol ] + } + ch_preinput_for_gsea = ch_input.input + .join(ch_input.genesets) + .filter{ it[0].method == 'gsea' } + .combine(ch_samplesheet.join(ch_featuresheet)) + .combine(ch_contrasts) + .multiMap(criteria) + + // ---------------------------------------------------- + // Perform enrichment analysis with gprofiler2 + // ---------------------------------------------------- + + GPROFILER2_GOST( + ch_input.input.filter{ it[0].method == 'gprofiler2' }, + ch_input.genesets.filter{ it[0].method == 'gprofiler2'}, + ch_input.background.filter{ it[0].method == 'gprofiler2'} + ) + + // ---------------------------------------------------- + // Perform enrichment analysis with GSEA + // ---------------------------------------------------- + + // NOTE that GCT input can be more than 1, if they come from different tools (eg. limma, deseq2). + // CLS input can be as many as combinations of input x contrasts + // Whereas features can be only one file. + + CUSTOM_TABULARTOGSEAGCT(ch_preinput_for_gsea.input) + + CUSTOM_TABULARTOGSEACLS(ch_preinput_for_gsea.contrasts_and_samples) + + CUSTOM_TABULARTOGSEACHIP( + ch_preinput_for_gsea.features.first(), + ch_preinput_for_gsea.features_cols.first() + ) + + ch_input_for_gsea = CUSTOM_TABULARTOGSEAGCT.out.gct + .join(CUSTOM_TABULARTOGSEACLS.out.cls) + .join( ch_preinput_for_gsea.genesets ) + + GSEA_GSEA( + ch_input_for_gsea, + ch_input_for_gsea.map{ tuple(it[0].reference, it[0].target) }, + CUSTOM_TABULARTOGSEACHIP.out.chip.first() + ) + + // ---------------------------------------------------- + // Perform enrichment analysis with GREA + // ---------------------------------------------------- + + PROPR_GREA( + ch_input.input.filter{ it[0].method == 'grea' }, + ch_input.genesets.filter{ it[0].method == 'grea' } + ) + + // collect versions info + ch_versions = ch_versions + .mix(GPROFILER2_GOST.out.versions) + .mix(CUSTOM_TABULARTOGSEAGCT.out.versions) + .mix(CUSTOM_TABULARTOGSEACLS.out.versions) + .mix(CUSTOM_TABULARTOGSEACHIP.out.versions) + .mix(GSEA_GSEA.out.versions) + .mix(PROPR_GREA.out.versions) + + emit: + // here we emit the outputs that will be useful afterwards in the + // nf-core/differentialabundance pipeline + + // gprofiler2-specific outputs + gprofiler2_all_enrich = GPROFILER2_GOST.out.all_enrich + gprofiler2_sub_enrich = GPROFILER2_GOST.out.sub_enrich + gprofiler2_plot_html = GPROFILER2_GOST.out.plot_html + + // gsea-specific outputs + gsea_report = GSEA_GSEA.out.report_tsvs_ref.join(GSEA_GSEA.out.report_tsvs_target) + + // grea-specific outputs + grea_results = PROPR_GREA.out.results + + // tool versions + versions = ch_versions +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/meta.yml b/subworkflows/nf-core/differential_functional_enrichment/meta.yml new file mode 100644 index 00000000..e296e3fe --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/meta.yml @@ -0,0 +1,151 @@ +name: "differential_functional_enrichment" +description: Run functional analysis on differential abundance analysis output +keywords: + - functional analysis + - functional enrichment + - differential + - over-representation analysis +components: + - gprofiler2/gost + - gsea/gsea + - propr/grea +input: + - ch_input: + description: Channel with the input data for functional analysis. + structure: + - meta_input: + type: map + description: Metadata map + - input: + type: file + description: | + Input file. This should be the DE statistics obtained from the DE modules, + or the normalized abundance matrix (in the case of running GSEA). + - genesets: + type: file + description: | + Gene sets database. Currently all methods support GMT format. + - background: + type: file + description: | + Background features for functional analysis. + For the moment, it is only required for gprofiler2. + - analysis_method: + type: value + description: Analysis method (gprofiler2, gsea, or grea) + - ch_contrasts: + description: Channel with contrast information + structure: + - meta_contrast: + type: map + description: Contrast metadata map + - contrast_variable: + type: value + description: Contrast variable + - reference: + type: value + description: Reference level + - target: + type: value + description: Target level + - ch_samplesheet: + description: Channel with sample information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - samplesheet: + type: file + description: Sample information file + pattern: "*.{csv,tsv}" + - ch_featuresheet: + description: Channel with features information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - features: + type: file + description: Features information file + pattern: "*.{csv,tsv}" + - features_id: + type: value + description: Features id column + - features_symbol: + type: value + description: Features symbol column + +output: + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" + - gprofiler2_all_enrich: + description: Channel containing the main enrichment table output from gprofiler2 + structure: + - meta: + type: map + description: Metadata map + - all_enrich: + type: file + description: table listing all enriched pathways that were found by gprofiler2. + It can be empty, if none is found. + pattern: "*.gprofiler2.all_enriched_pathways.tsv" + - gprofiler2_sub_enrich: + description: Channel containing the secondary enrichment table output from gprofiler. + structure: + - meta: + type: map + description: Metadata map + - sub_enrich: + type: file + description: | + table listing enriched pathways that were found from one particular source. + Note that it will only be created if any were found. + pattern: "*.gprofiler2.*.sub_enriched_pathways.tsv" + - gprofiler2_plot_html: + description: Channel containing the html report generated from gprofiler2. + structure: + - meta: + type: map + description: Metadata map + - plot_html: + type: file + description: | + Channel containing HTML file; interactive Manhattan plot of all enriched pathways. + Note that this file will only be generated if enriched pathways were found. + pattern: "*.gprofiler2.gostplot.html" + - gsea_report: + description: Channel containing all the output from GSEA needed for further reporting. + structure: + - meta: + type: map + description: Metadata map + - reports_ref: + type: file + description: Main TSV results report file for the reference group. + pattern: "*gsea_report_for_${reference}.tsv" + - reports_target: + type: file + description: Main TSV results report file for the target group. + pattern: "*gsea_report_for_${target}.tsv" + - grea_results: + description: | + Channel containing the output from GREA. + structure: + - meta: + type: map + description: Metadata map + - results: + type: file + description: Main TSV results file. + pattern: "*.grea.tsv" +authors: + - "@suzannejin" + - "@bjlang" + - "@caraiz2001" +maintainers: + - "@suzannejin" + - "@pinin4fjords" diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/all.config b/subworkflows/nf-core/differential_functional_enrichment/tests/all.config new file mode 100644 index 00000000..7f092f0d --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/all.config @@ -0,0 +1,64 @@ +process { + + cpus = 1 + + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } + + withName: 'CUSTOM_TABULARTOGSEACLS' { + ext.args = { [ "variable": "$meta.variable" ] } + } + + withName: 'GSEA_GSEA' { + ext.args = { "-rnd_seed 10" } + ext.prefix = { "${meta.id}.${gene_sets.baseName}." } + } + + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config new file mode 100644 index 00000000..458bb6dd --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config @@ -0,0 +1,30 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config new file mode 100644 index 00000000..4ec648e6 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config @@ -0,0 +1,23 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'CUSTOM_TABULARTOGSEACLS' { + ext.args = { [ "variable": "$meta.variable" ] } + } + + withName: 'GSEA_GSEA' { + ext.args = { "-rnd_seed 10" } + ext.prefix = { "${meta.id}.${gene_sets.baseName}." } + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config b/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config new file mode 100644 index 00000000..1fe3a1c9 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config @@ -0,0 +1,17 @@ +process { + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test new file mode 100644 index 00000000..e1138d4f --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test @@ -0,0 +1,490 @@ +nextflow_workflow { + + name "Test Subworkflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT" + script "../main.nf" + workflow "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/differential_functional_enrichment" + tag "gprofiler2" + tag "gprofiler2/gost" + tag "gsea" + tag "gsea/gsea" + tag "propr" + tag "propr/grea" + + test("test gprofiler2 - mouse") { + tag 'gprofiler2_basic' + config './gprofiler2.config' + // NOTE that this generates the same outputs as the module GPROFILER2_GOST test + + when { + workflow { + """ + ch_input = Channel.of([ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true), + [], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/study.filtered.tsv", checkIfExists: true), + 'gprofiler2' + ]) + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()} + ) + } + } + + test("deseq2 + gprofiler2 - mouse") { + tag "deseq2+gprofiler2" + config "./deseq2_gprofiler2.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // padj threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, [], [], 'gprofiler2'] + } + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()}, + ) + } + } + + test("deseq2 + gsea - mouse") { + tag "deseq2+gsea" + config "./deseq2_gsea.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // padj threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + // Define test data + def test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/' + def testData = [ + contrasts_file: test_data_dir + 'rnaseq_expression/SRP254919.contrasts.csv', + abundance_file: test_data_dir + 'rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: test_data_dir + 'rnaseq_expression/SRP254919.samplesheet.csv', + genesets_file: test_data_dir + 'gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt' + ] + + // define input channels + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix + .combine(Channel.fromPath(testData.genesets_file)) + .map { meta, matrix, genesets -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, matrix, genesets, [], 'gsea'] + } + ch_contrasts = Channel.fromPath(file(testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.samplesheet_file) + ]) + ch_featuresheet = Channel.of([ + [ id:'test' ], + file(testData.abundance_file), + 'gene_id', + 'gene_name' + ]) + + input[0] = ch_input + input[1] = ch_contrasts + input[2] = ch_samplesheet + input[3] = ch_featuresheet + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gsea_report, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()} + ) + } + } + + test("propd + grea - mouse") { + tag "propd+grea" + config "./propd_grea.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', // analysis method + 1.5, // FC threshold + 100 // stat threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.adjacency + .combine(Channel.fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt')) + .map { meta, results, genesets -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, genesets, [], 'grea'] + } + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.grea_results, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()}, + ) + } + } + + test("deseq2|limmavoom|propd + gprofiler2|gsea|gsea - mouse") { + tag 'all' + config './all.config' + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + // Define test data + def test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/' + def testData = [ + contrasts_file: test_data_dir + 'rnaseq_expression/SRP254919.contrasts.csv', + abundance_file: test_data_dir + 'rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: test_data_dir + 'rnaseq_expression/SRP254919.samplesheet.csv', + genesets_file: test_data_dir + 'gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt' + ] + + // define input channels + ch_input_for_gprofiler2 = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'gprofiler2'] + } + ch_input_for_gsea = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'gsea'] + } + ch_input_for_grea = ABUNDANCE_DIFFERENTIAL_FILTER.out.adjacency + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'grea'] + } + ch_input = ch_input_for_gprofiler2 + .mix(ch_input_for_gsea) + .mix(ch_input_for_grea) + .combine(Channel.fromPath(testData.genesets_file)) + .map { meta, input_file, method, genesets -> + [meta, input_file, genesets, [], method] + } + + // define gsea-specific inputs + ch_contrasts = Channel.fromPath(file(testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.samplesheet_file) + ]) + ch_featuresheet = Channel.of([ + [ id:'test' ], + file(testData.abundance_file), + 'gene_id', + 'gene_name' + ]) + + input[0] = ch_input + input[1] = ch_contrasts + input[2] = ch_samplesheet + input[3] = ch_featuresheet + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file + workflow.out.gsea_report, + workflow.out.grea_results, + workflow.out.versions + ).match()}, + ) + } + + } + + test("stub") { + tag 'gprofiler2_basic' + config './gprofiler2.config' + options '-stub' + + when { + workflow { + """ + ch_input = Channel.of([ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true), + [], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/study.filtered.tsv", checkIfExists: true), + 'gprofiler2' + ]) + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap new file mode 100644 index 00000000..5591114c --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap @@ -0,0 +1,600 @@ +{ + "deseq2|limmavoom|propd + gprofiler2|gsea|gsea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d586d92fb6cc3e41d493d14c4d9a7d92" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "limma", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 100, + "method_de": "propd", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,fa880c70d06f56d8dad0ac8078e6233c" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "limma", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 100, + "method_de": "propd", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6__test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,4c95059438af872253aa95a5ff127fca", + "treatment_mCherry_hND6__test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,b4e4009e067f723694efc1a46a609e2b", + "treatment_mCherry_hND6__test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,ece72606ce6d1d037cfd5f5b198233a8", + "treatment_mCherry_hND6__test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,dc7b6f67903e25076ab95a7e1bb39bbe" + ] + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,dc27af1c941636f8b03e8c8724773725", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,09b7770d59d2efa8a58f300a16a41ae7", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,a261d658ca1b1ec0511e55da734d7810", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,3cbdbbb1c5b232ab73d35d4a0953d19c", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,8472cb5792bf7ec044bb95df356ad47e" + ] + ] + ], + [ + "treatment_mCherry_hND6__test.gprofiler2.gostplot.html", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.gostplot.html" + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "limma", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,a4dcc9581c9c63d35ef32ee0df882074" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "limma", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,a4dcc9581c9c63d35ef32ee0df882074" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6__test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6_sample_number_test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + [ + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,f2db818ec8143f64399247548098b643", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:12:40.203142527" + }, + "propd + grea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6__test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6_sample_number_test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:PROPR_GREA": { + "r-propr": "5.1.5" + } + }, + [ + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:10:22.944909501" + }, + "deseq2 + gprofiler2 - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d586d92fb6cc3e41d493d14c4d9a7d92" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,fa880c70d06f56d8dad0ac8078e6233c" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6__test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,4c95059438af872253aa95a5ff127fca", + "treatment_mCherry_hND6__test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,b4e4009e067f723694efc1a46a609e2b", + "treatment_mCherry_hND6__test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,ece72606ce6d1d037cfd5f5b198233a8", + "treatment_mCherry_hND6__test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,dc7b6f67903e25076ab95a7e1bb39bbe" + ] + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,dc27af1c941636f8b03e8c8724773725", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,09b7770d59d2efa8a58f300a16a41ae7", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,a261d658ca1b1ec0511e55da734d7810", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,3cbdbbb1c5b232ab73d35d4a0953d19c", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,8472cb5792bf7ec044bb95df356ad47e" + ] + ] + ], + [ + "treatment_mCherry_hND6__test.gprofiler2.gostplot.html", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.gostplot.html" + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GPROFILER2_GOST": { + "r-base": "4.3.3", + "r-ggplot2": "3.4.3", + "r-gprofiler2": "0.2.2" + } + }, + [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:08:35.939943561" + }, + "test gprofiler2 - mouse": { + "content": [ + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,1134a02ca061c463bcbff277eefbfb19" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,d527b94cdb160070bcaa0bfb0cecf914", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,ef418c3f06d50446317928e37ec8ddfb", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,e460d4917feb0b64d334a528f59e0731", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.tsv:md5,865d8f092503552831c51d775a98c6eb", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,413724002abe683f376ea914d4f21ade", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.tsv:md5,fce81051d7af955ddb2925ba2da9ff57", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,e89e1876698ea644671a0720c85f4dbb", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.tsv:md5,e272217ec7fcf01ea463ab8bcc8335cf", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.tsv:md5,fdd1efa836d85bb127e933e925290cba" + ] + ] + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gostplot.html" + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GPROFILER2_GOST": { + "r-base": "4.3.3", + "r-ggplot2": "3.4.3", + "r-gprofiler2": "0.2.2" + } + }, + [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:07:42.734133807" + }, + "deseq2 + gsea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ] + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GSEA_GSEA": { + "gsea": "4.3.2" + } + }, + [ + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,f2db818ec8143f64399247548098b643", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:09:55.875311067" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ], + "gprofiler2_all_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gprofiler2_plot_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gprofiler2_sub_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "grea_results": [ + + ], + "gsea_report": [ + + ], + "versions": [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + } + ], + "meta": { + "nf-test": "0.9.1", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-24T17:38:14.74535" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config b/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config new file mode 100644 index 00000000..c1a28351 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config @@ -0,0 +1,15 @@ +process { + // set single core for reproducibility + // NOTE that GREA module relies on parallelization and permutation tests + // The permutations are done within each node, which makes set.seed not working properly when + // different nodes are starting/ending depending on the case + cpus = 1 + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} + From e38ad3688d58b8897b818770ac08b7c03602cdef Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 27 Jan 2025 15:19:34 +0100 Subject: [PATCH 04/29] update modules --- modules.json | 14 +- .../custom/filterdifferentialtable/main.nf | 29 +- .../custom/filterdifferentialtable/meta.yml | 25 +- .../tests/main.nf.test | 6 +- .../custom/tabulartogseacls/environment.yml | 7 +- .../nf-core/custom/tabulartogseacls/main.nf | 35 +- .../tabulartogseacls/tests/main.nf.test | 63 + .../tabulartogseacls/tests/main.nf.test.snap | 84 + .../tabulartogseacls/tests/nextflow.config | 3 + .../custom/tabulartogseagct/environment.yml | 7 +- .../nf-core/custom/tabulartogseagct/main.nf | 34 +- .../tabulartogseagct/tests/main.nf.test | 56 + .../tabulartogseagct/tests/main.nf.test.snap | 84 + .../deseq2/differential/environment.yml | 2 - modules/nf-core/deseq2/differential/main.nf | 19 +- modules/nf-core/deseq2/differential/meta.yml | 231 ++- .../{deseq_de.R => deseq2_differential.R} | 94 +- .../tests/contrasts_matrix.config | 5 + .../contrasts_matrix_exclude_samples.config | 5 + .../tests/contrasts_matrix_noblocking.config | 10 + .../tests/contrasts_matrix_spikes.config | 5 + ...contrasts_matrix_subset_to_contrast.config | 5 + .../tests/contrasts_matrix_vst_nsub.config | 5 + .../deseq2/differential/tests/main.nf.test | 499 ++++++ .../differential/tests/main.nf.test.snap | 1480 +++++++++++++++++ .../deseq2/differential/tests/tags.yml | 2 + modules/nf-core/gprofiler2/gost/main.nf | 28 +- modules/nf-core/gprofiler2/gost/meta.yml | 10 +- .../gost/templates/gprofiler2_gost.R | 2 +- .../gprofiler2/gost/tests/main.nf.test | 122 ++ .../gprofiler2/gost/tests/main.nf.test.snap | 281 ++++ .../gprofiler2/gost/tests/nextflow.config | 3 + modules/nf-core/gsea/gsea/main.nf | 94 +- modules/nf-core/gsea/gsea/meta.yml | 18 +- modules/nf-core/gsea/gsea/tests/main.nf.test | 84 + .../nf-core/gsea/gsea/tests/main.nf.test.snap | 692 ++++++++ modules/nf-core/limma/differential/main.nf | 2 +- 37 files changed, 3927 insertions(+), 218 deletions(-) create mode 100644 modules/nf-core/custom/tabulartogseacls/tests/main.nf.test create mode 100644 modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap create mode 100644 modules/nf-core/custom/tabulartogseacls/tests/nextflow.config create mode 100644 modules/nf-core/custom/tabulartogseagct/tests/main.nf.test create mode 100644 modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap rename modules/nf-core/deseq2/differential/templates/{deseq_de.R => deseq2_differential.R} (89%) create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix.config create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config create mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config create mode 100644 modules/nf-core/deseq2/differential/tests/main.nf.test create mode 100644 modules/nf-core/deseq2/differential/tests/main.nf.test.snap create mode 100644 modules/nf-core/deseq2/differential/tests/tags.yml create mode 100644 modules/nf-core/gprofiler2/gost/tests/main.nf.test create mode 100644 modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap create mode 100644 modules/nf-core/gprofiler2/gost/tests/nextflow.config create mode 100644 modules/nf-core/gsea/gsea/tests/main.nf.test create mode 100644 modules/nf-core/gsea/gsea/tests/main.nf.test.snap diff --git a/modules.json b/modules.json index d20dd016..9a684016 100644 --- a/modules.json +++ b/modules.json @@ -17,7 +17,7 @@ }, "custom/filterdifferentialtable": { "branch": "master", - "git_sha": "833a65446ea117d092d4940f098236b6766e7aac", + "git_sha": "045f0fbb65edaff2ca5002754dfa767d93551c66", "installed_by": ["abundance_differential_filter", "modules"] }, "custom/matrixfilter": { @@ -32,17 +32,17 @@ }, "custom/tabulartogseacls": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "c835e1647a2e16237ae9d1db3d27351297f290c5", "installed_by": ["differential_functional_enrichment", "modules"] }, "custom/tabulartogseagct": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "c835e1647a2e16237ae9d1db3d27351297f290c5", "installed_by": ["differential_functional_enrichment", "modules"] }, "deseq2/differential": { "branch": "master", - "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", + "git_sha": "c038be5b58c111787d2fab1c4376085923a52b1b", "installed_by": ["abundance_differential_filter", "modules"] }, "geoquery/getgeo": { @@ -52,12 +52,12 @@ }, "gprofiler2/gost": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", "installed_by": ["differential_functional_enrichment", "modules"] }, "gsea/gsea": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", "installed_by": ["differential_functional_enrichment", "modules"] }, "gunzip": { @@ -72,7 +72,7 @@ }, "limma/differential": { "branch": "master", - "git_sha": "136f443c0a6d5c526410c7c9b73ce51ef457c341", + "git_sha": "784b3a38aeafe9bb7e38f1369704dd5e6bcaf9f0", "installed_by": ["abundance_differential_filter", "modules"] }, "propr/grea": { diff --git a/modules/nf-core/custom/filterdifferentialtable/main.nf b/modules/nf-core/custom/filterdifferentialtable/main.nf index 6ee226f0..8f5fc778 100644 --- a/modules/nf-core/custom/filterdifferentialtable/main.nf +++ b/modules/nf-core/custom/filterdifferentialtable/main.nf @@ -9,10 +9,8 @@ process CUSTOM_FILTERDIFFERENTIALTABLE { input: tuple val(meta), path(input_file) - val(logFC_column) - val(FC_threshold) - val(padj_column) - val(padj_threshold) + tuple val(logfc_column), val(fc_threshold), val(fc_cardinality) + tuple val(stat_column), val(stat_threshold), val(stat_cardinality) output: tuple val(meta), path("*_filtered.tsv"), emit: filtered @@ -41,14 +39,27 @@ process CUSTOM_FILTERDIFFERENTIALTABLE { table = pd.read_csv("${input_file}", sep=sep) # Calculate log2 fold change threshold - logFC_threshold = log2(float("${FC_threshold}")) + logfc_threshold = log2(float("${fc_threshold}")) + + # define evaluation + def evaluate_condition(x, threshold, cardinality): + if cardinality == ">=": + return x >= threshold + elif cardinality == "<=": + return x <= threshold + elif cardinality == ">": + return x > threshold + elif cardinality == "<": + return x < threshold + else: + raise ValueError(f"Invalid cardinality: {cardinality}") # Apply filters mask = ( - table["${logFC_column}"].notna() & - table["${padj_column}"].notna() & - (table["${logFC_column}"].abs() >= logFC_threshold) & - (table["${padj_column}"] <= float("${padj_threshold}")) + table["${logfc_column}"].notna() & + table["${stat_column}"].notna() & + table["${logfc_column}"].abs().apply(lambda x: evaluate_condition(x, logfc_threshold, "${fc_cardinality}")) & + table["${stat_column}"].apply(lambda x: evaluate_condition(x, float("${stat_threshold}"), "${stat_cardinality}")) ) filtered_table = table[mask] diff --git a/modules/nf-core/custom/filterdifferentialtable/meta.yml b/modules/nf-core/custom/filterdifferentialtable/meta.yml index 236eae1f..4f3402a4 100644 --- a/modules/nf-core/custom/filterdifferentialtable/meta.yml +++ b/modules/nf-core/custom/filterdifferentialtable/meta.yml @@ -4,6 +4,7 @@ keywords: - filter - differential expression - logFC + - significance statistic - p-value tools: - "pandas": @@ -26,18 +27,30 @@ input: type: file description: Input differential expression table (CSV, TSV, or TXT format) pattern: "*.{csv,tsv,txt}" - - - logFC_column: + - - logfc_column: type: string description: Name of the column containing log fold change values - - - FC_threshold: + - fc_threshold: type: float description: Fold change threshold for filtering - - - padj_column: + - fc_cardinality: type: string - description: Name of the column containing adjusted p-values - - - padj_threshold: + description: | + Operator to compare the fold change values with the threshold. + Valid values are: ">=", "<=", ">", "<". + - - stat_column: + type: string + description: | + Name of the column containing the significance statistic values + (eg. adjusted p-values). + - stat_threshold: type: float - description: Adjusted p-value threshold for filtering + description: Statistic threshold for filtering + - stat_cardinality: + type: string + description: | + Operator to compare the column values with the threshold. + Valid values are: ">=", "<=", ">", "<". output: - filtered: - meta: diff --git a/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test b/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test index 42ef28e6..b478b38b 100644 --- a/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test +++ b/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test @@ -15,10 +15,8 @@ nextflow_process { process { """ input[0] = [ [ id:'test' ], file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.deseq2.results.tsv", checkIfExists: true) ] - input[1] = 'log2FoldChange' - input[2] = 2 - input[3] = 'padj' - input[4] = 0.05 + input[1] = Channel.of(['log2FoldChange', 2, '>=']) + input[2] = Channel.of(['padj', 0.05, '<=']) """ } } diff --git a/modules/nf-core/custom/tabulartogseacls/environment.yml b/modules/nf-core/custom/tabulartogseacls/environment.yml index c7eb9bd1..ae4fa457 100644 --- a/modules/nf-core/custom/tabulartogseacls/environment.yml +++ b/modules/nf-core/custom/tabulartogseacls/environment.yml @@ -2,4 +2,9 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::coreutils=8.30 + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/custom/tabulartogseacls/main.nf b/modules/nf-core/custom/tabulartogseacls/main.nf index 5e6fd37a..dea4c3e6 100644 --- a/modules/nf-core/custom/tabulartogseacls/main.nf +++ b/modules/nf-core/custom/tabulartogseacls/main.nf @@ -1,18 +1,18 @@ process CUSTOM_TABULARTOGSEACLS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(samples) output: tuple val(meta), path("*.cls"), emit: cls - path "versions.yml" , emit: versions + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -20,15 +20,17 @@ process CUSTOM_TABULARTOGSEACLS { script: def args = task.ext.args ?: [] def prefix = task.ext.prefix ?: "${meta.id}" - def separator = args.separator ? "${args.separator}" : ( samples.getName().endsWith(".tsv") ? '\t': ',' ) - separator = separator == '\t' ? '\\t': separator + def separator = args.separator ? "${args.separator}" : (samples.getName().endsWith(".tsv") ? '\t' : ',') + separator = separator == '\t' ? '\\t' : separator def variable = args.variable - if ( !variable ) error "Supply a variable in the sample sheet from which to derive classes" + if (!variable) { + error("Supply a variable in the sample sheet from which to derive classes") + } """ cls_file=${prefix}.cls - column_number=\$(cat $samples | head -n 1 | tr '$separator' "\\n" | grep -En "^$variable\$" | awk -F':' '{print \$1}') - classes=\$(tail -n +2 $samples | awk -F'$separator' '{print \$'\$column_number'}' | sed 's/^\$/empty/g') + column_number=\$(cat ${samples} | head -n 1 | tr '${separator}' "\\n" | grep -En "^${variable}\$" | awk -F':' '{print \$1}') + classes=\$(tail -n +2 ${samples} | awk -F'${separator}' '{print \$'\$column_number'}' | sed 's/^\$/empty/g') unique_classes=\$(echo -e "\$classes" | awk '!x[\$0]++') echo -e "\$(echo -e \"\$classes\" | wc -l) \$(echo -e \"\$unique_classes\" | wc -l) 1" > \$cls_file @@ -38,7 +40,18 @@ process CUSTOM_TABULARTOGSEACLS { cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.cls + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') + END_VERSIONS + """ + } diff --git a/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test new file mode 100644 index 00000000..652aee9d --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test @@ -0,0 +1,63 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEACLS" + script "../main.nf" + process "CUSTOM_TABULARTOGSEACLS" + config "./nextflow.config" + tag "modules" + tag "modules_nfcore" + tag "custom_tabulartogseacls" + tag "custom" + tag "custom/tabulartogseacls" + + test("test_custom_tabulartogseacls") { + + when { + params { + module_args = [ "separator": "\t", "variable": "treatment" ] + } + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_sample_number', variable:'treatment', reference:'mCherry', target:'hND6', blocking:'sample_number'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.sample_metadata.tsv", checkIfExists: true) + ] + """ + + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_custom_tabulartogseacls - stub") { + + options "-stub" + + when { + params { + module_args = { [ "separator": "\t", "variable": "treatment" ] } + } + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_sample_number', variable:'treatment', reference:'mCherry', target:'hND6', blocking:'sample_number'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.sample_metadata.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap new file mode 100644 index 00000000..3c808a4a --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "test_custom_tabulartogseacls - stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ], + "cls": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:30.548463583" + }, + "test_custom_tabulartogseacls": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,7b887159417842b1fe87afebe4f8c2b7" + ] + ], + "1": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ], + "cls": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,7b887159417842b1fe87afebe4f8c2b7" + ] + ], + "versions": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:22.003232009" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config b/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config new file mode 100644 index 00000000..ad3d36ef --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = params.module_args +} diff --git a/modules/nf-core/custom/tabulartogseagct/environment.yml b/modules/nf-core/custom/tabulartogseagct/environment.yml index c7eb9bd1..ae4fa457 100644 --- a/modules/nf-core/custom/tabulartogseagct/environment.yml +++ b/modules/nf-core/custom/tabulartogseagct/environment.yml @@ -2,4 +2,9 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::coreutils=8.30 + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/custom/tabulartogseagct/main.nf b/modules/nf-core/custom/tabulartogseagct/main.nf index 4f2fa7b5..6ac17922 100644 --- a/modules/nf-core/custom/tabulartogseagct/main.nf +++ b/modules/nf-core/custom/tabulartogseagct/main.nf @@ -1,18 +1,18 @@ process CUSTOM_TABULARTOGSEAGCT { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(tabular) output: tuple val(meta), path("*.gct"), emit: gct - path "versions.yml" , emit: versions + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -20,21 +20,31 @@ process CUSTOM_TABULARTOGSEAGCT { script: def args = task.ext.args ?: [] def prefix = task.ext.prefix ?: "${meta.id}" - def separator = args.separator ? "${args.separator}" : ( tabular.getName().endsWith(".csv") ? ',': '\t' ) - separator = separator == '\t' ? '\\t': separator + def separator = args.separator ? "${args.separator}" : (tabular.getName().endsWith(".csv") ? ',' : '\t') + separator = separator == '\t' ? '\\t' : separator """ - n_columns=\$(head -n 1 $tabular | tr "$separator" "\\n" | wc -l) - n_lines=\$(wc -l < $tabular) + n_columns=\$(head -n 1 ${tabular} | tr "${separator}" "\\n" | wc -l) + n_lines=\$(wc -l < ${tabular}) gct_file=${prefix}.gct echo -e "#1.2\$(printf '\\t%.0s' {1..\$n_columns})\\n\$((n_lines-1))\\t\$((n_columns-1))\$(printf '\\t%.0s' {1..\$((n_columns-1))})" > \$gct_file - echo -e "NAME\\tDESCRIPTION\\t\$(head -n 1 $tabular | cut -f1 -d\$'$separator' --complement | awk -F'$separator' 'BEGIN { OFS = "\\t"}; {\$1=\$1}1' )" >> \$gct_file - cat $tabular | tail -n +2 | awk -F'$separator' 'BEGIN { OFS = "\\t"} {\$1=\$1"\\tNA"}1' >> \$gct_file + echo -e "NAME\\tDESCRIPTION\\t\$(head -n 1 ${tabular} | cut -f1 -d\$'${separator}' --complement | awk -F'${separator}' 'BEGIN { OFS = "\\t"}; {\$1=\$1}1' )" >> \$gct_file + cat ${tabular} | tail -n +2 | awk -F'${separator}' 'BEGIN { OFS = "\\t"} {\$1=\$1"\\tNA"}1' >> \$gct_file cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.gct + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') END_VERSIONS """ } diff --git a/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test new file mode 100644 index 00000000..dc51b363 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEAGCT" + script "../main.nf" + process "CUSTOM_TABULARTOGSEAGCT" + tag "modules" + tag "modules_nfcore" + tag "custom_tabulartogseagct" + tag "custom" + tag "custom/tabulartogseagct" + + test("test_custom_tabulartogseagct") { + + when { + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_', variable:'treatment', reference:'mCherry', target:'hND6', blocking:''], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/all.normalised_counts.tsv",checkIfExists: true) + ] + """ + + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_custom_tabulartogseagct - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_', variable:'treatment', reference:'mCherry', target:'hND6', blocking:''], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/all.normalised_counts.tsv",checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap new file mode 100644 index 00000000..612b8b14 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "test_custom_tabulartogseagct": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,9727aca45da7ebe619a1f964c9813eee" + ] + ], + "1": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ], + "gct": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,9727aca45da7ebe619a1f964c9813eee" + ] + ], + "versions": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:51.307267504" + }, + "test_custom_tabulartogseagct - stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ], + "gct": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:59.490069672" + } +} \ No newline at end of file diff --git a/modules/nf-core/deseq2/differential/environment.yml b/modules/nf-core/deseq2/differential/environment.yml index 0ab1d0b6..4f0b1d10 100644 --- a/modules/nf-core/deseq2/differential/environment.yml +++ b/modules/nf-core/deseq2/differential/environment.yml @@ -1,7 +1,5 @@ -name: deseq2_differential channels: - conda-forge - bioconda - - defaults dependencies: - bioconda::bioconductor-deseq2=1.34.0 diff --git a/modules/nf-core/deseq2/differential/main.nf b/modules/nf-core/deseq2/differential/main.nf index ab7bc06a..c76187b5 100644 --- a/modules/nf-core/deseq2/differential/main.nf +++ b/modules/nf-core/deseq2/differential/main.nf @@ -29,5 +29,22 @@ process DESEQ2_DIFFERENTIAL { task.ext.when == null || task.ext.when script: - template 'deseq_de.R' + template 'deseq2_differential.R' + + stub: + """ + touch ${meta.id}.deseq2.results.tsv + touch ${meta.id}.deseq2.dispersion.png + touch ${meta.id}.dds.rld.rds + touch ${meta.id}.deseq2.sizefactors.tsv + touch ${meta.id}.normalised_counts.tsv + touch ${meta.id}.rlog.tsv + touch ${meta.id}.deseq2.model.txt + touch ${meta.id}.R_sessionInfo.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") + END_VERSIONS + """ } diff --git a/modules/nf-core/deseq2/differential/meta.yml b/modules/nf-core/deseq2/differential/meta.yml index 2b3e33b5..be8cec47 100644 --- a/modules/nf-core/deseq2/differential/meta.yml +++ b/modules/nf-core/deseq2/differential/meta.yml @@ -7,102 +7,167 @@ keywords: - deseq2 tools: - "deseq2": - description: "Differential gene expression analysis based on the negative binomial distribution" + description: "Differential gene expression analysis based on the negative binomial + distribution" homepage: "https://bioconductor.org/packages/release/bioc/html/DESeq2.html" documentation: "https://bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html" tool_dev_url: "https://github.com/mikelove/DESeq2" doi: "10.1186/s13059-014-0550-8" licence: ["LGPL >=3"] + identifier: biotools:deseq2 input: - - meta: - type: map - description: | - Groovy Map containing contrast information. This can be used at the - workflow level to pass optional parameters to the module, e.g. - [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: - '--blocking_variable $meta.blocking'. - - contrast_variable: - type: string - description: | - The column in the sample sheet that should be used to define groups for - comparison - - reference: - type: string - description: | - The value within the contrast_variable column of the sample sheet that - should be used to derive the reference samples - - target: - type: string - description: | - The value within the contrast_variable column of the sample sheet that - should be used to derive the target samples - - meta2: - type: map - description: | - Groovy map containing study-wide metadata related to the sample sheet - and matrix - - samplesheet: - type: file - description: | - CSV or TSV format sample sheet with sample metadata - - counts: - type: file - description: | - Raw TSV or CSV format expression matrix as output from the nf-core - RNA-seq workflow - - meta3: - type: file - description: | - Meta map describing control genes, e.g. [ id: 'ERCC' ] - - control_genes_file: - type: file - description: | - Text file listing control genes, one per line - - meta4: - type: map - description: | - Groovy map containing study-wide metadata related to the transcript - lengths file - - transcript_lengths_file: - type: file - description: | - Optional file of transcript lengths, with the same sample columns as - counts. If supplied, lengths will be supplied to DESeq2 to correct for - differences in average transcript lengths across samples. - + - - meta: + type: map + description: | + Groovy Map containing contrast information. This can be used at the + workflow level to pass optional parameters to the module, e.g. + [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: + '--blocking_variable $meta.blocking'. + - contrast_variable: + type: string + description: | + The column in the sample sheet that should be used to define groups for + comparison + - reference: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the reference samples + - target: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the target samples + - - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the sample sheet + and matrix + - samplesheet: + type: file + description: | + CSV or TSV format sample sheet with sample metadata + - counts: + type: file + description: | + Raw TSV or CSV format expression matrix as output from the nf-core + RNA-seq workflow + - - meta3: + type: file + description: | + Meta map describing control genes, e.g. [ id: 'ERCC' ] + - control_genes_file: + type: file + description: | + Text file listing control genes, one per line + - - meta4: + type: map + description: | + Groovy map containing study-wide metadata related to the transcript + lengths file + - transcript_lengths_file: + type: file + description: | + Optional file of transcript lengths, with the same sample columns as + counts. If supplied, lengths will be supplied to DESeq2 to correct for + differences in average transcript lengths across samples. output: - results: - type: file - description: TSV-format table of differential expression information as output by DESeq2 - pattern: "deseq2.results.tsv" + - meta: + type: file + description: TSV-format table of differential expression information as output + by DESeq2 + pattern: "deseq2.results.tsv" + - "*.deseq2.results.tsv": + type: file + description: TSV-format table of differential expression information as output + by DESeq2 + pattern: "deseq2.results.tsv" - dispersion_plot: - type: file - description: DESeq2 dispersion plot - pattern: "deseq2.dispersion.png" + - meta: + type: file + description: DESeq2 dispersion plot + pattern: "deseq2.dispersion.png" + - "*.deseq2.dispersion.png": + type: file + description: DESeq2 dispersion plot + pattern: "deseq2.dispersion.png" - rdata: - type: file - description: Serialised DESeq2 object - pattern: "dds.rld.rds" - - sizefactors: - type: file - description: Size factors - pattern: "deseq2.sizefactors.tsv" + - meta: + type: file + description: Serialised DESeq2 object + pattern: "dds.rld.rds" + - "*.dds.rld.rds": + type: file + description: Serialised DESeq2 object + pattern: "dds.rld.rds" + - size_factors: + - meta: + type: file + description: Size factors + pattern: "deseq2.sizefactors.tsv" + - "*.deseq2.sizefactors.tsv": + type: file + description: Size factors + pattern: "deseq2.sizefactors.tsv" - normalised_counts: - type: file - description: TSV-format counts matrix, normalised to size factors - pattern: "normalised_counts.tsv" - - variance_stabilised_counts: - type: file - description: TSV-format counts matrix, normalised to size factors, with variance stabilisation applied - pattern: "variance_stabilised_counts.tsv" + - meta: + type: file + description: TSV-format counts matrix, normalised to size factors + pattern: "normalised_counts.tsv" + - "*.normalised_counts.tsv": + type: file + description: TSV-format counts matrix, normalised to size factors + pattern: "normalised_counts.tsv" + - rlog_counts: + - meta: + type: file + description: | + Optional, TSV-format counts matrix, normalised to size factors, with + variance stabilisation applied via `rlog()`. + pattern: "rlog.tsv" + - "*.rlog.tsv": + type: file + description: | + Optional, TSV-format counts matrix, normalised to size factors, with + variance stabilisation applied via `rlog()`. + pattern: "rlog.tsv" + - vst_counts: + - meta: + type: file + description: | + Optional, TSV-format counts matrix, normalised to size factors, with + variance stabilisation applied via `vst()`. + pattern: "vst_counts.tsv" + - "*.vst.tsv": + type: file + description: | + Optional, TSV-format counts matrix, normalised to size factors, with + variance stabilisation applied via `vst()`. + pattern: "vst_counts.tsv" - model: - type: file - description: TXT-format DESeq2 model - pattern: "deseq2.model.tsv" + - meta: + type: file + description: TXT-format DESeq2 model + pattern: "deseq2.model.tsv" + - "*.deseq2.model.txt": + type: file + description: TXT-format DESeq2 model + pattern: "deseq2.model.tsv" + - session_info: + - meta: + type: file + description: dump of R SessionInfo + pattern: "*.log" + - "*.R_sessionInfo.log": + type: file + description: dump of R SessionInfo + pattern: "*.log" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@pinin4fjords" maintainers: diff --git a/modules/nf-core/deseq2/differential/templates/deseq_de.R b/modules/nf-core/deseq2/differential/templates/deseq2_differential.R similarity index 89% rename from modules/nf-core/deseq2/differential/templates/deseq_de.R rename to modules/nf-core/deseq2/differential/templates/deseq2_differential.R index a1b3abca..b10618ed 100755 --- a/modules/nf-core/deseq2/differential/templates/deseq_de.R +++ b/modules/nf-core/deseq2/differential/templates/deseq2_differential.R @@ -68,34 +68,6 @@ read_delim_flexible <- function(file, header = TRUE, row.names = NULL, check.nam ) } -#' Round numeric dataframe columns to fixed decimal places by applying -#' formatting and converting back to numerics -#' -#' @param dataframe A data frame -#' @param columns Which columns to round (assumes all of them by default) -#' @param digits How many decimal places to round to? -#' -#' @return output Data frame - -round_dataframe_columns <- function(df, columns = NULL, digits = 8){ - if (is.null(columns)){ - columns <- colnames(df) - } - - df[,columns] <- format( - data.frame(df[, columns], check.names = FALSE), - nsmall = digits - ) - - # Convert columns back to numeric - - for (c in columns) { - df[[c]][grep("^ *NA\$", df[[c]])] <- NA - df[[c]] <- as.numeric(df[[c]]) - } - df -} - ################################################ ################################################ ## PARSE PARAMETERS FROM NEXTFLOW ## @@ -139,7 +111,8 @@ opt <- list( shrink_lfc = TRUE, cores = 1, vs_blind = TRUE, - vst_nsub = 1000 + vst_nsub = 1000, + round_digits = NULL ) opt_types <- lapply(opt, class) @@ -158,6 +131,9 @@ for ( ao in names(args_opt)){ opt[[ao]] <- args_opt[[ao]] } } +if ( ! is.null(opt\$round_digits)){ + opt\$round_digits <- as.numeric(opt\$round_digits) +} # Check if required parameters have been provided @@ -418,14 +394,20 @@ cat("Saving results for ", contrast.name, " ...\n", sep = "") # Differential expression table- note very limited rounding for consistency of # results -out_df <- cbind( - setNames(data.frame(rownames(comp.results)), opt\$gene_id_col), - round_dataframe_columns( - data.frame(comp.results[, !(colnames(comp.results) %in% opt\$gene_id_col)], check.names = FALSE) - ) +if (! is.null(opt\$round_digits)){ + comp.results <- apply(data.frame(comp.results), 2, function(x) round(x, opt\$round_digits)) +} +comp.results <- `colnames<-`( + data.frame( + gene_id = rownames(comp.results), + comp.results, + check.names = FALSE + ), + c(opt\$gene_id_col, colnames(comp.results)) # Setting all column names ) + write.table( - out_df, + comp.results, file = paste(opt\$output_prefix, 'deseq2.results.tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -466,12 +448,21 @@ write.table( # Write specified matrices -out_df <- cbind( - setNames(data.frame(rownames(counts(dds))), opt\$gene_id_col), - data.frame(counts(dds, normalized = TRUE)[, !(colnames(counts(dds, normalized = TRUE)) %in% opt\$gene_id_col)], check.names = FALSE) +normalised_matrix <- counts(dds, normalized = TRUE) +if (! is.null(opt\$round_digits)){ + normalised_matrix <- apply(normalised_matrix, 2, function(x) round(x, opt\$round_digits)) +} +normalised_matrix <- `colnames<-`( + data.frame( + gene_id = rownames(counts(dds)), # First column with row names from counts(dds) + normalised_matrix, # Other columns + check.names = FALSE + ), + c(opt\$gene_id_col, colnames(normalised_matrix)) # Setting all column names ) + write.table( - out_df, + normalised_matrix, file = paste(opt\$output_prefix, 'normalised_counts.tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -483,21 +474,26 @@ write.table( for (vs_method_name in strsplit(opt\$vs_method, ',')){ if (vs_method_name == 'vst'){ - vs_mat <- vst(dds, blind = opt\$vs_blind, nsub = opt\$vst_nsub) + vs_mat <- assay(vst(dds, blind = opt\$vs_blind, nsub = opt\$vst_nsub)) }else if (vs_method_name == 'rlog'){ - vs_mat <- rlog(dds, blind = opt\$vs_blind, fitType = opt\$fit_type) + vs_mat <- assay(rlog(dds, blind = opt\$vs_blind, fitType = opt\$fit_type)) } - # Again apply the slight rounding and then restore numeric + if (! is.null(opt\$round_digits)){ + vs_mat <- apply(vs_mat, 2, function(x) round(x, opt\$round_digits)) + } - out_df <- cbind( - setNames(data.frame(rownames(counts(dds))), opt\$gene_id_col), - round_dataframe_columns( - data.frame(assay(vs_mat)[, !(colnames(assay(vs_mat)) %in% opt\$gene_id_col)], check.names = FALSE) - ) + vs_mat <- `colnames<-`( + data.frame( + gene_id = rownames(counts(dds)), # First column with row names from counts(dds) + vs_mat, # Other columns from vs_mat + check.names = FALSE + ), + c(opt\$gene_id_col, colnames(vs_mat)) # Setting all column names ) + write.table( - out_df, + vs_mat, file = paste(opt\$output_prefix, vs_method_name, 'tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -526,7 +522,7 @@ sink() ################################################ ################################################ -r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +r.version <- paste(R.version[['major']],R.version[['minor']], sep = ".") deseq2.version <- as.character(packageVersion('DESeq2')) writeLines( diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config new file mode 100644 index 00000000..0e4e63a1 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config @@ -0,0 +1,5 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method rlog" } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config new file mode 100644 index 00000000..bd62f1d7 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config @@ -0,0 +1,5 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { "--round_digits 4 --blocking_variables $meta.blocking --vs_method rlog --exclude_samples_col sample_number --exclude_samples_values sample1" } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config new file mode 100644 index 00000000..77565bca --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config @@ -0,0 +1,10 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { + [ + ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), + "--vs_method rlog --round_digits 5" + ].join(' ').trim() + } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config new file mode 100644 index 00000000..5ecf98b0 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config @@ -0,0 +1,5 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { "--round_digits 5 --sizefactors_from_controls TRUE --blocking_variables $meta.blocking --vs_method rlog" } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config new file mode 100644 index 00000000..183b37c2 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config @@ -0,0 +1,5 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method rlog --subset_to_contrast_samples TRUE" } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config new file mode 100644 index 00000000..eb7010dd --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config @@ -0,0 +1,5 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method vst --vst_nsub 500" } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/main.nf.test b/modules/nf-core/deseq2/differential/tests/main.nf.test new file mode 100644 index 00000000..370f05dc --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/main.nf.test @@ -0,0 +1,499 @@ +nextflow_process { + + name "Test Process DESEQ2_DIFFERENTIAL" + script "../main.nf" + process "DESEQ2_DIFFERENTIAL" + + tag "modules" + tag "modules_nfcore" + tag "deseq2" + tag "deseq2/differential" + + test("mouse - contrasts - matrix") { + + config './contrasts_matrix.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - lengths") { + + config './contrasts_matrix.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_lengths = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.spoofed_lengths.tsv', checkIfExists: true) + ] + + ch_spikes = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + + } + + test("mouse - contrasts - matrix - no blocking") { + + config './contrasts_matrix_noblocking.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - spikes") { + + config './contrasts_matrix_spikes.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [ + ['id':'ERCC'], + file(expression_test_data_dir + 'SRP254919.spikes.tsv', checkIfExists: true) + ] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - strip spikes") { + + config './contrasts_matrix.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [ + ['id':'ERCC'], + file(expression_test_data_dir + 'SRP254919.spikes.tsv', checkIfExists: true) + ] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - csv") { + + config './contrasts_matrix.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + + // Convert the matrix to a CSV first + ch_matrix = Channel.fromPath(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv') + .splitCsv(header: false) + .map{ + it.join('\t') + } + .collectFile(name: 'test.tsv', newLine: true, sort: false) + .map{ + [ [ id:'test'], file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), it] + } + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - vst nsub") { + + config './contrasts_matrix_vst_nsub.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - subset to contrast") { + + config './contrasts_matrix_subset_to_contrast.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + + test("mouse - contrasts - matrix - exclude samples") { + + config './contrasts_matrix_exclude_samples.config' + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.size_factors, + process.out.normalised_counts, + process.out.rlog_counts, + process.out.vst_counts, + process.out.model, + process.out.versions, + file(process.out.dispersion_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match() }, + { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } + ) + } + } + test("mouse - contrasts - matrix - stub") { + + config './contrasts_matrix.config' + + options "-stub" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + ch_spikes = [[],[]] + ch_lengths = [[],[]] + + input[0] = ch_contrasts + input[1] = ch_matrix + input[2] = ch_spikes + input[3] = ch_lengths + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deseq2/differential/tests/main.nf.test.snap b/modules/nf-core/deseq2/differential/tests/main.nf.test.snap new file mode 100644 index 00000000..84f14f20 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/main.nf.test.snap @@ -0,0 +1,1480 @@ +{ + "mouse - contrasts - matrix - no blocking": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:52:40.049829142" + }, + "mouse - contrasts - matrix": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:51:18.087544733" + }, + "mouse - contrasts - matrix - exclude samples": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,7d28d65b7ab94306c1328027a6531405" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,f509c2de7d6935942eff594a0aca662e" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,87d6d634ffea2d7a9df9f9bae91b4d90" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,87d6d634ffea2d7a9df9f9bae91b4d90" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,90327e9bfc3bbafb96e11b13b3cd5e19" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,90327e9bfc3bbafb96e11b13b3cd5e19" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,c500bcad14f845113f85610d1ebf643c" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,c500bcad14f845113f85610d1ebf643c" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:55:36.950512426" + }, + "mouse - contrasts - matrix - lengths": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,944176b73455aa7c8de3ec32c03edef6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,6a9bc76c9d54034c90fa159372f97516" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,69183b94202a806067962d0df0b9875b" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,69183b94202a806067962d0df0b9875b" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:51:57.709209949" + }, + "mouse - contrasts - matrix - strip spikes": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,c4d269cace6dfe42e81e39d13b4b0354" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,e1820951d5d5c40fa7fd6368e8f62e8c" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,a526a1bb5cb270f5a4a1641fefd289b3" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,a526a1bb5cb270f5a4a1641fefd289b3" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,89c5922a30218a17ab6ee84e031f6a9b" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,89c5922a30218a17ab6ee84e031f6a9b" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,4b4526ddcca010f5c75f841b2cef269f" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,4b4526ddcca010f5c75f841b2cef269f" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:53:41.239674151" + }, + "mouse - contrasts - matrix - subset to contrast": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:55:08.800966024" + }, + "mouse - contrasts - matrix - spikes": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,51ba90cf073d9d5f38ebb043d7e5b220" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,a04e2df3712d5be27e39c50f83319ec4" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,1708374146b4e8c28fbc78fa292102cd" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,1708374146b4e8c28fbc78fa292102cd" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,6f3af146a6f8fbb8f565dd66e79d2cb1" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,6f3af146a6f8fbb8f565dd66e79d2cb1" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,39df6fb2969afc009a602261e864238f" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,39df6fb2969afc009a602261e864238f" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:53:12.892137198" + }, + "mouse - contrasts - matrix - csv": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:54:07.676718521" + }, + "mouse - contrasts - matrix - vst nsub": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.vst.tsv:md5,41c39026998bb5943e19b6012e750d89" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.vst.tsv:md5,41c39026998bb5943e19b6012e750d89" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", + "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" + ], + "treatment_mCherry_hND6_.deseq2.dispersion.png", + "treatment_mCherry_hND6_.dds.rld.rds" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:54:37.008786139" + }, + "mouse - contrasts - matrix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + + ], + "7": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe", + "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe" + ], + "dispersion_plot": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "model": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "normalised_counts": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rdata": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rlog_counts": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "session_info": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "size_factors": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe", + "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe" + ], + "vst_counts": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-18T15:55:53.660457322" + } +} \ No newline at end of file diff --git a/modules/nf-core/deseq2/differential/tests/tags.yml b/modules/nf-core/deseq2/differential/tests/tags.yml new file mode 100644 index 00000000..8407e5c6 --- /dev/null +++ b/modules/nf-core/deseq2/differential/tests/tags.yml @@ -0,0 +1,2 @@ +deseq2/differential: + - "modules/nf-core/deseq2/differential/**" diff --git a/modules/nf-core/gprofiler2/gost/main.nf b/modules/nf-core/gprofiler2/gost/main.nf index acb18b93..5e8055f7 100644 --- a/modules/nf-core/gprofiler2/gost/main.nf +++ b/modules/nf-core/gprofiler2/gost/main.nf @@ -4,13 +4,13 @@ process GPROFILER2_GOST { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-3712554873398d849d0d11b22440f41febbc4ede:aa19bb8afc0ec6456a4f3cd650f7577c3bbdd4f3-0': - 'biocontainers/mulled-v2-3712554873398d849d0d11b22440f41febbc4ede:aa19bb8afc0ec6456a4f3cd650f7577c3bbdd4f3-0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e4b0e10a72db4ad519c128c4e3cef6e10bc1a83440af31f105ab389a5532589a/data': + 'community.wave.seqera.io/library/r-ggplot2_r-gprofiler2:fab855ea9f680400' }" input: tuple val(meta), path(de_file) - path(gmt_file) - path(background_file) + tuple val(meta2), path(gmt_file) + tuple val(meta3), path(background_file) output: tuple val(meta), path("*.gprofiler2.all_enriched_pathways.tsv") , emit: all_enrich @@ -28,4 +28,24 @@ process GPROFILER2_GOST { script: template 'gprofiler2_gost.R' + + stub: + def prefix = task.ext.prefix ?: meta.id + """ + touch ${prefix}.gprofiler2.all_enriched_pathways.tsv + touch ${prefix}.gprofiler2.gost_results.rds + touch ${prefix}.gprofiler2.gostplot.png + touch ${prefix}.gprofiler2.gostplot.html + touch ${prefix}.gprofiler2.*.sub_enriched_pathways.tsv + touch ${prefix}.gprofiler2.*.sub_enriched_pathways.png + touch ${prefix}.ENSG_filtered.gmt + touch ${prefix}.R_sessionInfo.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + r-ggplot2: \$(Rscript -e "library(ggplot2); cat(as.character(packageVersion('ggplot2')))") + r-gprofiler2: \$(Rscript -e "library(gprofiler2); cat(as.character(packageVersion('gprofiler2')))") + END_VERSIONS + """ } diff --git a/modules/nf-core/gprofiler2/gost/meta.yml b/modules/nf-core/gprofiler2/gost/meta.yml index 33c9bff2..2ec9318b 100644 --- a/modules/nf-core/gprofiler2/gost/meta.yml +++ b/modules/nf-core/gprofiler2/gost/meta.yml @@ -27,12 +27,18 @@ input: pattern: "*.{csv,tsv}" description: | CSV or TSV-format tabular file with differential analysis outputs - - - gmt_file: + - - meta2: + type: map + description: Groovy map + - gmt_file: type: file pattern: "*.gmt" description: | Path to a GMT file downloaded from g:profiler that should be queried instead of the online databases - - - background_file: + - - meta3: + type: map + description: Groovy map + - background_file: type: file pattern: "*.{csv,tsv,txt}" description: | diff --git a/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R b/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R index 1de2a754..0e2c0f1e 100644 --- a/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R +++ b/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R @@ -449,7 +449,7 @@ gprofiler2.version <- as.character(packageVersion('gprofiler2')) ggplot2.version <- as.character(packageVersion('ggplot2')) writeLines( c( - '"\${task.process}":', + '"$task.process":', paste(' r-base:', r.version), paste(' r-ggplot2:', ggplot2.version), paste(' r-gprofiler2:', gprofiler2.version) diff --git a/modules/nf-core/gprofiler2/gost/tests/main.nf.test b/modules/nf-core/gprofiler2/gost/tests/main.nf.test new file mode 100644 index 00000000..e2528ef2 --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/main.nf.test @@ -0,0 +1,122 @@ +nextflow_process { + + name "Test Process GPROFILER2_GOST" + script "../main.nf" + process "GPROFILER2_GOST" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "gprofiler" + tag "gprofiler_gost" + tag "gost" + tag "gprofiler2/gost" + tag "gprofiler2" + + test("test") { + + when { + params{ + gprofiler2_significant = true + gprofiler2_measure_underrepresentation = false + gprofiler2_correction_method = "gSCS" + gprofiler2_evcodes = false + gprofiler2_max_qval = 0.05 + gprofiler2_domain_scope = "annotated" + gprofiler2_min_diff = 1 + report_round_digits = 4 + gprofiler2_palette_name = "Blues" + differential_feature_id_column = "gene_id" + gprofiler2_token = null + gprofiler2_organism = "mmusculus" + gprofiler2_background_column = null + gprofiler2_sources = null + + module_args = [ + "--significant \"${params.gprofiler2_significant}\"", + "--measure_underrepresentation \"${params.gprofiler2_measure_underrepresentation}\"", + "--correction_method \"${params.gprofiler2_correction_method}\"", + "--evcodes \"${params.gprofiler2_evcodes}\"", + "--pval_threshold \"${params.gprofiler2_max_qval}\"", + "--domain_scope ${params.gprofiler2_domain_scope}", + "--min_diff \"${params.gprofiler2_min_diff}\"", + "--round_digits ${params.report_round_digits}", + "--palette_name \"${params.gprofiler2_palette_name}\"", + ((params.differential_feature_id_column == null) ? '' : "--de_id_column \"${params.differential_feature_id_column}\""), + ((params.gprofiler2_token == null) ? '' : "--token \"${params.gprofiler2_token}\""), + ((params.gprofiler2_organism == null) ? '' : "--organism \"${params.gprofiler2_organism}\""), + ((params.gprofiler2_background_column == null) ? '' : "--background_column \"${params.gprofiler2_background_column}\""), + ((params.gprofiler2_sources == null) ? '' : "--sources \"${params.gprofiler2_sources}\"") + ].join(' ').trim() + } + process { + """ + input[0] = [ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true) + ] + input[1] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists: true) + ] + input[2] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/study.filtered.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.all_enrich, + process.out.sub_enrich, + file(process.out.plot_png[0][1]).name, //assert unstable file + process.out.sub_plot[0][1].collect{ file(it).name }, //assert unstable file + process.out.filtered_gmt, + process.out.session_info.collect{ meta,session_info -> file(session_info).name }, //assert unstable file + process.out.versions, + process.out.plot_html.collect{ meta,html -> file(html).name }, //assert unstable file + process.out.rds.collect{ meta,rds -> file(rds).name } //assert unstable file + ).match() + } + ) + } + } + + test("stub") { + + options "-stub" + + when { + params{ + module_args = null + } + process { + """ + input[0] = [ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true) + ] + input[1] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists: true) + ] + input[2] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/study.filtered.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap b/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap new file mode 100644 index 00000000..eec8d87c --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap @@ -0,0 +1,281 @@ +{ + "test": { + "content": [ + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,1134a02ca061c463bcbff277eefbfb19" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,d527b94cdb160070bcaa0bfb0cecf914", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,ef418c3f06d50446317928e37ec8ddfb", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,e460d4917feb0b64d334a528f59e0731", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.tsv:md5,865d8f092503552831c51d775a98c6eb", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,413724002abe683f376ea914d4f21ade", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.tsv:md5,fce81051d7af955ddb2925ba2da9ff57", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,e89e1876698ea644671a0720c85f4dbb", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.tsv:md5,e272217ec7fcf01ea463ab8bcc8335cf", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.tsv:md5,fdd1efa836d85bb127e933e925290cba" + ] + ] + ], + "Condition_genotype_WT_KO.gprofiler2.gostplot.png", + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.png" + ], + [ + + ], + [ + "R_sessionInfo.log" + ], + [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gostplot.html" + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-21T11:29:54.746689985" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ENSG_filtered.gmt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ], + "all_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "filtered_gmt": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ENSG_filtered.gmt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "plot_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "plot_png": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rds": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "session_info": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sub_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sub_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-21T11:31:33.394855046" + } +} \ No newline at end of file diff --git a/modules/nf-core/gprofiler2/gost/tests/nextflow.config b/modules/nf-core/gprofiler2/gost/tests/nextflow.config new file mode 100644 index 00000000..1a77344d --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = params.module_args +} \ No newline at end of file diff --git a/modules/nf-core/gsea/gsea/main.nf b/modules/nf-core/gsea/gsea/main.nf index 6a060c46..494b8a5d 100644 --- a/modules/nf-core/gsea/gsea/main.nf +++ b/modules/nf-core/gsea/gsea/main.nf @@ -4,13 +4,13 @@ process GSEA_GSEA { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gsea:4.3.2--hdfd78af_0': - 'biocontainers/gsea:4.3.2--hdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0f/0f4fe28961396eeeaa98484cb4f2db5c79abfdf117700df132312fe5c41bff81/data': + 'community.wave.seqera.io/library/gsea:4.3.2--a7421d7504fd7c81' }" input: tuple val(meta), path(gct), path(cls), path(gene_sets) tuple val(reference), val(target) - path(chip) // Optional identifier mapping file + tuple val(meta2), path(chip) // Optional identifier mapping file output: tuple val(meta), path("*.rpt") , emit: rpt @@ -26,29 +26,27 @@ process GSEA_GSEA { tuple val(meta), path("*heat_map_1.png") , emit: heatmap tuple val(meta), path("*pvalues_vs_nes_plot.png") , emit: pvalues_vs_nes_plot tuple val(meta), path("*ranked_list_corr_2.png") , emit: ranked_list_corr - tuple val(meta), path("*butterfly_plot.png") , emit: butterfly_plot, optional: true - tuple val(meta), path("*[!gene_set_size|gsea_report|ranked_gene_list]*.tsv"), emit: gene_set_tsv, optional: true - tuple val(meta), path("*[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html"), emit: gene_set_html, optional: true - tuple val(meta), path("*[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png"), emit: gene_set_heatmap, optional: true - tuple val(meta), path("*_snapshot*.html") , emit: snapshot, optional: true - tuple val(meta), path("*enplot*.png") , emit: gene_set_enplot, optional: true - tuple val(meta), path("*gset_rnd_es_dist*.png") , emit: gene_set_dist, optional: true - tuple val(meta), path("*.zip") , emit: archive, optional: true + tuple val(meta), path("*butterfly_plot.png") , emit: butterfly_plot , optional: true + tuple val(meta), path("gene_sets_*.tsv") , emit: gene_set_tsv , optional: true + tuple val(meta), path("gene_sets_*.html") , emit: gene_set_html , optional: true + tuple val(meta), path("gene_sets_*.png") , emit: gene_set_heatmap, optional: true + tuple val(meta), path("*_snapshot*.html") , emit: snapshot , optional: true + tuple val(meta), path("*enplot*.png") , emit: gene_set_enplot , optional: true + tuple val(meta), path("*gset_rnd_es_dist*.png") , emit: gene_set_dist , optional: true + tuple val(meta), path("*.zip") , emit: archive , optional: true path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - - // Remove any trailing dots from prefix when passed as report label, so - // GSEA doesn't produce double-dotted top-level outputs - def rpt_label = prefix.replaceAll('\\.$', '') - + def rpt_label = prefix.replaceAll('\\.$', '') // Remove any trailing dots from prefix when passed as report label, so GSEA doesn't produce double-dotted top-level outputs def chip_command = chip ? "-chip $chip -collapse true" : '' + def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + if (!(args ==~ /.*-rnd_seed.*/)) {args += " -rnd_seed 10"} + """ # Run GSEA @@ -78,9 +76,71 @@ process GSEA_GSEA { sed -i.bak "s/\$f/${prefix}\${f}/g" *.rpt *.html && rm *.bak done + # Rename files so that they can be properly referenced by the output channels + # Function to rename files based on the given pattern + rename_files() { + local pattern=\$1 + local exclude_patterns=\$2 + local extension=\$3 + + # Find files matching the pattern but not matching the exclusion patterns + find . -type f -name "\$pattern" | while read -r file; do + # Exclude files based on the provided exclusion patterns + if ! echo "\$file" | grep -qE "\$exclude_patterns"; then + # Rename the file by adding the prefix "gene_sets_" + mv "\$file" "\$(dirname "\$file")/gene_sets_\$(basename "\$file")" + fi + done + } + + # Pattern and exclusion for .tsv files + tsv_pattern="*.tsv" + tsv_exclude="gene_set_size|gsea_report|ranked_gene_list" + + # Pattern and exclusion for .html files + html_pattern="*.html" + html_exclude="gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot" + + # Pattern and exclusion for .png files + png_pattern="*.png" + png_exclude="butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr" + + # Rename .tsv files + rename_files "\$tsv_pattern" "\$tsv_exclude" ".tsv" + + # Rename .html files + rename_files "\$html_pattern" "\$html_exclude" ".html" + + # Rename .png files + rename_files "\$png_pattern" "\$png_exclude" ".png" + + cat <<-END_VERSIONS > versions.yml "${task.process}": gsea: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.rpt + touch ${prefix}.index.html + touch ${prefix}.heat_map_corr_plot.html + touch ${prefix}.gsea_report_for_${reference}.tsv + touch ${prefix}.gsea_report_for_${reference}.html + touch ${prefix}.gsea_report_for_${target}.tsv + touch ${prefix}.gsea_report_for_${target}.html + touch ${prefix}.ranked_gene_list*.tsv + touch ${prefix}.gene_set_sizes.tsv + touch ${prefix}.global_es_histogram.png + touch ${prefix}.heat_map_1.png + touch ${prefix}.pvalues_vs_nes_plot.png + touch ${prefix}.ranked_list_corr_2.png + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gsea: $VERSION + """ } diff --git a/modules/nf-core/gsea/gsea/meta.yml b/modules/nf-core/gsea/gsea/meta.yml index f3ce403f..41a22941 100644 --- a/modules/nf-core/gsea/gsea/meta.yml +++ b/modules/nf-core/gsea/gsea/meta.yml @@ -40,7 +40,10 @@ input: description: | String indicating which of the classes in the cls file should be used as the target level of the comparison. - - - chip: + - - meta2: + type: map + description: Groovy map + - chip: type: file description: | optional Broad-style chip file mapping identifiers in gct to @@ -182,31 +185,31 @@ output: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!gene_set_size|gsea_report|ranked_gene_list]*.tsv": + - "gene_sets_*.tsv": type: list description: Where -make_sets is not set to false, TSV files, one file for each gene set, with detail on enrichment for each gene - pattern: "[!gene_set_size|gsea_report|ranked_gene_list]*.tsv" + pattern: "gene_sets_*.tsv" - gene_set_html: - meta: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html": + - "gene_sets_*.html": type: list description: Where -make_sets is not set to false, HTML files, one file for each gene set, with detail on enrichment for each gene - pattern: "[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html" + pattern: "gene_sets_*.html" - gene_set_heatmap: - meta: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png": + - "gene_sets_*.png": type: list description: Where -make_sets is not set to false, PNG-format heatmaps, one file for each gene set, showing expression for each gene - pattern: "[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png" + pattern: "gene_sets_*.png" - snapshot: - meta: type: map @@ -255,3 +258,4 @@ authors: - "@pinin4fjords" maintainers: - "@pinin4fjords" + - "@nschcolnicov" diff --git a/modules/nf-core/gsea/gsea/tests/main.nf.test b/modules/nf-core/gsea/gsea/tests/main.nf.test new file mode 100644 index 00000000..1f97e97a --- /dev/null +++ b/modules/nf-core/gsea/gsea/tests/main.nf.test @@ -0,0 +1,84 @@ +nextflow_process { + + name "Test Process GSEA_GSEA" + script "../main.nf" + process "GSEA_GSEA" + + tag "modules" + tag "modules_nfcore" + tag "gsea_gsea" + tag "gsea" + tag "gsea/gsea" + + test("test") { + + when { + process { + """ + input[0] = [['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_treatment_Control_Treated.gct", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_genotype_WT_KO.cls", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists:true)] + input[1] = ['WT', 'KO'] + input[2] = [ + ['id': 'test'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Mus_musculus.anno.feature_metadata.chip", checkIfExists:true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.rpt.collect{ meta,rpt -> file(rpt).name }, //assert unstable file + process.out.index_html.collect{ meta,index_html -> file(index_html).name }, //assert unstable file + process.out.heat_map_corr_plot, + process.out.report_tsvs_ref, + process.out.report_htmls_ref.collect{ meta,report_htmls_ref -> file(report_htmls_ref).name }, //assert unstable file + process.out.report_tsvs_target, + process.out.report_htmls_target.collect{ meta,report_htmls_target -> file(report_htmls_target).name }, //assert unstable file + process.out.ranked_gene_list, + process.out.gene_set_sizes, + process.out.histogram.collect{ meta,histogram -> file(histogram).name }, //assert unstable file + process.out.heatmap.collect{ meta,heatmap -> file(heatmap).name }, //assert unstable file + process.out.pvalues_vs_nes_plot.collect{ meta,pvalues_vs_nes_plot -> file(pvalues_vs_nes_plot).name }, //assert unstable file + process.out.ranked_list_corr.collect{ meta,ranked_list_corr -> file(ranked_list_corr).name }, //assert unstable file + process.out.butterfly_plot.collect{ meta,butterfly_plot -> file(butterfly_plot).name }, //assert unstable file + process.out.gene_set_tsv, + process.out.gene_set_html[0][1].collect{ file(it).name }, //assert unstable file + process.out.gene_set_heatmap[0][1].collect{ file(it).name }, // unstable file and unstable name + process.out.snapshot[0][1].collect{ file(it).name }, //assert unstable file + process.out.gene_set_enplot[0][1].collect{ file(it).name }, // unstable file and unstable name + process.out.gene_set_dist[0][1].collect{ file(it).name }, //assert unstable file + process.out.archive, + process.out.versions + ).match() + } + ) + } + } + + test("stub") { + + options "-stub" + + when { + process { + """ + input[0] = [['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_treatment_Control_Treated.gct", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_genotype_WT_KO.cls", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists:true)] + input[1] = ['WT', 'KO'] + input[2] = [ + ['id': 'test'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Mus_musculus.anno.feature_metadata.chip", checkIfExists:true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } +} diff --git a/modules/nf-core/gsea/gsea/tests/main.nf.test.snap b/modules/nf-core/gsea/gsea/tests/main.nf.test.snap new file mode 100644 index 00000000..5ed2fe53 --- /dev/null +++ b/modules/nf-core/gsea/gsea/tests/main.nf.test.snap @@ -0,0 +1,692 @@ +{ + "test": { + "content": [ + [ + "Condition_genotype_WT_KO.Gsea.rpt" + ], + [ + "Condition_genotype_WT_KOindex.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOheat_map_corr_plot.html:md5,129c561984542746bc50c3f6db9c7c5e" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgsea_report_for_WT.tsv:md5,674b21a1646cc554d6686ddd67c55dab" + ] + ], + [ + "Condition_genotype_WT_KOgsea_report_for_WT.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgsea_report_for_KO.tsv:md5,a4e7de6cf0400befc6e52e379c89c178" + ] + ], + [ + "Condition_genotype_WT_KOgsea_report_for_KO.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOranked_gene_list_KO_versus_WT.tsv:md5,3ae0171ae04398f350cd3e0f183b9d67" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgene_set_sizes.tsv:md5,61ca77f6b13620a78170c0b9366b8425" + ] + ], + [ + "Condition_genotype_WT_KOglobal_es_histogram.png" + ], + [ + "Condition_genotype_WT_KOheat_map_1.png" + ], + [ + "Condition_genotype_WT_KOpvalues_vs_nes_plot.png" + ], + [ + "Condition_genotype_WT_KOranked_list_corr_2.png" + ], + [ + "Condition_genotype_WT_KObutterfly_plot.png" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS.tsv:md5,0e7035e5cbaba4a35d87538da823e05c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE.tsv:md5,46cee22eddeac12e1d8643e539c6c397", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS.tsv:md5,3b4a7f1b28282bf886c9c06d73f61e45", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION.tsv:md5,e9d02a848a5aca73a22a6aef7473defd", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE.tsv:md5,84eed15b2aad41077b2a4c5367c05782", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS.tsv:md5,302c2afbf1b77c6eccd7983fb657007c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM.tsv:md5,967e4be880742f32720419fe879b7cc7", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION.tsv:md5,6c5bece0e26c1e1b32d9d47b10651baf", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT.tsv:md5,0d3dfe9073ddbbfa3a6f0c7bcb4c8601", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR.tsv:md5,975b4b3905685e73500ec49cd54a2c03", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION.tsv:md5,122c6786499f76f5ec0c6ce604b52aa0", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,7fea0527089b002ccf840223a60ecbf4", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE.tsv:md5,a838545de228235bc4f8830b5777e893", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM.tsv:md5,926ddf4b74ad3a6d76bc99e82ae6aaf3", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS.tsv:md5,4dcdce8b8db83dd971800f2ff18ccbeb", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING.tsv:md5,2d508b31d0ec00228db110a0e9e2f059", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM.tsv:md5,bb723be28feecbbc68909fdb17f8e2f4", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA.tsv:md5,e3a7d53519ee12377377659743d9cf4c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING.tsv:md5,4bcc7835887602c732c85ef2db4f5584", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,18e50d2154c81700b2c44ee848ced133", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,fb6fcf993118271ee3340e9a12de0ed7", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN.tsv:md5,d0649d9c33c0f81bf4e8e2dcdb6a036d", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP.tsv:md5,1b4411d95e2bf08db2bae06996d6729c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS.tsv:md5,564c3e924517993e6eac6819a5f53d92", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING.tsv:md5,e91e740dac62555b603bf44c427e671e", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,75095d76fc23eccb98d67e045839d4a9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY.tsv:md5,ce4a9fc08c539fc4d930f81e08a2db55", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS.tsv:md5,9df68cbfc6e4666d18ff6d214c5f1544", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME.tsv:md5,f0e60a2f8bc511be09ff8f04886eca61", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING.tsv:md5,f76d919c3e1342304bb69e50a58c81d9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION.tsv:md5,f16a1fcc6e9b4fd976b3c9fefd0f8dc9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY.tsv:md5,66bcbea77b774b7d0542abeb460bfef8", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING.tsv:md5,5970edfc5faad9bb73408d75a2f40350", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN.tsv:md5,bb751fac5d95a22e6872ef347038cd4e", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP.tsv:md5,8cfe52d138bc42ec8fd7d2c6fbf6761f", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,b45d874ea3fdd7cd4f8bd09843eaa941", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM.tsv:md5,ca28e2bd7b3584d1354e97b09a37f8af", + "gene_sets_Condition_genotype_WT_KOSymbol_to_probe_set_mapping_details.tsv:md5,a8bed433fe3e8081495c82226ec44917" + ] + ] + ], + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM.html" + ], + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS_13.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE_100.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS_94.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION_55.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE_82.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS_40.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM_31.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION_34.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT_91.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR_43.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION_67.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY_58.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE_70.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM_16.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS_97.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING_61.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM_28.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA_103.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING_106.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING_46.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE_52.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN_109.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP_85.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS_64.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING_73.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION_4.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY_22.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS_37.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME_7.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING_49.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION_10.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY_25.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING_79.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN_76.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP_88.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING_112.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM_19.png" + ], + [ + "Condition_genotype_WT_KOneg_snapshot.html", + "Condition_genotype_WT_KOpos_snapshot.html" + ], + [ + "Condition_genotype_WT_KOenplot_HALLMARK_ADIPOGENESIS_12.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ANDROGEN_RESPONSE_99.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ANGIOGENESIS_93.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APICAL_JUNCTION_54.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APICAL_SURFACE_81.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APOPTOSIS_39.png", + "Condition_genotype_WT_KOenplot_HALLMARK_BILE_ACID_METABOLISM_30.png", + "Condition_genotype_WT_KOenplot_HALLMARK_COAGULATION_33.png", + "Condition_genotype_WT_KOenplot_HALLMARK_COMPLEMENT_90.png", + "Condition_genotype_WT_KOenplot_HALLMARK_DNA_REPAIR_42.png", + "Condition_genotype_WT_KOenplot_HALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION_66.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_57.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ESTROGEN_RESPONSE_LATE_69.png", + "Condition_genotype_WT_KOenplot_HALLMARK_FATTY_ACID_METABOLISM_15.png", + "Condition_genotype_WT_KOenplot_HALLMARK_GLYCOLYSIS_96.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HEDGEHOG_SIGNALING_60.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HEME_METABOLISM_27.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HYPOXIA_102.png", + "Condition_genotype_WT_KOenplot_HALLMARK_IL2_STAT5_SIGNALING_105.png", + "Condition_genotype_WT_KOenplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_45.png", + "Condition_genotype_WT_KOenplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png", + "Condition_genotype_WT_KOenplot_HALLMARK_KRAS_SIGNALING_DN_108.png", + "Condition_genotype_WT_KOenplot_HALLMARK_KRAS_SIGNALING_UP_84.png", + "Condition_genotype_WT_KOenplot_HALLMARK_MYOGENESIS_63.png", + "Condition_genotype_WT_KOenplot_HALLMARK_NOTCH_SIGNALING_72.png", + "Condition_genotype_WT_KOenplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_3.png", + "Condition_genotype_WT_KOenplot_HALLMARK_P53_PATHWAY_21.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PANCREAS_BETA_CELLS_36.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PEROXISOME_6.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PI3K_AKT_MTOR_SIGNALING_48.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PROTEIN_SECRETION_9.png", + "Condition_genotype_WT_KOenplot_HALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY_24.png", + "Condition_genotype_WT_KOenplot_HALLMARK_TGF_BETA_SIGNALING_78.png", + "Condition_genotype_WT_KOenplot_HALLMARK_UV_RESPONSE_DN_75.png", + "Condition_genotype_WT_KOenplot_HALLMARK_UV_RESPONSE_UP_87.png", + "Condition_genotype_WT_KOenplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_111.png", + "Condition_genotype_WT_KOenplot_HALLMARK_XENOBIOTIC_METABOLISM_18.png" + ], + [ + "Condition_genotype_WT_KOgset_rnd_es_dist_101.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_104.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_107.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_11.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_110.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_113.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_14.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_17.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_20.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_23.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_26.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_29.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_32.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_35.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_38.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_41.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_44.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_47.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_5.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_50.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_53.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_56.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_59.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_62.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_65.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_68.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_71.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_74.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_77.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_8.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_80.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_83.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_86.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_89.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_92.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_95.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_98.png" + ], + [ + + ], + [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-09T12:59:01.403655519" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.rpt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_1.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.pvalues_vs_nes_plot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_list_corr_2.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + + ], + "14": [ + + ], + "15": [ + + ], + "16": [ + + ], + "17": [ + + ], + "18": [ + + ], + "19": [ + + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_corr_plot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "20": [ + + ], + "21": [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ], + "3": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_gene_list*.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gene_set_sizes.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.global_es_histogram.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "archive": [ + + ], + "butterfly_plot": [ + + ], + "gene_set_dist": [ + + ], + "gene_set_enplot": [ + + ], + "gene_set_heatmap": [ + + ], + "gene_set_html": [ + + ], + "gene_set_sizes": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gene_set_sizes.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gene_set_tsv": [ + + ], + "heat_map_corr_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_corr_plot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "heatmap": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_1.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "histogram": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.global_es_histogram.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pvalues_vs_nes_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.pvalues_vs_nes_plot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ranked_gene_list": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_gene_list*.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ranked_list_corr": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_list_corr_2.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_htmls_ref": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_htmls_target": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_tsvs_ref": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_tsvs_target": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rpt": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.rpt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "snapshot": [ + + ], + "versions": [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-08T17:41:24.591802253" + } +} \ No newline at end of file diff --git a/modules/nf-core/limma/differential/main.nf b/modules/nf-core/limma/differential/main.nf index be6c72ec..b7106c39 100644 --- a/modules/nf-core/limma/differential/main.nf +++ b/modules/nf-core/limma/differential/main.nf @@ -5,7 +5,7 @@ process LIMMA_DIFFERENTIAL { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/af/afd9579a0ff62890ff451d82b360d85e82a0d61a3da40736ee0eee4e45926269/data' : - 'community.wave.seqera.io/library/bioconductor-limma_bioconductor-edger:54dd09078d5db3b3' }" + 'community.wave.seqera.io/library/bioconductor-edger_bioconductor-limma:176c202c82450990' }" input: tuple val(meta), val(contrast_variable), val(reference), val(target) From 9cbe267d04d3192cb26047ba05aef329fcf566d7 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 27 Jan 2025 18:22:05 +0100 Subject: [PATCH 05/29] update workflow to use the updated modules. It runs through test profile, but still need to check nf-test --- .../local/tabulartogseachip/environment.yml | 6 --- modules/local/tabulartogseachip/main.nf | 54 ------------------- modules/local/tabulartogseachip/meta.yml | 41 -------------- .../tabulartogseachip/tests/main.nf.test | 49 ----------------- .../tabulartogseachip/tests/main.nf.test.snap | 48 ----------------- workflows/differentialabundance.nf | 26 +++++---- 6 files changed, 12 insertions(+), 212 deletions(-) delete mode 100644 modules/local/tabulartogseachip/environment.yml delete mode 100644 modules/local/tabulartogseachip/main.nf delete mode 100644 modules/local/tabulartogseachip/meta.yml delete mode 100644 modules/local/tabulartogseachip/tests/main.nf.test delete mode 100644 modules/local/tabulartogseachip/tests/main.nf.test.snap diff --git a/modules/local/tabulartogseachip/environment.yml b/modules/local/tabulartogseachip/environment.yml deleted file mode 100644 index a6e8e310..00000000 --- a/modules/local/tabulartogseachip/environment.yml +++ /dev/null @@ -1,6 +0,0 @@ -channels: - - conda-forge - - bioconda - -dependencies: - - conda-forge::gawk=5.1.0 diff --git a/modules/local/tabulartogseachip/main.nf b/modules/local/tabulartogseachip/main.nf deleted file mode 100644 index 314a2e70..00000000 --- a/modules/local/tabulartogseachip/main.nf +++ /dev/null @@ -1,54 +0,0 @@ -process TABULAR_TO_GSEA_CHIP { - - tag "$id" - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "community.wave.seqera.io/library/gawk:5.1.0--fa97c4ccf4cfbc4b" - - input: - path tsv - tuple val(id), val(symbol) - - output: - path "*.chip" , emit: chip - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def VERSION = '9.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - """ - function find_column_number { - file=\$1 - column=\$2 - - head -n 1 \$file | tr '\\t' '\\n' | grep -n "^\${column}\$" | awk -F':' '{print \$1}' - } - - id_col=\$(find_column_number $tsv $id) - symbol_col=\$(find_column_number $tsv $symbol) - outfile=\$(echo $tsv | sed 's/\\(.*\\)\\..*/\\1/').chip - - echo -e "Probe Set ID\\tGene Symbol\\tGene Title" > \${outfile}.tmp - tail -n +2 $tsv | awk -F'\\t' -v id=\$id_col -v symbol=\$symbol_col '{print \$id"\\t"\$symbol"\\tNA"}' >> \${outfile}.tmp - mv \${outfile}.tmp \${outfile} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) - END_VERSIONS - """ - - stub: - """ - touch stub.chip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) - END_VERSIONS - """ - -} diff --git a/modules/local/tabulartogseachip/meta.yml b/modules/local/tabulartogseachip/meta.yml deleted file mode 100644 index aa9d7d93..00000000 --- a/modules/local/tabulartogseachip/meta.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: tabular_to_gsea_chip -description: Convert tabular data into GSEA-compatible CHIP files. -keywords: - - GSEA - - CHIP - - Bioinformatics -tools: - - gawk: - description: | - GNU Awk (gawk) is a powerful programming language designed for text processing and typically used as a data extraction and reporting tool. - It is used here to manipulate tabular data and create the CHIP file format. - homepage: https://www.gnu.org/software/gawk/ - documentation: https://www.gnu.org/software/gawk/manual/ - licence: ["GPL-3.0-or-later"] -input: - - tsv: - type: file - description: | - Tab-separated values (TSV) file containing data to be converted into a CHIP file. - - - id: - type: string - description: | - Feature ID attribute in the abundance table as well as in the GTF file (e.g. the gene_id field). - - symbol: - type: string - description: | - Feature name attribute in the abundance table as well as in the GTF file (e.g. the gene symbol field). -output: - - chip: - type: file - description: Generated GSEA-compatible CHIP file. - pattern: "*.chip" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@pinin4fjords" # Replace with actual author handles -maintainers: - - "@nschcolnicov" diff --git a/modules/local/tabulartogseachip/tests/main.nf.test b/modules/local/tabulartogseachip/tests/main.nf.test deleted file mode 100644 index e6c5321b..00000000 --- a/modules/local/tabulartogseachip/tests/main.nf.test +++ /dev/null @@ -1,49 +0,0 @@ -nextflow_process { - - name "Test Process TABULAR_TO_GSEA_CHIP" - script "../main.nf" - process "TABULAR_TO_GSEA_CHIP" - tag "modules" - tag "modules_nfcore" - tag "tabular_to_gsea_chip" - - test("test_tabular_to_gsea_chip") { - - when { - process { - """ - input[0] = Channel.fromPath("https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/differentialabundance/modules_testdata/Mus_musculus.anno.feature_metadata.tsv") - input[1] = ["gene_id", "gene_name"] - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() }, - ) - } - } - - test("test_tabular_to_gsea_chip - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.fromPath("https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/differentialabundance/modules_testdata/Mus_musculus.anno.feature_metadata.tsv") - input[1] = ["gene_id", "gene_name"] - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() }, - ) - } - } -} diff --git a/modules/local/tabulartogseachip/tests/main.nf.test.snap b/modules/local/tabulartogseachip/tests/main.nf.test.snap deleted file mode 100644 index 29d017ed..00000000 --- a/modules/local/tabulartogseachip/tests/main.nf.test.snap +++ /dev/null @@ -1,48 +0,0 @@ -{ - "test_tabular_to_gsea_chip - stub": { - "content": [ - { - "0": [ - "stub.chip:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - "1": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ], - "chip": [ - "stub.chip:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - "versions": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" - }, - "timestamp": "2024-12-06T21:03:06.781994447" - }, - "test_tabular_to_gsea_chip": { - "content": [ - { - "0": [ - "Mus_musculus.anno.feature_metadata.chip:md5,5abf60bb982bb2ff5b8b3e37f14a21e4" - ], - "1": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ], - "chip": [ - "Mus_musculus.anno.feature_metadata.chip:md5,5abf60bb982bb2ff5b8b3e37f14a21e4" - ], - "versions": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" - }, - "timestamp": "2024-12-06T21:02:58.608468636" - } -} \ No newline at end of file diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 23b99506..0ddb0c67 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -98,8 +98,6 @@ citations_file = file(params.citations_file, checkIfExists: true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabulartogseachip' -include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -120,11 +118,13 @@ include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../modules/n include { DESEQ2_DIFFERENTIAL } from '../modules/nf-core/deseq2/differential/main' include { LIMMA_DIFFERENTIAL } from '../modules/nf-core/limma/differential/main' include { CUSTOM_MATRIXFILTER } from '../modules/nf-core/custom/matrixfilter/main' +include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' include { ATLASGENEANNOTATIONMANIPULATION_GTF2FEATUREANNOTATION as GTF_TO_TABLE } from '../modules/nf-core/atlasgeneannotationmanipulation/gtf2featureannotation/main' include { GSEA_GSEA } from '../modules/nf-core/gsea/gsea/main' include { GPROFILER2_GOST } from '../modules/nf-core/gprofiler2/gost/main' include { CUSTOM_TABULARTOGSEAGCT } from '../modules/nf-core/custom/tabulartogseagct/main' include { CUSTOM_TABULARTOGSEACLS } from '../modules/nf-core/custom/tabulartogseacls/main' +include { CUSTOM_TABULARTOGSEACHIP } from '../modules/nf-core/custom/tabulartogseachip/main' include { RMARKDOWNNOTEBOOK } from '../modules/nf-core/rmarkdownnotebook/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_RAW } from '../modules/nf-core/affy/justrma/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_NORM } from '../modules/nf-core/affy/justrma/main' @@ -411,15 +411,13 @@ workflow DIFFERENTIALABUNDANCE { } // We'll use a local module to filter the differential tables and create output files that contain only differential features - ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change ]) - ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval ]) + ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change, '>=' ]) + ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval, '<=' ]) CUSTOM_FILTERDIFFERENTIALTABLE( ch_differential, - ch_logfc.map{it[0]}, - ch_logfc.map{it[1]}, - ch_padj.map{it[0]}, - ch_padj.map{it[1]} + ch_logfc, + ch_padj ) // Run a gene set analysis where directed @@ -445,8 +443,8 @@ workflow DIFFERENTIALABUNDANCE { CUSTOM_TABULARTOGSEACLS(ch_contrasts_and_samples) - TABULAR_TO_GSEA_CHIP( - VALIDATOR.out.feature_meta.map{ it[1] }, + CUSTOM_TABULARTOGSEACHIP( + VALIDATOR.out.feature_meta, [params.features_id_col, params.features_name_col] ) @@ -463,7 +461,7 @@ workflow DIFFERENTIALABUNDANCE { GSEA_GSEA( ch_gsea_inputs, ch_gsea_inputs.map{ tuple(it[0].reference, it[0].target) }, // * - TABULAR_TO_GSEA_CHIP.out.chip.first() + CUSTOM_TABULARTOGSEACHIP.out.chip.first() ) // * Note: GSEA module currently uses a value channel for the mandatory @@ -476,7 +474,7 @@ workflow DIFFERENTIALABUNDANCE { // Record GSEA versions ch_versions = ch_versions - .mix(TABULAR_TO_GSEA_CHIP.out.versions) + .mix(CUSTOM_TABULARTOGSEACHIP.out.versions) .mix(GSEA_GSEA.out.versions) } @@ -499,8 +497,8 @@ workflow DIFFERENTIALABUNDANCE { GPROFILER2_GOST( ch_filtered_diff, - ch_gene_sets.first(), - ch_background + ch_gene_sets.map { it -> [[], it]}.first(), + ch_background.map{ it -> [[], it]}.first(), ) } From 3ee143c0729f23628add9b3a7c349d6111607736 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 15:38:19 +0100 Subject: [PATCH 06/29] [abundance_differential_filter] separate channels for rlog and vst --- subworkflows/nf-core/abundance_differential_filter/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf index 8c11efa5..df4bcacf 100644 --- a/subworkflows/nf-core/abundance_differential_filter/main.nf +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -186,7 +186,8 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { // other normalised_matrix = ch_normalised_matrix - variance_stabilised_matrix = DESEQ2_NORM.out.rlog_counts.mix(DESEQ2_NORM.out.vst_counts) + rlog_counts = DESEQ2_NORM.out.rlog_counts + vst_counts = DESEQ2_NORM.out.vst_counts model = ch_model versions = ch_versions } From 9bd6518504b4a53b1331ea650db35fad4fcb90e3 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 16:08:52 +0100 Subject: [PATCH 07/29] [subworkflows] remove mergeMaps. Otherwise the contrastid_expid format of output file names lead to error at rmarkdown step. --- .../nf-core/abundance_differential_filter/main.nf | 8 +------- .../nf-core/differential_functional_enrichment/main.nf | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf index df4bcacf..7bef0255 100644 --- a/subworkflows/nf-core/abundance_differential_filter/main.nf +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -9,12 +9,6 @@ include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../../../modules/nf-core/d include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../../../modules/nf-core/custom/filterdifferentialtable/main' -// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') -def mergeMaps(meta, meta2){ - (meta + meta2).collectEntries { k, v -> - meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] - } -} workflow ABUNDANCE_DIFFERENTIAL_FILTER { take: @@ -31,7 +25,7 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { // Set up how the channels crossed below will be used to generate channels for processing def criteria = multiMapCriteria { meta_input, abundance, analysis_method, fc_threshold, stat_threshold, meta_exp, samplesheet, meta_contrasts, variable, reference, target -> - def meta_for_diff = mergeMaps(meta_contrasts, meta_input) + [ 'method': analysis_method ] + def meta_for_diff = meta_input + meta_contrasts + [ 'method': analysis_method ] def meta_input_new = meta_input + [ 'method': analysis_method ] samples_and_matrix: [ meta_input_new, samplesheet, abundance ] diff --git a/subworkflows/nf-core/differential_functional_enrichment/main.nf b/subworkflows/nf-core/differential_functional_enrichment/main.nf index ff18aedc..a2e3d0cc 100644 --- a/subworkflows/nf-core/differential_functional_enrichment/main.nf +++ b/subworkflows/nf-core/differential_functional_enrichment/main.nf @@ -9,12 +9,6 @@ include { CUSTOM_TABULARTOGSEACHIP } from '../../../modules/nf-core/custom/tabul include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' include { PROPR_GREA } from "../../../modules/nf-core/propr/grea/main.nf" -// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') -def mergeMaps(meta, meta2){ - (meta + meta2).collectEntries { k, v -> - meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] - } -} workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { take: @@ -55,7 +49,7 @@ workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { def criteria = multiMapCriteria { meta_input, input, genesets, meta_exp, samplesheet, featuresheet, features_id, features_symbol, meta_contrasts, variable, reference, target -> def meta_contrasts_new = meta_contrasts + [ 'variable': variable, 'reference': reference, 'target': target ] // make sure variable, reference, target are in the meta - def meta_all = mergeMaps(meta_contrasts_new, meta_input) + def meta_all = meta_input + meta_contrasts_new input: [ meta_all, input ] genesets: From dc74b0f1e294d52389b6ee2ab036869a6a0ef6a1 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 16:15:56 +0100 Subject: [PATCH 08/29] update modules.config --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index fe083970..95f87452 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -494,7 +494,7 @@ process { ] } - withName: 'TABULAR_TO_GSEA_CHIP' { + withName: 'CUSTOM_TABULARTOGSEACHIP' { publishDir = [ enabled: false ] From 5844aea06a3095fd0138943d03191adf4533ea76 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 16:20:39 +0100 Subject: [PATCH 09/29] [workflow] a first version that calls the subworkflows and properly runs till the end. Still need to pass nf-test --- workflows/differentialabundance.nf | 347 ++++++++++++++--------------- 1 file changed, 171 insertions(+), 176 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 0ddb0c67..9504f847 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS + HANDLE INPUT PARAMETERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -56,8 +56,8 @@ if (params.study_type == 'affy_array') { } // Check optional parameters -if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } -if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } +if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = Channel.of([[],[]]) } +if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = Channel.of([[],[]]) } def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run @@ -80,6 +80,32 @@ if (run_gene_set_analysis) { } } +// Define tool channel +// For the moment, it allows a single combination of tools, but this will be changed with +// the toolsheet and introduction of multi-tool logic. +if (params.study_type == 'affy_array' || + params.study_type == 'geo_soft_file' || + params.study_type == 'maxquant' || + (params.study_type == 'rnaseq' && params.differential_use_limma) + ) { + tools_differential = ['method': 'limma'] + } else { + tools_differential = ['method': 'deseq2'] + } +tools_differential += [ + 'fc_threshold': params.differential_min_fold_change, + 'stat_threshold': params.differential_max_qval +] +tools_functional = [] +if (params.gsea_run) { + tools_functional = ['method': 'gsea', 'input_type': 'norm'] +} +if (params.gprofiler2_run) { + tools_functional = ['method': 'gprofiler2', 'input_type': 'filtered'] +} +ch_tools = Channel.of([tools_differential, tools_functional]) + +// report related files report_file = file(params.report_file, checkIfExists: true) logo_file = file(params.logo_file, checkIfExists: true) css_file = file(params.css_file, checkIfExists: true) @@ -114,17 +140,8 @@ include { SHINYNGS_APP } from '../modules/n include { SHINYNGS_STATICEXPLORATORY as PLOT_EXPLORATORY } from '../modules/nf-core/shinyngs/staticexploratory/main' include { SHINYNGS_STATICDIFFERENTIAL as PLOT_DIFFERENTIAL } from '../modules/nf-core/shinyngs/staticdifferential/main' include { SHINYNGS_VALIDATEFOMCOMPONENTS as VALIDATOR } from '../modules/nf-core/shinyngs/validatefomcomponents/main' -include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../modules/nf-core/deseq2/differential/main' -include { DESEQ2_DIFFERENTIAL } from '../modules/nf-core/deseq2/differential/main' -include { LIMMA_DIFFERENTIAL } from '../modules/nf-core/limma/differential/main' include { CUSTOM_MATRIXFILTER } from '../modules/nf-core/custom/matrixfilter/main' -include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' include { ATLASGENEANNOTATIONMANIPULATION_GTF2FEATUREANNOTATION as GTF_TO_TABLE } from '../modules/nf-core/atlasgeneannotationmanipulation/gtf2featureannotation/main' -include { GSEA_GSEA } from '../modules/nf-core/gsea/gsea/main' -include { GPROFILER2_GOST } from '../modules/nf-core/gprofiler2/gost/main' -include { CUSTOM_TABULARTOGSEAGCT } from '../modules/nf-core/custom/tabulartogseagct/main' -include { CUSTOM_TABULARTOGSEACLS } from '../modules/nf-core/custom/tabulartogseacls/main' -include { CUSTOM_TABULARTOGSEACHIP } from '../modules/nf-core/custom/tabulartogseachip/main' include { RMARKDOWNNOTEBOOK } from '../modules/nf-core/rmarkdownnotebook/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_RAW } from '../modules/nf-core/affy/justrma/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_NORM } from '../modules/nf-core/affy/justrma/main' @@ -134,6 +151,26 @@ include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/n include { IMMUNEDECONV } from '../modules/nf-core/immunedeconv/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +// +// SUBWORKFLOW: Installed directly from nf-core/modules +// +include { ABUNDANCE_DIFFERENTIAL_FILTER } from '../subworkflows/nf-core/abundance_differential_filter/main' +include { DIFFERENTIAL_FUNCTIONAL_ENRICHMENT } from '../subworkflows/nf-core/differential_functional_enrichment/main' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + DEFINE FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +def replace_meta_method_id (channel, new_id) { + return channel.map { it -> + def meta = it[0] - ['method': it[0].method] + meta[new_id] = it[0].method + [ meta, it[1..it.size()-1] ].flatten() + } +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -337,170 +374,97 @@ workflow DIFFERENTIALABUNDANCE { VALIDATOR.out.sample_meta ) - // Prepare inputs for differential processes - - ch_samples_and_matrix = VALIDATOR.out.sample_meta - .join(CUSTOM_MATRIXFILTER.out.filtered) // -> meta, samplesheet, filtered matrix - .first() + // ======================================================================== + // Differential analysis + // ======================================================================== - if (params.study_type == 'affy_array' || - params.study_type == 'geo_soft_file' || - params.study_type == 'maxquant' || - (params.study_type == 'rnaseq' && params.differential_use_limma) - ) { - - LIMMA_DIFFERENTIAL ( - ch_contrasts, - ch_samples_and_matrix - ) - ch_differential = LIMMA_DIFFERENTIAL.out.results - ch_model = LIMMA_DIFFERENTIAL.out.model - - ch_versions = ch_versions - .mix(LIMMA_DIFFERENTIAL.out.versions) - - if (params.study_type == 'rnaseq') { - ch_norm = LIMMA_DIFFERENTIAL.out.normalised_counts.first() - } - - ch_processed_matrices = ch_norm - .map{ it.tail() } - .first() - - } else { - DESEQ2_NORM ( - ch_contrasts.first(), - ch_samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - // Run the DESeq differential module, which doesn't take the feature - // annotations - - DESEQ2_DIFFERENTIAL ( - ch_contrasts, - ch_samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - // Let's make the simplifying assumption that the processed matrices from - // the DESeq runs are the same across contrasts. We run the DESeq process - // with matrices once for each contrast because DESeqDataSetFromMatrix() - // takes the model, and the model can vary between contrasts if the - // blocking factors included differ. But the normalised and - // variance-stabilised matrices are not (IIUC) impacted by the model. - - ch_norm = DESEQ2_NORM.out.normalised_counts - ch_differential = DESEQ2_DIFFERENTIAL.out.results - ch_model = DESEQ2_DIFFERENTIAL.out.model - - ch_versions = ch_versions - .mix(DESEQ2_DIFFERENTIAL.out.versions) + // Prepare inputs for differential processes - ch_processed_matrices = ch_norm - if ('rlog' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) - } - if ('vst' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) + ch_differential_input = CUSTOM_MATRIXFILTER.out.filtered + .combine(ch_tools) + .map { meta, matrix, tools_differential, tools_functional -> + [ + meta, + matrix, + tools_differential.method, + tools_differential.fc_threshold, + tools_differential.stat_threshold + ] } - ch_processed_matrices = ch_processed_matrices - .map{ it.tail() } - } - // We'll use a local module to filter the differential tables and create output files that contain only differential features - ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change, '>=' ]) - ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval, '<=' ]) + // Run differential analysis - CUSTOM_FILTERDIFFERENTIALTABLE( - ch_differential, - ch_logfc, - ch_padj + ABUNDANCE_DIFFERENTIAL_FILTER( + ch_differential_input, + VALIDATOR.out.sample_meta, + ch_transcript_lengths, + ch_control_features, + ch_contrasts ) - // Run a gene set analysis where directed - - // Currently, we're letting GSEA work on the expression data. In future we - // will allow use of GSEA preranked instead, which will work with the fold - // changes/ p values from DESeq2 - - if (params.gsea_run){ - - // For GSEA, we need to convert normalised counts to a GCT format for - // input, and process the sample sheet to generate class definitions - // (CLS) for the variable used in each contrast - - CUSTOM_TABULARTOGSEAGCT ( ch_norm ) - - // TODO: update CUSTOM_TABULARTOGSEACLS for value channel input per new - // guidlines (rather than meta usage employed here) + // collect differential results + // meta.method would be replaced by meta.method_differential - ch_contrasts_and_samples = ch_contrasts - .map{it[0]} // revert back to contrasts meta map - .combine( VALIDATOR.out.sample_meta.map { it[1] } ) + ch_differential_results = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise, 'method_differential') + ch_differential_results_filtered = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered, 'method_differential') + ch_differential_norm = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix, 'method_differential') + ch_differential_model = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.model, 'method_differential') + rlog_counts = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.rlog_counts.filter{ it != null}, 'method_differential') + vst_counts = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.vst_counts.filter{ it != null}, 'method_differential') - CUSTOM_TABULARTOGSEACLS(ch_contrasts_and_samples) - - CUSTOM_TABULARTOGSEACHIP( - VALIDATOR.out.feature_meta, - [params.features_id_col, params.features_name_col] - ) + ch_versions = ch_versions + .mix(ABUNDANCE_DIFFERENTIAL_FILTER.out.versions) - // The normalised matrix does not always have a contrast meta, so we - // need a combine rather than a join here - // Also add file name to metamap for easy access from modules.config + // ======================================================================== + // Functional analysis + // ======================================================================== - ch_gsea_inputs = CUSTOM_TABULARTOGSEAGCT.out.gct - .map{ it.tail() } - .combine(CUSTOM_TABULARTOGSEACLS.out.cls) - .map{ tuple(it[1], it[0], it[2]) } - .combine(ch_gene_sets) + // Prepare background file - for the moment it is only needed for gprofiler2 - GSEA_GSEA( - ch_gsea_inputs, - ch_gsea_inputs.map{ tuple(it[0].reference, it[0].target) }, // * - CUSTOM_TABULARTOGSEACHIP.out.chip.first() - ) + if (!params.gprofiler2_background_file) { + // If deactivated, use empty list as "background" + ch_background = [] + } else if (params.gprofiler2_background_file == "auto") { + // If auto, use input matrix as background + ch_background = CUSTOM_MATRIXFILTER.out.filtered.map{it.tail()}.first() + } else { + ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) + } - // * Note: GSEA module currently uses a value channel for the mandatory - // non-file arguments used to define contrasts, hence the indicated - // usage of map to perform that transformation. An active subject of - // debate + // Prepare input for functional analysis - ch_gsea_results = GSEA_GSEA.out.report_tsvs_ref - .join(GSEA_GSEA.out.report_tsvs_target) + ch_functional_input = ch_differential_results_filtered.combine(ch_tools.filter{it[1].input_type == 'filtered'}) + .mix(ch_differential_norm.combine(ch_tools.filter{it[1].input_type == 'norm'})) + .combine(ch_gene_sets) + .combine(ch_background) + .map { meta, input, tools_differential, tools_functional, gene_sets, background -> + if (meta.method_differential == tools_differential.method) { + return [meta, input, gene_sets, background, tools_functional.method] + } + } - // Record GSEA versions - ch_versions = ch_versions - .mix(CUSTOM_TABULARTOGSEACHIP.out.versions) - .mix(GSEA_GSEA.out.versions) - } + // Run functional analysis - if (params.gprofiler2_run) { + DIFFERENTIAL_FUNCTIONAL_ENRICHMENT( + ch_functional_input, + ch_contrasts, + VALIDATOR.out.sample_meta, + VALIDATOR.out.feature_meta.combine(Channel.of([params.features_id_col, params.features_name_col])) + ) - // For gprofiler2, use only features that are considered differential - ch_filtered_diff = CUSTOM_FILTERDIFFERENTIALTABLE.out.filtered + // Prepare the results for downstream analysis - if (!params.gprofiler2_background_file) { - // If deactivated, use empty list as "background" - ch_background = [] - } else if (params.gprofiler2_background_file == "auto") { - // If auto, use input matrix as background - ch_background = CUSTOM_MATRIXFILTER.out.filtered.map{it.tail()}.first() - } else { - ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) - } + ch_gsea_results = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report, 'method_functional') + gprofiler2_plot_html = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_plot_html, 'method_functional') + gprofiler2_all_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_all_enrich, 'method_functional') + gprofiler2_sub_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_sub_enrich, 'method_functional') - // For gprofiler2, token and organism have priority and will override a gene_sets file + ch_versions = ch_versions + .mix(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.versions) - GPROFILER2_GOST( - ch_filtered_diff, - ch_gene_sets.map { it -> [[], it]}.first(), - ch_background.map{ it -> [[], it]}.first(), - ) - } + // ======================================================================== + // Plot figures + // ======================================================================== // The exploratory plots are made by coloring by every unique variable used // to define contrasts @@ -511,32 +475,61 @@ workflow DIFFERENTIALABUNDANCE { } .unique() + // parse matrices + // TODO check if the processing of channels below can be simplified + + if (params.study_type == 'rnaseq') { + ch_processed_matrices = ch_differential_norm + .combine( rlog_counts.ifEmpty([[],[]]) ) + .combine( vst_counts.ifEmpty([[],[]]) ) + .map { meta, norm, meta_rlog, rlog, meta_vst, vst -> + def matrices = [meta, norm] + if (meta_rlog == [] || meta == meta_rlog) matrices += [rlog] + if (meta_vst == [] || meta == meta_vst) matrices += [vst] + return matrices // meta, norm, rlog, vst + } + } else { + // TODO check why ch_norm is used instead of ch_differential_norm, when the study is not rnaseq + ch_processed_matrices = ch_norm.combine(Channel.of([[],[]])) + } + // For geoquery we've done no matrix processing and been supplied with the // normalised matrix, which can be passed through to downstream analysis - if (params.study_type == "geo_soft_file") { - ch_mat = ch_norm + ch_mat = ch_norm.combine( Channel.of([[],[],[]]) ) } else { ch_mat = ch_raw.combine(ch_processed_matrices) + .map { meta_exp, raw, meta_norm, norm, rlog, vst -> + if (meta_norm.subMap(meta_exp.keySet()) == meta_exp) { + return [meta_norm, raw, norm, rlog, vst] + } + } } - ch_all_matrices = VALIDATOR.out.sample_meta // meta, samples + ch_all_matrices = VALIDATOR.out.sample_meta // meta, samples .join(VALIDATOR.out.feature_meta) // meta, samples, features - .join(ch_mat) // meta, samples, features, raw, norm (or just norm) - .map{ - tuple(it[0], it[1], it[2], it[3..it.size()-1]) + .combine(ch_mat) + .map { meta_exp, samples, features, meta_mat, raw, norm, rlog, vst -> + if (meta_mat.subMap(meta_exp.keySet()) == meta_exp) { + def processed_matrices = [raw] + if (norm != []) processed_matrices += [norm] + if (rlog != []) processed_matrices += [rlog] + if (vst != []) processed_matrices += [vst] + return [meta_mat, samples, features, processed_matrices] + } } - .first() + + // Exploratory analysis PLOT_EXPLORATORY( ch_contrast_variables .combine(ch_all_matrices.map{ it.tail() }) ) - // Differential analysis using the results of DESeq2 + // Differential analysis PLOT_DIFFERENTIAL( - ch_differential, + ch_differential_results, ch_all_matrices ) @@ -547,9 +540,11 @@ workflow DIFFERENTIALABUNDANCE { .mix(PLOT_EXPLORATORY.out.versions) .mix(PLOT_DIFFERENTIAL.out.versions) - // + // ======================================================================== + // Generate report + // ======================================================================== + // Collate and save software versions - // ch_collated_versions = softwareVersionsToYAML(ch_versions) .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_versions.yml', sort: true, newLine: true) @@ -571,8 +566,8 @@ workflow DIFFERENTIALABUNDANCE { .combine(ch_logo_file) .combine(ch_css_file) .combine(ch_citations_file) - .combine(ch_differential.map{it[1]}.toList()) - .combine(ch_model.map{it[1]}.toList()) + .combine(ch_differential_results.map{it[1]}.toList()) + .combine(ch_differential_model.map{it[1]}.toList()) if (params.gsea_run){ ch_report_input_files = ch_report_input_files @@ -583,10 +578,9 @@ workflow DIFFERENTIALABUNDANCE { if (params.gprofiler2_run){ ch_report_input_files = ch_report_input_files - .combine(GPROFILER2_GOST.out.plot_html.map{it[1]}.flatMap().toList()) - .combine(GPROFILER2_GOST.out.all_enrich.map{it[1]}.flatMap().toList()) - .combine(GPROFILER2_GOST.out.sub_enrich.map{it[1]}.flatMap().toList()) - GPROFILER2_GOST.out.plot_html + .combine(gprofiler2_plot_html.map{it[1]}.flatMap().toList()) + .combine(gprofiler2_all_enrich.map{it[1]}.flatMap().toList()) + .combine(gprofiler2_sub_enrich.map{it[1]}.flatMap().toList()) } // Run IMMUNEDECONV @@ -607,15 +601,15 @@ workflow DIFFERENTIALABUNDANCE { // Make a new contrasts file from the differential metas to guarantee the // same order as the differential results - ch_app_differential = ch_differential.first().map{it[0].keySet().tail().join(',')} + ch_app_differential = ch_differential_results.first().map{it[0].keySet().tail().join(',')} .concat( - ch_differential.map{it[0].values().tail().join(',')} + ch_differential_results.map{it[0].values().tail().join(',')} ) .collectFile(name: 'contrasts.csv', newLine: true, sort: false) .map{ tuple(exp_meta, it) } - .combine(ch_differential.map{it[1]}.collect().map{[it]}) + .combine(ch_differential_results.map{it[1]}.collect().map{[it]}) SHINYNGS_APP( ch_all_matrices, // meta, samples, features, [ matrices ] @@ -661,6 +655,7 @@ workflow DIFFERENTIALABUNDANCE { params.findAll{ k,v -> k.matches(params_pattern) } + [report_file_names, it.collect{ f -> f.name}].transpose().collectEntries() } + // Render the final report RMARKDOWNNOTEBOOK( ch_report_file, From 84484a2b7f25e8bad2ace742e1093623307a3120 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 16:25:10 +0100 Subject: [PATCH 10/29] fix pre-commit --- .../nf-core/differential_functional_enrichment/meta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/differential_functional_enrichment/meta.yml b/subworkflows/nf-core/differential_functional_enrichment/meta.yml index e296e3fe..d03a20da 100644 --- a/subworkflows/nf-core/differential_functional_enrichment/meta.yml +++ b/subworkflows/nf-core/differential_functional_enrichment/meta.yml @@ -133,7 +133,7 @@ output: pattern: "*gsea_report_for_${target}.tsv" - grea_results: description: | - Channel containing the output from GREA. + Channel containing the output from GREA. structure: - meta: type: map From 1830f1f28cb487296709eb4ff2be91dd33d1e1f2 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 16:43:48 +0100 Subject: [PATCH 11/29] [module] revert gsea seed to its previous behaviour. This will pass the default pipeline test --- modules/nf-core/gsea/gsea/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/nf-core/gsea/gsea/main.nf b/modules/nf-core/gsea/gsea/main.nf index 494b8a5d..254d68d3 100644 --- a/modules/nf-core/gsea/gsea/main.nf +++ b/modules/nf-core/gsea/gsea/main.nf @@ -45,7 +45,6 @@ process GSEA_GSEA { def rpt_label = prefix.replaceAll('\\.$', '') // Remove any trailing dots from prefix when passed as report label, so GSEA doesn't produce double-dotted top-level outputs def chip_command = chip ? "-chip $chip -collapse true" : '' def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - if (!(args ==~ /.*-rnd_seed.*/)) {args += " -rnd_seed 10"} """ # Run GSEA From 7d3bfbe1f109b2cf702410f06499376fc75d09bc Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 18:23:59 +0100 Subject: [PATCH 12/29] update test.snap --- conf/modules.config | 2 +- tests/test.nf.test.snap | 68 ++++++++++++++++-------------- workflows/differentialabundance.nf | 2 +- 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 95f87452..a372e1b0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -188,7 +188,7 @@ process { "--shrink_lfc $params.deseq2_shrink_lfc", "--cores $params.deseq2_cores", "--subset_to_contrast_samples $params.differential_subset_to_contrast_samples", - ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), + ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), // TODO check what is the impact of blocking for NORM ].join(' ').trim() } } diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index ea3915d7..e6451707 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -3,6 +3,15 @@ "content": [ 22, { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "DESEQ2_DIFFERENTIAL": { "r-base": "4.1.3", "bioconductor-deseq2": "1.34.0" @@ -23,9 +32,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.0.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-base": "4.3.3", "r-shinyngs": "2.0.0" @@ -74,11 +80,11 @@ "report/gsea", "report/gsea/treatment_mCherry_hND6_", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", @@ -98,11 +104,11 @@ "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "report/gsea/treatment_mCherry_hND6_sample_number", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", @@ -140,9 +146,9 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", + "treatment_mCherry_hND6_.dds.rld.rds:md5,075109c16a43620545ba483c081fba8d", "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,096f7c592e3c5185e4cd5f4caf7f8238", "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "volcano.png:md5,32d82a790e028f9476972a7f38190430", "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", @@ -158,42 +164,42 @@ "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,892774f9d56ba10c8646736b7f777ecc", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,fec8c9babd831dc44a5ac8846db1fb2c", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,d2602eca12d05287769d0ff241c9d671", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2cd12a185557e1535b65275a98bc122b", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,9c7dfa0be563949d4df99a106d3b0d7f", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", - "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" + "all.vst.tsv:md5,84357a35058e119a94d20bc0bd391fde" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.1" }, - "timestamp": "2025-01-15T20:34:32.327786628" + "timestamp": "2025-01-29T17:55:05.168826" } -} \ No newline at end of file +} diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 9504f847..b38bbdcc 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -530,7 +530,7 @@ workflow DIFFERENTIALABUNDANCE { PLOT_DIFFERENTIAL( ch_differential_results, - ch_all_matrices + ch_all_matrices.first() ) // Gather software versions From b4d563057801a032431f7303937e09fa037c2181 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 29 Jan 2025 18:56:52 +0100 Subject: [PATCH 13/29] [workflow] set ch_gene_sets and ch_background to Channel.of([[]]) when not provided --- workflows/differentialabundance.nf | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index b38bbdcc..a57a0fa5 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -61,8 +61,8 @@ if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run +ch_gene_sets = Channel.of([[]]) if (run_gene_set_analysis) { - ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (params.gene_sets_files) { gene_sets_files = params.gene_sets_files.split(",") ch_gene_sets = Channel.of(gene_sets_files).map { file(it, checkIfExists: true) } @@ -74,8 +74,6 @@ if (run_gene_set_analysis) { } else if (params.gprofiler2_run) { if (!params.gprofiler2_token && !params.gprofiler2_organism) { error("To run gprofiler2, please provide a run token, GMT file or organism!") - } else { - ch_gene_sets = [[]] // For gprofiler2 which calls ch_gene_sets.first() } } } @@ -421,14 +419,14 @@ workflow DIFFERENTIALABUNDANCE { // Prepare background file - for the moment it is only needed for gprofiler2 - if (!params.gprofiler2_background_file) { - // If deactivated, use empty list as "background" - ch_background = [] - } else if (params.gprofiler2_background_file == "auto") { - // If auto, use input matrix as background - ch_background = CUSTOM_MATRIXFILTER.out.filtered.map{it.tail()}.first() - } else { - ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) + ch_background = Channel.of([[]]) + if (params.gprofiler2_run) { + if (params.gprofiler2_background_file == "auto") { + // If auto, use input matrix as background + ch_background = CUSTOM_MATRIXFILTER.out.filtered.map{it.tail()}.first() + } else { + ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) + } } // Prepare input for functional analysis From 83ebd1f01d62b81db2ab0b55005556f5da362feb Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 30 Jan 2025 11:40:34 +0100 Subject: [PATCH 14/29] [pipeline] update modules.config to add LIMMA_NORM config, when using limma voom for rnaseq. --- conf/modules.config | 32 ++++++++++++++++++++++++++++++++ tests/test_soft.nf.test.snap | 14 +++++++------- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a372e1b0..e9e4ba34 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -238,6 +238,38 @@ process { ].join(' ').trim() } } + withName: LIMMA_NORM { + ext.prefix = 'all' + publishDir = [ + [ + path: { "${params.outdir}/tables/processed_abundance" }, + mode: params.publish_dir_mode, + pattern: '*.{normalised_counts}.tsv' + ], + ] + ext.when = params.limma_use_voom + ext.args = { [ + "--probe_id_col \"${params.features_id_col}\"", + "--sample_id_col \"${params.observations_id_col}\"", + "--ndups \"${params.limma_ndups}\"", + "--spacing \"${params.limma_spacing}\"", + "--block \"${params.limma_block}\"", + "--correlation ${params.limma_correlation}", + "--method \"${params.limma_method}\"", + "--proportion ${params.limma_proportion}", + "--stdev.coef.lim \"${params.limma_stdev_coef_lim}\"", + "--trend ${params.limma_trend}", + "--robust ${params.limma_robust}", + "--winsor.tail.p \"${params.limma_winsor_tail_p}\"", + "--p.value ${params.limma_p_value}", + "--lfc ${params.limma_lfc}", + "--confint ${params.limma_confint}", + "--subset_to_contrast_samples $params.differential_subset_to_contrast_samples", + "--use_voom \"${params.limma_use_voom}\"", + ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), + ].join(' ').trim() } + } + withName: LIMMA_DIFFERENTIAL { ext.prefix = { "${meta.id}" } publishDir = [ diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap index 5f6446a7..330ee77d 100644 --- a/tests/test_soft.nf.test.snap +++ b/tests/test_soft.nf.test.snap @@ -71,7 +71,7 @@ ], [ "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", + "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,f3c8693c221002f6aaeaa89bc74d19b4", "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", "versions.yml:md5,b20728a34a3537e339078bbeaababee9", "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", @@ -85,15 +85,15 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,892774f9d56ba10c8646736b7f777ecc", "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", + "phenotype_uninvolved_lesional.limma.results.tsv:md5,7227ed999a410a99db2a14252cbe57e4", + "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,d67c10dc2ac99d5b94f56a70f00faa4e", "normalised.matrix.tsv:md5,230f87f91c0c1a7e2ab354200c4b978c" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.3" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-12-17T12:14:27.925053664" + "timestamp": "2025-01-30T11:32:08.021771" } -} \ No newline at end of file +} From 62ad12608c9bc49fee1909be38674abcb7a9519c Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 30 Jan 2025 11:56:35 +0100 Subject: [PATCH 15/29] update test_rnaseq_limma snapshot --- tests/test_rnaseq_limma.nf.test.snap | 71 ++++++++++++++++------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap index acd27efc..27d66252 100644 --- a/tests/test_rnaseq_limma.nf.test.snap +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -1,8 +1,17 @@ { "Test rnaseq limma profile": { "content": [ - 20, + 22, { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "GSEA_GSEA": { "gsea": "4.3.2" }, @@ -23,9 +32,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.0.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-base": "4.3.3", "r-shinyngs": "2.0.0" @@ -69,11 +75,11 @@ "report/gsea", "report/gsea/treatment_mCherry_hND6_", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", @@ -93,11 +99,11 @@ "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "report/gsea/treatment_mCherry_hND6_sample_number", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", @@ -127,11 +133,13 @@ "tables/differential/treatment_mCherry_hND6_.limma.results.tsv", "tables/differential/treatment_mCherry_hND6_.limma.results_filtered.tsv", "tables/differential/treatment_mCherry_hND6_sample_number.limma.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv" + "tables/differential/treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv", + "tables/processed_abundance", + "tables/processed_abundance/all.normalised_counts.tsv" ], [ - "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", - "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", + "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,ff9b67869ea73d2daedd6ec47fcb6605", + "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,4e2aab8c2cf6faf3536e50a2fcb01a24", "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", "versions.yml:md5,b20728a34a3537e339078bbeaababee9", @@ -144,39 +152,40 @@ "versions.yml:md5,9c47cbf6f2f30c711eb57fff84ea3736", "treatment_mCherry_hND6_.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", "treatment_mCherry_hND6_sample_number.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,cd78da35019246e48a0347f889927512", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,35c67dd6865094465ffbce6a237d46dc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,cd78da35019246e48a0347f889927512", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,35c67dd6865094465ffbce6a237d46dc", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,892774f9d56ba10c8646736b7f777ecc", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", + "treatment_mCherry_hND6_.limma.results.tsv:md5,4fae1cce0e7990a70376fe28622b8815", "treatment_mCherry_hND6_.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", - "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", - "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,4ec1aebed20630563d4f88a717622e92", + "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "all.normalised_counts.tsv:md5,7510c89d6665176d5026b7af0a64344d" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.3" + "nf-test": "0.9.2", + "nextflow": "24.10.4" }, - "timestamp": "2024-12-17T12:10:44.503110769" + "timestamp": "2025-01-30T11:52:47.463052" } } \ No newline at end of file From fac8a3dddffb7a1d2663c3a1d1fb3945394f8703 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 30 Jan 2025 14:16:09 +0100 Subject: [PATCH 16/29] [bug] update workflow to properly handle ch_norm --- tests/test.nf.test.snap | 404 +++++++++++++++++++++++++++ tests/test_rnaseq_limma.nf.test.snap | 189 +++++++++++++ tests/test_soft.nf.test.snap | 97 +++++++ workflows/differentialabundance.nf | 27 +- 4 files changed, 700 insertions(+), 17 deletions(-) create mode 100644 tests/test.nf.test.snap create mode 100644 tests/test_rnaseq_limma.nf.test.snap create mode 100644 tests/test_soft.nf.test.snap diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap new file mode 100644 index 00000000..0e5fdafa --- /dev/null +++ b/tests/test.nf.test.snap @@ -0,0 +1,404 @@ +{ + "Test profile - csv contrasts": { + "content": [ + 23, + { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, + "DESEQ2_DIFFERENTIAL": { + "r-base": "4.1.3", + "bioconductor-deseq2": "1.34.0" + }, + "GSEA_GSEA": { + "gsea": "4.3.2" + }, + "GTF_TO_TABLE": { + "atlas-gene-annotation-manipulation": "1.1.1" + }, + "GUNZIP_GTF": { + "gunzip": 1.1 + }, + "PLOT_DIFFERENTIAL": { + "r-shinyngs": "2.1.0" + }, + "PLOT_EXPLORATORY": { + "r-shinyngs": "2.1.0" + }, + "VALIDATOR": { + "r-shinyngs": "2.1.0" + }, + "Workflow": { + "nf-core/differentialabundance": "v1.6.0dev" + } + }, + [ + "other", + "other/deseq2", + "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "pipeline_info", + "pipeline_info/collated_versions.yml", + "plots", + "plots/differential", + "plots/differential/treatment_mCherry_hND6_", + "plots/differential/treatment_mCherry_hND6_/png", + "plots/differential/treatment_mCherry_hND6_/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number", + "plots/differential/treatment_mCherry_hND6_sample_number/png", + "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/versions.yml", + "plots/exploratory", + "plots/exploratory/treatment", + "plots/exploratory/treatment/png", + "plots/exploratory/treatment/png/boxplot.png", + "plots/exploratory/treatment/png/density.png", + "plots/exploratory/treatment/png/mad_correlation.png", + "plots/exploratory/treatment/png/pca2d.png", + "plots/exploratory/treatment/png/pca3d.png", + "plots/exploratory/treatment/png/sample_dendrogram.png", + "plots/exploratory/versions.yml", + "plots/immunedeconv", + "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", + "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", + "plots/qc", + "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "report", + "report/SRP254919.html", + "report/SRP254919.zip", + "report/gsea", + "report/gsea/treatment_mCherry_hND6_", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "shinyngs_app", + "shinyngs_app/SRP254919", + "shinyngs_app/SRP254919/app.R", + "shinyngs_app/SRP254919/data.rds", + "shinyngs_app/versions.yml", + "tables", + "tables/annotation", + "tables/annotation/Mus_musculus.anno.tsv", + "tables/differential", + "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/immunedeconv", + "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", + "tables/processed_abundance", + "tables/processed_abundance/all.normalised_counts.tsv", + "tables/processed_abundance/all.vst.tsv" + ], + [ + "treatment_mCherry_hND6_.dds.rld.rds:md5,075109c16a43620545ba483c081fba8d", + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,096f7c592e3c5185e4cd5f4caf7f8238", + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "volcano.png:md5,32d82a790e028f9476972a7f38190430", + "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", + "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", + "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", + "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", + "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", + "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", + "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", + "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", + "versions.yml:md5,837080c1af397890cab637f12f6c4851", + "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", + "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", + "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", + "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", + "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", + "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,fec8c9babd831dc44a5ac8846db1fb2c", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,d2602eca12d05287769d0ff241c9d671", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2cd12a185557e1535b65275a98bc122b", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,9c7dfa0be563949d4df99a106d3b0d7f", + "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", + "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", + "all.vst.tsv:md5,84357a35058e119a94d20bc0bd391fde" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-30T12:24:51.307694" + }, + "Test profile - yml contrasts": { + "content": [ + 23, + { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, + "DESEQ2_DIFFERENTIAL": { + "r-base": "4.1.3", + "bioconductor-deseq2": "1.34.0" + }, + "GSEA_GSEA": { + "gsea": "4.3.2" + }, + "GTF_TO_TABLE": { + "atlas-gene-annotation-manipulation": "1.1.1" + }, + "GUNZIP_GTF": { + "gunzip": 1.1 + }, + "PLOT_DIFFERENTIAL": { + "r-shinyngs": "2.1.0" + }, + "PLOT_EXPLORATORY": { + "r-shinyngs": "2.1.0" + }, + "VALIDATOR": { + "r-shinyngs": "2.1.0" + }, + "Workflow": { + "nf-core/differentialabundance": "v1.6.0dev" + } + }, + [ + "other", + "other/deseq2", + "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "pipeline_info", + "pipeline_info/collated_versions.yml", + "plots", + "plots/differential", + "plots/differential/treatment_mCherry_hND6_", + "plots/differential/treatment_mCherry_hND6_/png", + "plots/differential/treatment_mCherry_hND6_/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number", + "plots/differential/treatment_mCherry_hND6_sample_number/png", + "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/versions.yml", + "plots/exploratory", + "plots/exploratory/treatment", + "plots/exploratory/treatment/png", + "plots/exploratory/treatment/png/boxplot.png", + "plots/exploratory/treatment/png/density.png", + "plots/exploratory/treatment/png/mad_correlation.png", + "plots/exploratory/treatment/png/pca2d.png", + "plots/exploratory/treatment/png/pca3d.png", + "plots/exploratory/treatment/png/sample_dendrogram.png", + "plots/exploratory/versions.yml", + "plots/immunedeconv", + "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", + "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", + "plots/qc", + "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "report", + "report/SRP254919.html", + "report/SRP254919.zip", + "report/gsea", + "report/gsea/treatment_mCherry_hND6_", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "shinyngs_app", + "shinyngs_app/SRP254919", + "shinyngs_app/SRP254919/app.R", + "shinyngs_app/SRP254919/data.rds", + "shinyngs_app/versions.yml", + "tables", + "tables/annotation", + "tables/annotation/Mus_musculus.anno.tsv", + "tables/differential", + "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/immunedeconv", + "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", + "tables/processed_abundance", + "tables/processed_abundance/all.normalised_counts.tsv", + "tables/processed_abundance/all.vst.tsv" + ], + [ + "treatment_mCherry_hND6_.dds.rld.rds:md5,075109c16a43620545ba483c081fba8d", + "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,096f7c592e3c5185e4cd5f4caf7f8238", + "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "volcano.png:md5,32d82a790e028f9476972a7f38190430", + "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", + "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", + "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", + "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", + "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", + "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", + "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", + "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", + "versions.yml:md5,837080c1af397890cab637f12f6c4851", + "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", + "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", + "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", + "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", + "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", + "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,fec8c9babd831dc44a5ac8846db1fb2c", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,d2602eca12d05287769d0ff241c9d671", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2cd12a185557e1535b65275a98bc122b", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,9c7dfa0be563949d4df99a106d3b0d7f", + "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", + "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", + "all.vst.tsv:md5,84357a35058e119a94d20bc0bd391fde" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-30T12:19:58.909453" + } +} diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap new file mode 100644 index 00000000..00914591 --- /dev/null +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -0,0 +1,189 @@ +{ + "Test rnaseq limma profile": { + "content": [ + 22, + { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, + "GSEA_GSEA": { + "gsea": "4.3.2" + }, + "GTF_TO_TABLE": { + "atlas-gene-annotation-manipulation": "1.1.1" + }, + "GUNZIP_GTF": { + "gunzip": 1.1 + }, + "LIMMA_DIFFERENTIAL": { + "r-base": "4.3.3", + "bioconductor-limma": "3.58.1" + }, + "PLOT_DIFFERENTIAL": { + "r-shinyngs": "2.1.0" + }, + "PLOT_EXPLORATORY": { + "r-shinyngs": "2.1.0" + }, + "VALIDATOR": { + "r-shinyngs": "2.1.0" + }, + "Workflow": { + "nf-core/differentialabundance": "v1.6.0dev" + } + }, + [ + "other", + "other/limma", + "other/limma/treatment_mCherry_hND6_.MArrayLM.limma.rds", + "other/limma/treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds", + "pipeline_info", + "pipeline_info/collated_versions.yml", + "plots", + "plots/differential", + "plots/differential/treatment_mCherry_hND6_", + "plots/differential/treatment_mCherry_hND6_/png", + "plots/differential/treatment_mCherry_hND6_/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number", + "plots/differential/treatment_mCherry_hND6_sample_number/png", + "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/versions.yml", + "plots/exploratory", + "plots/exploratory/treatment", + "plots/exploratory/treatment/png", + "plots/exploratory/treatment/png/boxplot.png", + "plots/exploratory/treatment/png/density.png", + "plots/exploratory/treatment/png/mad_correlation.png", + "plots/exploratory/treatment/png/pca2d.png", + "plots/exploratory/treatment/png/pca3d.png", + "plots/exploratory/treatment/png/sample_dendrogram.png", + "plots/exploratory/versions.yml", + "plots/qc", + "plots/qc/treatment_mCherry_hND6_.limma.mean_difference.png", + "plots/qc/treatment_mCherry_hND6_sample_number.limma.mean_difference.png", + "report", + "report/SRP254919.html", + "report/SRP254919.zip", + "report/gsea", + "report/gsea/treatment_mCherry_hND6_", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "shinyngs_app", + "shinyngs_app/SRP254919", + "shinyngs_app/SRP254919/app.R", + "shinyngs_app/SRP254919/data.rds", + "shinyngs_app/versions.yml", + "tables", + "tables/annotation", + "tables/annotation/Mus_musculus.anno.tsv", + "tables/differential", + "tables/differential/treatment_mCherry_hND6_.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6_.limma.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv", + "tables/processed_abundance", + "tables/processed_abundance/all.normalised_counts.tsv" + ], + [ + "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,ff9b67869ea73d2daedd6ec47fcb6605", + "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,4e2aab8c2cf6faf3536e50a2fcb01a24", + "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", + "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", + "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", + "boxplot.png:md5,fddc3f29ff4561a856cd2d58a1dfe637", + "density.png:md5,d7552dab8e578124da77edaeff22dccf", + "mad_correlation.png:md5,340df9eb381307cf4d98d79da3213e6f", + "pca2d.png:md5,ce23b7e9b1300fb83bd593781fc70648", + "pca3d.png:md5,458d2c497557113ec203fe38186f5e1c", + "sample_dendrogram.png:md5,eb02da7195194e0d56578df41022f9bf", + "versions.yml:md5,837080c1af397890cab637f12f6c4851", + "treatment_mCherry_hND6_.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", + "treatment_mCherry_hND6_sample_number.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", + "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", + "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", + "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", + "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", + "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", + "treatment_mCherry_hND6_.limma.results.tsv:md5,4fae1cce0e7990a70376fe28622b8815", + "treatment_mCherry_hND6_.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,4ec1aebed20630563d4f88a717622e92", + "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "all.normalised_counts.tsv:md5,7510c89d6665176d5026b7af0a64344d" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-30T12:23:30.214338409" + } +} diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap new file mode 100644 index 00000000..80f4a4f2 --- /dev/null +++ b/tests/test_soft.nf.test.snap @@ -0,0 +1,97 @@ +{ + "Test soft profile": { + "content": [ + 10, + { + "GEOQUERY_GETGEO": { + "r-base": "4.3.2", + "bioconductor-geoquery": "2.70.0" + }, + "LIMMA_DIFFERENTIAL": { + "r-base": "4.3.3", + "bioconductor-limma": "3.58.1" + }, + "PLOT_DIFFERENTIAL": { + "r-shinyngs": "2.1.0" + }, + "PLOT_EXPLORATORY": { + "r-shinyngs": "2.1.0" + }, + "VALIDATOR": { + "r-shinyngs": "2.1.0" + }, + "Workflow": { + "nf-core/differentialabundance": "v1.6.0dev" + } + }, + [ + "other", + "other/affy", + "other/affy/normalised.eset.rds", + "other/limma", + "other/limma/phenotype_uninvolved_lesional.MArrayLM.limma.rds", + "pipeline_info", + "pipeline_info/collated_versions.yml", + "plots", + "plots/differential", + "plots/differential/phenotype_uninvolved_lesional", + "plots/differential/phenotype_uninvolved_lesional/png", + "plots/differential/phenotype_uninvolved_lesional/png/volcano.png", + "plots/differential/versions.yml", + "plots/exploratory", + "plots/exploratory/phenotype", + "plots/exploratory/phenotype/png", + "plots/exploratory/phenotype/png/boxplot.png", + "plots/exploratory/phenotype/png/density.png", + "plots/exploratory/phenotype/png/mad_correlation.png", + "plots/exploratory/phenotype/png/pca2d.png", + "plots/exploratory/phenotype/png/pca3d.png", + "plots/exploratory/phenotype/png/sample_dendrogram.png", + "plots/exploratory/versions.yml", + "plots/qc", + "plots/qc/phenotype_uninvolved_lesional.limma.mean_difference.png", + "report", + "report/study.html", + "report/study.zip", + "shinyngs_app", + "shinyngs_app/study", + "shinyngs_app/study/app.R", + "shinyngs_app/study/data.rds", + "shinyngs_app/versions.yml", + "tables", + "tables/annotation", + "tables/annotation/normalised.annotation.tsv", + "tables/differential", + "tables/differential/phenotype_uninvolved_lesional.limma.results.tsv", + "tables/differential/phenotype_uninvolved_lesional.limma.results_filtered.tsv", + "tables/processed_abundance", + "tables/processed_abundance/normalised.matrix.tsv" + ], + [ + "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", + "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,f3c8693c221002f6aaeaa89bc74d19b4", + "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", + "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", + "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", + "density.png:md5,551c933a5d3dfe216dc000de19d9725f", + "mad_correlation.png:md5,60f9c0e924d52a569d976a3fb2c22a43", + "pca2d.png:md5,aad430028daa7ffa7cd6bea1c6c41d43", + "pca3d.png:md5,d32182b1005d696da648170f3bd9dbe8", + "sample_dendrogram.png:md5,b66045a3c9df5310f3241544c50f3fd1", + "versions.yml:md5,837080c1af397890cab637f12f6c4851", + "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", + "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", + "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", + "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", + "phenotype_uninvolved_lesional.limma.results.tsv:md5,7227ed999a410a99db2a14252cbe57e4", + "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,d67c10dc2ac99d5b94f56a70f00faa4e", + "normalised.matrix.tsv:md5,230f87f91c0c1a7e2ab354200c4b978c" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-30T12:20:04.803269" + } +} diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index d7308170..df79f5fc 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -436,6 +436,8 @@ workflow DIFFERENTIALABUNDANCE { ch_versions = ch_versions .mix(ABUNDANCE_DIFFERENTIAL_FILTER.out.versions) + if (params.study_type == 'rnaseq') ch_norm = ch_differential_norm + // ======================================================================== // Functional analysis // ======================================================================== @@ -455,11 +457,11 @@ workflow DIFFERENTIALABUNDANCE { // Prepare input for functional analysis ch_functional_input = ch_differential_results_filtered.combine(ch_tools.filter{it[1].input_type == 'filtered'}) - .mix(ch_differential_norm.combine(ch_tools.filter{it[1].input_type == 'norm'})) + .mix(ch_norm.combine(ch_tools.filter{it[1].input_type == 'norm'})) .combine(ch_gene_sets) .combine(ch_background) .map { meta, input, tools_differential, tools_functional, gene_sets, background -> - if (meta.method_differential == tools_differential.method) { + if (!('method_differential' in meta) || (meta.method_differential == tools_differential.method)) { return [meta, input, gene_sets, background, tools_functional.method] } } @@ -496,11 +498,12 @@ workflow DIFFERENTIALABUNDANCE { } .unique() - // parse matrices - // TODO check if the processing of channels below can be simplified - - if (params.study_type == 'rnaseq') { - ch_processed_matrices = ch_differential_norm + // For geoquery we've done no matrix processing and been supplied with the + // normalised matrix, which can be passed through to downstream analysis + if (params.study_type == "geo_soft_file") { + ch_mat = ch_norm.combine( Channel.of([[],[],[]]) ) + } else { + ch_processed_matrices = ch_norm .combine( rlog_counts.ifEmpty([[],[]]) ) .combine( vst_counts.ifEmpty([[],[]]) ) .map { meta, norm, meta_rlog, rlog, meta_vst, vst -> @@ -509,16 +512,6 @@ workflow DIFFERENTIALABUNDANCE { if (meta_vst == [] || meta == meta_vst) matrices += [vst] return matrices // meta, norm, rlog, vst } - } else { - // TODO check why ch_norm is used instead of ch_differential_norm, when the study is not rnaseq - ch_processed_matrices = ch_norm.combine(Channel.of([[],[]])) - } - - // For geoquery we've done no matrix processing and been supplied with the - // normalised matrix, which can be passed through to downstream analysis - if (params.study_type == "geo_soft_file") { - ch_mat = ch_norm.combine( Channel.of([[],[],[]]) ) - } else { ch_mat = ch_raw.combine(ch_processed_matrices) .map { meta_exp, raw, meta_norm, norm, rlog, vst -> if (meta_norm.subMap(meta_exp.keySet()) == meta_exp) { From a90148d3009322f166888f8914391a69f43fed63 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 30 Jan 2025 14:16:25 +0100 Subject: [PATCH 17/29] update test snapshots --- tests/test_affy.nf.test.snap | 233 ++++++++++++++++--------------- tests/test_maxquant.nf.test.snap | 30 ++-- tests/test_nogtf.nf.test.snap | 20 +-- 3 files changed, 146 insertions(+), 137 deletions(-) diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index 00134426..663f0e7e 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -7,6 +7,15 @@ "r-base": "4.3.1", "bioconductor-affy": "1.78.0" }, + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "GSEA_GSEA": { "gsea": "4.3.2" }, @@ -20,9 +29,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.1.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-shinyngs": "2.1.0" }, @@ -62,76 +68,78 @@ "report/gsea", "report/gsea/phenotype_uninvolved_lesional", "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Gsea.rpt", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", @@ -167,7 +175,7 @@ ], [ "raw._eset.rds:md5,8c6c7807ce6c5d8204bd681b941eeb0f", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", + "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,3a3200070f436f00147284521a44068c", "volcano.png:md5,d4381dd34786c58e25b8e4ed1fa8bf26", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", "boxplot.png:md5,552c6cf37521fae8170368e3adb4da80", @@ -178,48 +186,49 @@ "sample_dendrogram.png:md5,69e00857f24a2aa4c02042bdb87d4fd8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv:md5,4070abb7bce1b665cae361d1fafadc4a", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", + "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "hgu133plus2.annotation.tsv:md5,f2b82ef12b2a2e8e575de06766583d96", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", + "phenotype_uninvolved_lesional.limma.results.tsv:md5,e43b6cf510173d64dd055fe7c32f4f1b", + "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,113a52d0921a4b2e1a5dfc40ff55d69d", "GSM1229341_Gudjohnsson_001_6690_PP.CEL.gz:md5,259d0908211a071351450f366fd51cad", "GSM1229342_Gudjohnsson_002_6690_PN.CEL.gz:md5,31cc2b8b26e210760b8ebd4b304b52ba", "GSM1229343_Gudjohnsson_003_7450_PN.CEL.gz:md5,713a3ca75a883cbff6da0be7bd251422", @@ -232,8 +241,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:11:49.515049379" + "timestamp": "2025-01-30T14:11:41.297398143" } } diff --git a/tests/test_maxquant.nf.test.snap b/tests/test_maxquant.nf.test.snap index 0ce04c06..e6b6edb7 100644 --- a/tests/test_maxquant.nf.test.snap +++ b/tests/test_maxquant.nf.test.snap @@ -114,10 +114,10 @@ "tables/proteus/fakeBatch/raw_proteingroups_tab.tsv" ], [ - "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", - "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", - "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", - "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", + "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,06dc7f513f2d8c32b74754a34a82511f", + "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,063e03020c4461c43611ae887b0af591", + "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,baec22325178aa8583d25fae298761f0", + "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,a722daabe7240a7c60f2aadc47fe9d07", "normalizeMedian.normalized_proteingroups.rds:md5,da660b225f066a1e87bf8bb4196adcc6", "raw_proteingroups.rds:md5,0b38726c41e7b32213e5e15380c29612", "R_sessionInfo.log:md5,411badddf7904da0ed1de02b544109d2", @@ -153,14 +153,14 @@ "genotype_celltype_t1_FoB.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", "genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", "genotype_celltype_t1_t2.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", - "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", - "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", - "genotype_celltype_t1_FoB.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", - "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", - "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", - "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", - "genotype_celltype_t1_t2.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", - "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", + "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,df6496258f897bbc3b330c65b0a0b8e1", + "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,5673ee07e8f3fc78ed5e8bd697e56df9", + "genotype_celltype_t1_FoB.limma.results.tsv:md5,18d66f347bb7db2653e0b65b4d8725c2", + "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,0c4ec69fa9f37813e838b611f4f9763c", + "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,9e9cf523fb6365eabfed787c6afc9d00", + "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,861dc54d2255426700d69c64824b62e8", + "genotype_celltype_t1_t2.limma.results.tsv:md5,a8f6f4c30cd2d9e1124d271d74c835aa", + "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,c7f25fdf44268a7bc5bd3dd530491b07", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", "raw_proteingroups_tab.tsv:md5,33a8791f84c676ea1aea4842231acb6a", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", @@ -169,8 +169,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:13:14.296845013" + "timestamp": "2025-01-30T12:42:30.12118941" } -} +} \ No newline at end of file diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index a1907f19..340dc333 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -70,9 +70,9 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", + "treatment_mCherry_hND6_.dds.rld.rds:md5,a02d9865901a10502b23b5c7d0519647", "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,ca190ae16afb2d9fcd5ffca235a97f4f", "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", "volcano.png:md5,db4fda5e682a1659af157c11985d0783", "volcano.png:md5,396facf5c1dbe8b445e3360e6280f9c1", @@ -88,18 +88,18 @@ "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b7fb6767324a12330ea98db8c361f36a", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,4f4bf48b354616354137435adfac7a35", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,c33a777473ec045ba11238c6bfdf962e", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,0e2f7cc47db20df9473f3a593e218101", "all.normalised_counts.tsv:md5,e960aa685547a3ea778523da84fae136", - "all.vst.tsv:md5,ea4e437ee57b2c5ef8c19d427656e3c6" + "all.vst.tsv:md5,1567f0aa91af3ffb3be575d17ee69a07" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:14:39.706638148" + "timestamp": "2025-01-30T12:36:29.433646372" } -} +} \ No newline at end of file From 63bb6505428c409fe34e01640080cdeebdc5e265 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Thu, 30 Jan 2025 14:19:05 +0000 Subject: [PATCH 18/29] [test] update test snapshots - from singularity to docker --- tests/test.nf.test.snap | 34 ++++++++++++++-------------- tests/test_affy.nf.test.snap | 10 ++++---- tests/test_maxquant.nf.test.snap | 26 ++++++++++----------- tests/test_nogtf.nf.test.snap | 18 +++++++-------- tests/test_rnaseq_limma.nf.test.snap | 12 +++++----- tests/test_soft.nf.test.snap | 10 ++++---- 6 files changed, 55 insertions(+), 55 deletions(-) diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index 0e5fdafa..e3acd46b 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -144,9 +144,9 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,075109c16a43620545ba483c081fba8d", + "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,096f7c592e3c5185e4cd5f4caf7f8238", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "volcano.png:md5,32d82a790e028f9476972a7f38190430", "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", @@ -185,20 +185,20 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,fec8c9babd831dc44a5ac8846db1fb2c", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,d2602eca12d05287769d0ff241c9d671", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2cd12a185557e1535b65275a98bc122b", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,9c7dfa0be563949d4df99a106d3b0d7f", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b40bd97367cce0fc3926a722136bd936", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,b5560b6ccd18f09cb514d0b328448e0a", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,00303655a04cc0b3671932d6cb5011dc", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,08f3bb3a6c6abcd27c096f12c15c974c", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", - "all.vst.tsv:md5,84357a35058e119a94d20bc0bd391fde" + "all.vst.tsv:md5,2fa9f1008e3536b049ca69d48bbe8fbd" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:24:51.307694" + "timestamp": "2025-01-30T13:44:35.158109284" }, "Test profile - yml contrasts": { "content": [ @@ -345,9 +345,9 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,075109c16a43620545ba483c081fba8d", + "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,096f7c592e3c5185e4cd5f4caf7f8238", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "volcano.png:md5,32d82a790e028f9476972a7f38190430", "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", @@ -386,19 +386,19 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,fec8c9babd831dc44a5ac8846db1fb2c", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,d2602eca12d05287769d0ff241c9d671", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2cd12a185557e1535b65275a98bc122b", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,9c7dfa0be563949d4df99a106d3b0d7f", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b40bd97367cce0fc3926a722136bd936", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,b5560b6ccd18f09cb514d0b328448e0a", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,00303655a04cc0b3671932d6cb5011dc", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,08f3bb3a6c6abcd27c096f12c15c974c", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", - "all.vst.tsv:md5,84357a35058e119a94d20bc0bd391fde" + "all.vst.tsv:md5,2fa9f1008e3536b049ca69d48bbe8fbd" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:19:58.909453" + "timestamp": "2025-01-30T13:40:55.580181476" } -} +} \ No newline at end of file diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index 663f0e7e..3ee5ca78 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -175,7 +175,7 @@ ], [ "raw._eset.rds:md5,8c6c7807ce6c5d8204bd681b941eeb0f", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,3a3200070f436f00147284521a44068c", + "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", "volcano.png:md5,d4381dd34786c58e25b8e4ed1fa8bf26", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", "boxplot.png:md5,552c6cf37521fae8170368e3adb4da80", @@ -227,8 +227,8 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "hgu133plus2.annotation.tsv:md5,f2b82ef12b2a2e8e575de06766583d96", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,e43b6cf510173d64dd055fe7c32f4f1b", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,113a52d0921a4b2e1a5dfc40ff55d69d", + "phenotype_uninvolved_lesional.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", + "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", "GSM1229341_Gudjohnsson_001_6690_PP.CEL.gz:md5,259d0908211a071351450f366fd51cad", "GSM1229342_Gudjohnsson_002_6690_PN.CEL.gz:md5,31cc2b8b26e210760b8ebd4b304b52ba", "GSM1229343_Gudjohnsson_003_7450_PN.CEL.gz:md5,713a3ca75a883cbff6da0be7bd251422", @@ -243,6 +243,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T14:11:41.297398143" + "timestamp": "2025-01-30T14:16:48.032845231" } -} +} \ No newline at end of file diff --git a/tests/test_maxquant.nf.test.snap b/tests/test_maxquant.nf.test.snap index e6b6edb7..392a03c9 100644 --- a/tests/test_maxquant.nf.test.snap +++ b/tests/test_maxquant.nf.test.snap @@ -114,10 +114,10 @@ "tables/proteus/fakeBatch/raw_proteingroups_tab.tsv" ], [ - "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,06dc7f513f2d8c32b74754a34a82511f", - "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,063e03020c4461c43611ae887b0af591", - "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,baec22325178aa8583d25fae298761f0", - "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,a722daabe7240a7c60f2aadc47fe9d07", + "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", + "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", + "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", + "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", "normalizeMedian.normalized_proteingroups.rds:md5,da660b225f066a1e87bf8bb4196adcc6", "raw_proteingroups.rds:md5,0b38726c41e7b32213e5e15380c29612", "R_sessionInfo.log:md5,411badddf7904da0ed1de02b544109d2", @@ -153,14 +153,14 @@ "genotype_celltype_t1_FoB.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", "genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", "genotype_celltype_t1_t2.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", - "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,df6496258f897bbc3b330c65b0a0b8e1", - "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,5673ee07e8f3fc78ed5e8bd697e56df9", - "genotype_celltype_t1_FoB.limma.results.tsv:md5,18d66f347bb7db2653e0b65b4d8725c2", - "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,0c4ec69fa9f37813e838b611f4f9763c", - "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,9e9cf523fb6365eabfed787c6afc9d00", - "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,861dc54d2255426700d69c64824b62e8", - "genotype_celltype_t1_t2.limma.results.tsv:md5,a8f6f4c30cd2d9e1124d271d74c835aa", - "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,c7f25fdf44268a7bc5bd3dd530491b07", + "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", + "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", + "genotype_celltype_t1_FoB.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", + "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", + "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", + "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", + "genotype_celltype_t1_t2.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", + "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", "raw_proteingroups_tab.tsv:md5,33a8791f84c676ea1aea4842231acb6a", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", @@ -171,6 +171,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:42:30.12118941" + "timestamp": "2025-01-30T14:02:26.455693403" } } \ No newline at end of file diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index 340dc333..c7d30945 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -70,9 +70,9 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,a02d9865901a10502b23b5c7d0519647", + "treatment_mCherry_hND6_.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,ca190ae16afb2d9fcd5ffca235a97f4f", + "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", "volcano.png:md5,db4fda5e682a1659af157c11985d0783", "volcano.png:md5,396facf5c1dbe8b445e3360e6280f9c1", @@ -88,18 +88,18 @@ "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b7fb6767324a12330ea98db8c361f36a", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,4f4bf48b354616354137435adfac7a35", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,c33a777473ec045ba11238c6bfdf962e", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,0e2f7cc47db20df9473f3a593e218101", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,4726dd3c33edce84d6356079c578bbd4", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,5c23f53046190eabce927cc968abed34", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,119c986fd9235ae6a6c88ed1dd4d0a3d", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,6d969a3049ba16f8f12fc8abeb2b9899", "all.normalised_counts.tsv:md5,e960aa685547a3ea778523da84fae136", - "all.vst.tsv:md5,1567f0aa91af3ffb3be575d17ee69a07" + "all.vst.tsv:md5,8e19361180daa5a68de6f099b9093a8c" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:36:29.433646372" + "timestamp": "2025-01-30T13:58:44.996978342" } -} \ No newline at end of file +} diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap index 00914591..2aa495e5 100644 --- a/tests/test_rnaseq_limma.nf.test.snap +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -136,8 +136,8 @@ "tables/processed_abundance/all.normalised_counts.tsv" ], [ - "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,ff9b67869ea73d2daedd6ec47fcb6605", - "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,4e2aab8c2cf6faf3536e50a2fcb01a24", + "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", + "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", @@ -173,9 +173,9 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.limma.results.tsv:md5,4fae1cce0e7990a70376fe28622b8815", + "treatment_mCherry_hND6_.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", "treatment_mCherry_hND6_.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", - "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,4ec1aebed20630563d4f88a717622e92", + "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", "all.normalised_counts.tsv:md5,7510c89d6665176d5026b7af0a64344d" ] @@ -184,6 +184,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:23:30.214338409" + "timestamp": "2025-01-30T13:55:44.270128379" } -} +} \ No newline at end of file diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap index 80f4a4f2..f0f94ef2 100644 --- a/tests/test_soft.nf.test.snap +++ b/tests/test_soft.nf.test.snap @@ -69,7 +69,7 @@ ], [ "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,f3c8693c221002f6aaeaa89bc74d19b4", + "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", @@ -83,8 +83,8 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,7227ed999a410a99db2a14252cbe57e4", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,d67c10dc2ac99d5b94f56a70f00faa4e", + "phenotype_uninvolved_lesional.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", + "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", "normalised.matrix.tsv:md5,230f87f91c0c1a7e2ab354200c4b978c" ] ], @@ -92,6 +92,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T12:20:04.803269" + "timestamp": "2025-01-30T13:53:09.212530448" } -} +} \ No newline at end of file From b96540f4aa8144e0723fec9cfeac4bcd7b0b2658 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Fri, 31 Jan 2025 10:53:25 +0000 Subject: [PATCH 19/29] [modules] revert deseq2 modules into the version originally installed in the pipeline - to avoid test snapshots inconsistencies related to decimal handling --- modules.json | 4 +- .../deseq2/differential/environment.yml | 2 + modules/nf-core/deseq2/differential/main.nf | 19 +- modules/nf-core/deseq2/differential/meta.yml | 231 +-- .../{deseq2_differential.R => deseq_de.R} | 94 +- .../tests/contrasts_matrix.config | 5 - .../contrasts_matrix_exclude_samples.config | 5 - .../tests/contrasts_matrix_noblocking.config | 10 - .../tests/contrasts_matrix_spikes.config | 5 - ...contrasts_matrix_subset_to_contrast.config | 5 - .../tests/contrasts_matrix_vst_nsub.config | 5 - .../deseq2/differential/tests/main.nf.test | 499 ------ .../differential/tests/main.nf.test.snap | 1480 ----------------- .../deseq2/differential/tests/tags.yml | 2 - tests/test.nf.test.snap | 26 +- tests/test_nogtf.nf.test.snap | 12 +- 16 files changed, 156 insertions(+), 2248 deletions(-) rename modules/nf-core/deseq2/differential/templates/{deseq2_differential.R => deseq_de.R} (89%) delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix.config delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config delete mode 100644 modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config delete mode 100644 modules/nf-core/deseq2/differential/tests/main.nf.test delete mode 100644 modules/nf-core/deseq2/differential/tests/main.nf.test.snap delete mode 100644 modules/nf-core/deseq2/differential/tests/tags.yml diff --git a/modules.json b/modules.json index 6c783c7c..40885b27 100644 --- a/modules.json +++ b/modules.json @@ -42,8 +42,8 @@ }, "deseq2/differential": { "branch": "master", - "git_sha": "c038be5b58c111787d2fab1c4376085923a52b1b", - "installed_by": ["abundance_differential_filter", "modules"] + "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", + "installed_by": ["modules"] }, "geoquery/getgeo": { "branch": "master", diff --git a/modules/nf-core/deseq2/differential/environment.yml b/modules/nf-core/deseq2/differential/environment.yml index 4f0b1d10..0ab1d0b6 100644 --- a/modules/nf-core/deseq2/differential/environment.yml +++ b/modules/nf-core/deseq2/differential/environment.yml @@ -1,5 +1,7 @@ +name: deseq2_differential channels: - conda-forge - bioconda + - defaults dependencies: - bioconda::bioconductor-deseq2=1.34.0 diff --git a/modules/nf-core/deseq2/differential/main.nf b/modules/nf-core/deseq2/differential/main.nf index c76187b5..ab7bc06a 100644 --- a/modules/nf-core/deseq2/differential/main.nf +++ b/modules/nf-core/deseq2/differential/main.nf @@ -29,22 +29,5 @@ process DESEQ2_DIFFERENTIAL { task.ext.when == null || task.ext.when script: - template 'deseq2_differential.R' - - stub: - """ - touch ${meta.id}.deseq2.results.tsv - touch ${meta.id}.deseq2.dispersion.png - touch ${meta.id}.dds.rld.rds - touch ${meta.id}.deseq2.sizefactors.tsv - touch ${meta.id}.normalised_counts.tsv - touch ${meta.id}.rlog.tsv - touch ${meta.id}.deseq2.model.txt - touch ${meta.id}.R_sessionInfo.log - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") - END_VERSIONS - """ + template 'deseq_de.R' } diff --git a/modules/nf-core/deseq2/differential/meta.yml b/modules/nf-core/deseq2/differential/meta.yml index be8cec47..2b3e33b5 100644 --- a/modules/nf-core/deseq2/differential/meta.yml +++ b/modules/nf-core/deseq2/differential/meta.yml @@ -7,167 +7,102 @@ keywords: - deseq2 tools: - "deseq2": - description: "Differential gene expression analysis based on the negative binomial - distribution" + description: "Differential gene expression analysis based on the negative binomial distribution" homepage: "https://bioconductor.org/packages/release/bioc/html/DESeq2.html" documentation: "https://bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html" tool_dev_url: "https://github.com/mikelove/DESeq2" doi: "10.1186/s13059-014-0550-8" licence: ["LGPL >=3"] - identifier: biotools:deseq2 input: - - - meta: - type: map - description: | - Groovy Map containing contrast information. This can be used at the - workflow level to pass optional parameters to the module, e.g. - [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: - '--blocking_variable $meta.blocking'. - - contrast_variable: - type: string - description: | - The column in the sample sheet that should be used to define groups for - comparison - - reference: - type: string - description: | - The value within the contrast_variable column of the sample sheet that - should be used to derive the reference samples - - target: - type: string - description: | - The value within the contrast_variable column of the sample sheet that - should be used to derive the target samples - - - meta2: - type: map - description: | - Groovy map containing study-wide metadata related to the sample sheet - and matrix - - samplesheet: - type: file - description: | - CSV or TSV format sample sheet with sample metadata - - counts: - type: file - description: | - Raw TSV or CSV format expression matrix as output from the nf-core - RNA-seq workflow - - - meta3: - type: file - description: | - Meta map describing control genes, e.g. [ id: 'ERCC' ] - - control_genes_file: - type: file - description: | - Text file listing control genes, one per line - - - meta4: - type: map - description: | - Groovy map containing study-wide metadata related to the transcript - lengths file - - transcript_lengths_file: - type: file - description: | - Optional file of transcript lengths, with the same sample columns as - counts. If supplied, lengths will be supplied to DESeq2 to correct for - differences in average transcript lengths across samples. + - meta: + type: map + description: | + Groovy Map containing contrast information. This can be used at the + workflow level to pass optional parameters to the module, e.g. + [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: + '--blocking_variable $meta.blocking'. + - contrast_variable: + type: string + description: | + The column in the sample sheet that should be used to define groups for + comparison + - reference: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the reference samples + - target: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the target samples + - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the sample sheet + and matrix + - samplesheet: + type: file + description: | + CSV or TSV format sample sheet with sample metadata + - counts: + type: file + description: | + Raw TSV or CSV format expression matrix as output from the nf-core + RNA-seq workflow + - meta3: + type: file + description: | + Meta map describing control genes, e.g. [ id: 'ERCC' ] + - control_genes_file: + type: file + description: | + Text file listing control genes, one per line + - meta4: + type: map + description: | + Groovy map containing study-wide metadata related to the transcript + lengths file + - transcript_lengths_file: + type: file + description: | + Optional file of transcript lengths, with the same sample columns as + counts. If supplied, lengths will be supplied to DESeq2 to correct for + differences in average transcript lengths across samples. + output: - results: - - meta: - type: file - description: TSV-format table of differential expression information as output - by DESeq2 - pattern: "deseq2.results.tsv" - - "*.deseq2.results.tsv": - type: file - description: TSV-format table of differential expression information as output - by DESeq2 - pattern: "deseq2.results.tsv" + type: file + description: TSV-format table of differential expression information as output by DESeq2 + pattern: "deseq2.results.tsv" - dispersion_plot: - - meta: - type: file - description: DESeq2 dispersion plot - pattern: "deseq2.dispersion.png" - - "*.deseq2.dispersion.png": - type: file - description: DESeq2 dispersion plot - pattern: "deseq2.dispersion.png" + type: file + description: DESeq2 dispersion plot + pattern: "deseq2.dispersion.png" - rdata: - - meta: - type: file - description: Serialised DESeq2 object - pattern: "dds.rld.rds" - - "*.dds.rld.rds": - type: file - description: Serialised DESeq2 object - pattern: "dds.rld.rds" - - size_factors: - - meta: - type: file - description: Size factors - pattern: "deseq2.sizefactors.tsv" - - "*.deseq2.sizefactors.tsv": - type: file - description: Size factors - pattern: "deseq2.sizefactors.tsv" + type: file + description: Serialised DESeq2 object + pattern: "dds.rld.rds" + - sizefactors: + type: file + description: Size factors + pattern: "deseq2.sizefactors.tsv" - normalised_counts: - - meta: - type: file - description: TSV-format counts matrix, normalised to size factors - pattern: "normalised_counts.tsv" - - "*.normalised_counts.tsv": - type: file - description: TSV-format counts matrix, normalised to size factors - pattern: "normalised_counts.tsv" - - rlog_counts: - - meta: - type: file - description: | - Optional, TSV-format counts matrix, normalised to size factors, with - variance stabilisation applied via `rlog()`. - pattern: "rlog.tsv" - - "*.rlog.tsv": - type: file - description: | - Optional, TSV-format counts matrix, normalised to size factors, with - variance stabilisation applied via `rlog()`. - pattern: "rlog.tsv" - - vst_counts: - - meta: - type: file - description: | - Optional, TSV-format counts matrix, normalised to size factors, with - variance stabilisation applied via `vst()`. - pattern: "vst_counts.tsv" - - "*.vst.tsv": - type: file - description: | - Optional, TSV-format counts matrix, normalised to size factors, with - variance stabilisation applied via `vst()`. - pattern: "vst_counts.tsv" + type: file + description: TSV-format counts matrix, normalised to size factors + pattern: "normalised_counts.tsv" + - variance_stabilised_counts: + type: file + description: TSV-format counts matrix, normalised to size factors, with variance stabilisation applied + pattern: "variance_stabilised_counts.tsv" - model: - - meta: - type: file - description: TXT-format DESeq2 model - pattern: "deseq2.model.tsv" - - "*.deseq2.model.txt": - type: file - description: TXT-format DESeq2 model - pattern: "deseq2.model.tsv" - - session_info: - - meta: - type: file - description: dump of R SessionInfo - pattern: "*.log" - - "*.R_sessionInfo.log": - type: file - description: dump of R SessionInfo - pattern: "*.log" + type: file + description: TXT-format DESeq2 model + pattern: "deseq2.model.tsv" - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@pinin4fjords" maintainers: diff --git a/modules/nf-core/deseq2/differential/templates/deseq2_differential.R b/modules/nf-core/deseq2/differential/templates/deseq_de.R similarity index 89% rename from modules/nf-core/deseq2/differential/templates/deseq2_differential.R rename to modules/nf-core/deseq2/differential/templates/deseq_de.R index b10618ed..a1b3abca 100755 --- a/modules/nf-core/deseq2/differential/templates/deseq2_differential.R +++ b/modules/nf-core/deseq2/differential/templates/deseq_de.R @@ -68,6 +68,34 @@ read_delim_flexible <- function(file, header = TRUE, row.names = NULL, check.nam ) } +#' Round numeric dataframe columns to fixed decimal places by applying +#' formatting and converting back to numerics +#' +#' @param dataframe A data frame +#' @param columns Which columns to round (assumes all of them by default) +#' @param digits How many decimal places to round to? +#' +#' @return output Data frame + +round_dataframe_columns <- function(df, columns = NULL, digits = 8){ + if (is.null(columns)){ + columns <- colnames(df) + } + + df[,columns] <- format( + data.frame(df[, columns], check.names = FALSE), + nsmall = digits + ) + + # Convert columns back to numeric + + for (c in columns) { + df[[c]][grep("^ *NA\$", df[[c]])] <- NA + df[[c]] <- as.numeric(df[[c]]) + } + df +} + ################################################ ################################################ ## PARSE PARAMETERS FROM NEXTFLOW ## @@ -111,8 +139,7 @@ opt <- list( shrink_lfc = TRUE, cores = 1, vs_blind = TRUE, - vst_nsub = 1000, - round_digits = NULL + vst_nsub = 1000 ) opt_types <- lapply(opt, class) @@ -131,9 +158,6 @@ for ( ao in names(args_opt)){ opt[[ao]] <- args_opt[[ao]] } } -if ( ! is.null(opt\$round_digits)){ - opt\$round_digits <- as.numeric(opt\$round_digits) -} # Check if required parameters have been provided @@ -394,20 +418,14 @@ cat("Saving results for ", contrast.name, " ...\n", sep = "") # Differential expression table- note very limited rounding for consistency of # results -if (! is.null(opt\$round_digits)){ - comp.results <- apply(data.frame(comp.results), 2, function(x) round(x, opt\$round_digits)) -} -comp.results <- `colnames<-`( - data.frame( - gene_id = rownames(comp.results), - comp.results, - check.names = FALSE - ), - c(opt\$gene_id_col, colnames(comp.results)) # Setting all column names +out_df <- cbind( + setNames(data.frame(rownames(comp.results)), opt\$gene_id_col), + round_dataframe_columns( + data.frame(comp.results[, !(colnames(comp.results) %in% opt\$gene_id_col)], check.names = FALSE) + ) ) - write.table( - comp.results, + out_df, file = paste(opt\$output_prefix, 'deseq2.results.tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -448,21 +466,12 @@ write.table( # Write specified matrices -normalised_matrix <- counts(dds, normalized = TRUE) -if (! is.null(opt\$round_digits)){ - normalised_matrix <- apply(normalised_matrix, 2, function(x) round(x, opt\$round_digits)) -} -normalised_matrix <- `colnames<-`( - data.frame( - gene_id = rownames(counts(dds)), # First column with row names from counts(dds) - normalised_matrix, # Other columns - check.names = FALSE - ), - c(opt\$gene_id_col, colnames(normalised_matrix)) # Setting all column names +out_df <- cbind( + setNames(data.frame(rownames(counts(dds))), opt\$gene_id_col), + data.frame(counts(dds, normalized = TRUE)[, !(colnames(counts(dds, normalized = TRUE)) %in% opt\$gene_id_col)], check.names = FALSE) ) - write.table( - normalised_matrix, + out_df, file = paste(opt\$output_prefix, 'normalised_counts.tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -474,26 +483,21 @@ write.table( for (vs_method_name in strsplit(opt\$vs_method, ',')){ if (vs_method_name == 'vst'){ - vs_mat <- assay(vst(dds, blind = opt\$vs_blind, nsub = opt\$vst_nsub)) + vs_mat <- vst(dds, blind = opt\$vs_blind, nsub = opt\$vst_nsub) }else if (vs_method_name == 'rlog'){ - vs_mat <- assay(rlog(dds, blind = opt\$vs_blind, fitType = opt\$fit_type)) + vs_mat <- rlog(dds, blind = opt\$vs_blind, fitType = opt\$fit_type) } - if (! is.null(opt\$round_digits)){ - vs_mat <- apply(vs_mat, 2, function(x) round(x, opt\$round_digits)) - } + # Again apply the slight rounding and then restore numeric - vs_mat <- `colnames<-`( - data.frame( - gene_id = rownames(counts(dds)), # First column with row names from counts(dds) - vs_mat, # Other columns from vs_mat - check.names = FALSE - ), - c(opt\$gene_id_col, colnames(vs_mat)) # Setting all column names + out_df <- cbind( + setNames(data.frame(rownames(counts(dds))), opt\$gene_id_col), + round_dataframe_columns( + data.frame(assay(vs_mat)[, !(colnames(assay(vs_mat)) %in% opt\$gene_id_col)], check.names = FALSE) + ) ) - write.table( - vs_mat, + out_df, file = paste(opt\$output_prefix, vs_method_name, 'tsv', sep = '.'), col.names = TRUE, row.names = FALSE, @@ -522,7 +526,7 @@ sink() ################################################ ################################################ -r.version <- paste(R.version[['major']],R.version[['minor']], sep = ".") +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] deseq2.version <- as.character(packageVersion('DESeq2')) writeLines( diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config deleted file mode 100644 index 0e4e63a1..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method rlog" } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config deleted file mode 100644 index bd62f1d7..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_exclude_samples.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { "--round_digits 4 --blocking_variables $meta.blocking --vs_method rlog --exclude_samples_col sample_number --exclude_samples_values sample1" } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config deleted file mode 100644 index 77565bca..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_noblocking.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { - [ - ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), - "--vs_method rlog --round_digits 5" - ].join(' ').trim() - } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config deleted file mode 100644 index 5ecf98b0..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_spikes.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { "--round_digits 5 --sizefactors_from_controls TRUE --blocking_variables $meta.blocking --vs_method rlog" } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config deleted file mode 100644 index 183b37c2..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_subset_to_contrast.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method rlog --subset_to_contrast_samples TRUE" } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config b/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config deleted file mode 100644 index eb7010dd..00000000 --- a/modules/nf-core/deseq2/differential/tests/contrasts_matrix_vst_nsub.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'DESEQ2_DIFFERENTIAL' { - ext.args = { "--round_digits 5 --blocking_variables $meta.blocking --vs_method vst --vst_nsub 500" } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/main.nf.test b/modules/nf-core/deseq2/differential/tests/main.nf.test deleted file mode 100644 index 370f05dc..00000000 --- a/modules/nf-core/deseq2/differential/tests/main.nf.test +++ /dev/null @@ -1,499 +0,0 @@ -nextflow_process { - - name "Test Process DESEQ2_DIFFERENTIAL" - script "../main.nf" - process "DESEQ2_DIFFERENTIAL" - - tag "modules" - tag "modules_nfcore" - tag "deseq2" - tag "deseq2/differential" - - test("mouse - contrasts - matrix") { - - config './contrasts_matrix.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - lengths") { - - config './contrasts_matrix.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_lengths = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.spoofed_lengths.tsv', checkIfExists: true) - ] - - ch_spikes = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - - } - - test("mouse - contrasts - matrix - no blocking") { - - config './contrasts_matrix_noblocking.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - spikes") { - - config './contrasts_matrix_spikes.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [ - ['id':'ERCC'], - file(expression_test_data_dir + 'SRP254919.spikes.tsv', checkIfExists: true) - ] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - strip spikes") { - - config './contrasts_matrix.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [ - ['id':'ERCC'], - file(expression_test_data_dir + 'SRP254919.spikes.tsv', checkIfExists: true) - ] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - csv") { - - config './contrasts_matrix.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - - // Convert the matrix to a CSV first - ch_matrix = Channel.fromPath(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv') - .splitCsv(header: false) - .map{ - it.join('\t') - } - .collectFile(name: 'test.tsv', newLine: true, sort: false) - .map{ - [ [ id:'test'], file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), it] - } - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - vst nsub") { - - config './contrasts_matrix_vst_nsub.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - subset to contrast") { - - config './contrasts_matrix_subset_to_contrast.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - - test("mouse - contrasts - matrix - exclude samples") { - - config './contrasts_matrix_exclude_samples.config' - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.results, - process.out.size_factors, - process.out.normalised_counts, - process.out.rlog_counts, - process.out.vst_counts, - process.out.model, - process.out.versions, - file(process.out.dispersion_plot[0][1]).name, - file(process.out.rdata[0][1]).name - ).match() }, - { assert path(process.out.session_info[0][1]).text.contains("DESeq2_1.34.0") } - ) - } - } - test("mouse - contrasts - matrix - stub") { - - config './contrasts_matrix.config' - - options "-stub" - - when { - process { - """ - expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' - - ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) - .splitCsv ( header:true, sep:',' ) - .map{ - tuple(it, it.variable, it.reference, it.target) - } - ch_matrix = [ - [id: 'test'], - file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), - file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) - ] - ch_spikes = [[],[]] - ch_lengths = [[],[]] - - input[0] = ch_contrasts - input[1] = ch_matrix - input[2] = ch_spikes - input[3] = ch_lengths - """ - } - } - then { - assertAll( - { assert process.success }, - { assert snapshot( process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/deseq2/differential/tests/main.nf.test.snap b/modules/nf-core/deseq2/differential/tests/main.nf.test.snap deleted file mode 100644 index 84f14f20..00000000 --- a/modules/nf-core/deseq2/differential/tests/main.nf.test.snap +++ /dev/null @@ -1,1480 +0,0 @@ -{ - "mouse - contrasts - matrix - no blocking": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:52:40.049829142" - }, - "mouse - contrasts - matrix": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:51:18.087544733" - }, - "mouse - contrasts - matrix - exclude samples": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,7d28d65b7ab94306c1328027a6531405" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,f509c2de7d6935942eff594a0aca662e" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,87d6d634ffea2d7a9df9f9bae91b4d90" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,87d6d634ffea2d7a9df9f9bae91b4d90" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,90327e9bfc3bbafb96e11b13b3cd5e19" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,90327e9bfc3bbafb96e11b13b3cd5e19" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,c500bcad14f845113f85610d1ebf643c" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,c500bcad14f845113f85610d1ebf643c" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:55:36.950512426" - }, - "mouse - contrasts - matrix - lengths": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,944176b73455aa7c8de3ec32c03edef6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,6a9bc76c9d54034c90fa159372f97516" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,69183b94202a806067962d0df0b9875b" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,69183b94202a806067962d0df0b9875b" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:51:57.709209949" - }, - "mouse - contrasts - matrix - strip spikes": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,c4d269cace6dfe42e81e39d13b4b0354" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,e1820951d5d5c40fa7fd6368e8f62e8c" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,a526a1bb5cb270f5a4a1641fefd289b3" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,a526a1bb5cb270f5a4a1641fefd289b3" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,89c5922a30218a17ab6ee84e031f6a9b" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,89c5922a30218a17ab6ee84e031f6a9b" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,4b4526ddcca010f5c75f841b2cef269f" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,4b4526ddcca010f5c75f841b2cef269f" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:53:41.239674151" - }, - "mouse - contrasts - matrix - subset to contrast": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:55:08.800966024" - }, - "mouse - contrasts - matrix - spikes": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,51ba90cf073d9d5f38ebb043d7e5b220" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,a04e2df3712d5be27e39c50f83319ec4" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,1708374146b4e8c28fbc78fa292102cd" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,1708374146b4e8c28fbc78fa292102cd" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,6f3af146a6f8fbb8f565dd66e79d2cb1" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,6f3af146a6f8fbb8f565dd66e79d2cb1" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,39df6fb2969afc009a602261e864238f" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,39df6fb2969afc009a602261e864238f" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:53:12.892137198" - }, - "mouse - contrasts - matrix - csv": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:54:07.676718521" - }, - "mouse - contrasts - matrix - vst nsub": { - "content": [ - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,6332f21889ecac387bb12eeb04f23849" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" - ] - ], - [ - - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.vst.tsv:md5,41c39026998bb5943e19b6012e750d89" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.vst.tsv:md5,41c39026998bb5943e19b6012e750d89" - ] - ], - [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" - ] - ], - [ - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e", - "versions.yml:md5,62c34d4f3d11c2bdbe2e4f7e6086b35e" - ], - "treatment_mCherry_hND6_.deseq2.dispersion.png", - "treatment_mCherry_hND6_.dds.rld.rds" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:54:37.008786139" - }, - "mouse - contrasts - matrix - stub": { - "content": [ - { - "0": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "6": [ - - ], - "7": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe", - "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe" - ], - "dispersion_plot": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "model": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "normalised_counts": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "rdata": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "results": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "rlog_counts": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "session_info": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "size_factors": [ - [ - { - "id": "treatment_mCherry_hND6_", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "" - }, - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - [ - { - "id": "treatment_mCherry_hND6_sample_number", - "variable": "treatment", - "reference": "mCherry", - "target": "hND6", - "blocking": "sample_number" - }, - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe", - "versions.yml:md5,2d67217d8adb1fa0d143b4017e6657fe" - ], - "vst_counts": [ - - ] - } - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-18T15:55:53.660457322" - } -} \ No newline at end of file diff --git a/modules/nf-core/deseq2/differential/tests/tags.yml b/modules/nf-core/deseq2/differential/tests/tags.yml deleted file mode 100644 index 8407e5c6..00000000 --- a/modules/nf-core/deseq2/differential/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -deseq2/differential: - - "modules/nf-core/deseq2/differential/**" diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index e3acd46b..f151dbf9 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -185,20 +185,20 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b40bd97367cce0fc3926a722136bd936", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,b5560b6ccd18f09cb514d0b328448e0a", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,00303655a04cc0b3671932d6cb5011dc", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,08f3bb3a6c6abcd27c096f12c15c974c", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", - "all.vst.tsv:md5,2fa9f1008e3536b049ca69d48bbe8fbd" + "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T13:44:35.158109284" + "timestamp": "2025-01-31T10:42:33.001429417" }, "Test profile - yml contrasts": { "content": [ @@ -386,19 +386,19 @@ "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,b40bd97367cce0fc3926a722136bd936", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,b5560b6ccd18f09cb514d0b328448e0a", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,00303655a04cc0b3671932d6cb5011dc", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,08f3bb3a6c6abcd27c096f12c15c974c", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", - "all.vst.tsv:md5,2fa9f1008e3536b049ca69d48bbe8fbd" + "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T13:40:55.580181476" + "timestamp": "2025-01-31T10:39:32.981523099" } -} \ No newline at end of file +} diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index c7d30945..afa0aae4 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -88,18 +88,18 @@ "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,4726dd3c33edce84d6356079c578bbd4", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,5c23f53046190eabce927cc968abed34", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,119c986fd9235ae6a6c88ed1dd4d0a3d", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,6d969a3049ba16f8f12fc8abeb2b9899", + "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", + "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", + "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", + "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", "all.normalised_counts.tsv:md5,e960aa685547a3ea778523da84fae136", - "all.vst.tsv:md5,8e19361180daa5a68de6f099b9093a8c" + "all.vst.tsv:md5,ea4e437ee57b2c5ef8c19d427656e3c6" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T13:58:44.996978342" + "timestamp": "2025-01-31T10:50:58.957242958" } } From de82c1392cdc61a0d1202fbea16c249d929980f8 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Fri, 31 Jan 2025 13:42:40 +0000 Subject: [PATCH 20/29] [feature] update differential subworkflow and pipeline for a common variance_stabilised_matrix channel. Also fixed the code in the pipeline to properly handle it --- .../abundance_differential_filter/main.nf | 15 +++++- workflows/differentialabundance.nf | 49 +++++++++---------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf index 7bef0255..88cbbec4 100644 --- a/subworkflows/nf-core/abundance_differential_filter/main.nf +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -125,6 +125,18 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { ch_model = DESEQ2_DIFFERENTIAL.out.model .mix(LIMMA_DIFFERENTIAL.out.model) + ch_variance_stabilised_matrix = DESEQ2_NORM.out.rlog_counts.ifEmpty([[],[]]) + .combine(DESEQ2_NORM.out.vst_counts.ifEmpty([[],[]])) + .map { meta_rlog, rlog, meta_vst, vst -> + if (meta_rlog == meta_vst && meta_rlog != []) { + return [meta_rlog, [rlog, vst]] + } else if (meta_rlog != [] && meta_vst == []) { + return [meta_rlog, [rlog]] + } else if (meta_rlog == [] && meta_vst != []) { + return [meta_vst, [vst]] + } + } + ch_versions = DESEQ2_DIFFERENTIAL.out.versions .mix(LIMMA_DIFFERENTIAL.out.versions) .mix(PROPR_PROPD.out.versions) @@ -180,8 +192,7 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { // other normalised_matrix = ch_normalised_matrix - rlog_counts = DESEQ2_NORM.out.rlog_counts - vst_counts = DESEQ2_NORM.out.vst_counts + variance_stabilised_matrix = ch_variance_stabilised_matrix model = ch_model versions = ch_versions } diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index df79f5fc..a8a61395 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -161,11 +161,15 @@ include { DIFFERENTIAL_FUNCTIONAL_ENRICHMENT } from '../subworkfl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -def replace_meta_method_id (channel, new_id) { +def replace_meta_method_id (channel, new_id, only_one=true) { return channel.map { it -> def meta = it[0] - ['method': it[0].method] meta[new_id] = it[0].method - [ meta, it[1..it.size()-1] ].flatten() + if (only_one) { + return [meta, it[1]] + } else { + return [ meta, it[1..it.size()-1] ].flatten() + } } } @@ -428,10 +432,9 @@ workflow DIFFERENTIALABUNDANCE { ch_differential_results = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise, 'method_differential') ch_differential_results_filtered = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered, 'method_differential') - ch_differential_norm = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix, 'method_differential') ch_differential_model = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.model, 'method_differential') - rlog_counts = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.rlog_counts.filter{ it != null}, 'method_differential') - vst_counts = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.vst_counts.filter{ it != null}, 'method_differential') + ch_differential_norm = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix, 'method_differential') + ch_differential_var = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.variance_stabilised_matrix.filter{ it != null}, 'method_differential') ch_versions = ch_versions .mix(ABUNDANCE_DIFFERENTIAL_FILTER.out.versions) @@ -477,7 +480,7 @@ workflow DIFFERENTIALABUNDANCE { // Prepare the results for downstream analysis - ch_gsea_results = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report, 'method_functional') + ch_gsea_results = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report, 'method_functional', false) gprofiler2_plot_html = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_plot_html, 'method_functional') gprofiler2_all_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_all_enrich, 'method_functional') gprofiler2_sub_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_sub_enrich, 'method_functional') @@ -501,35 +504,27 @@ workflow DIFFERENTIALABUNDANCE { // For geoquery we've done no matrix processing and been supplied with the // normalised matrix, which can be passed through to downstream analysis if (params.study_type == "geo_soft_file") { - ch_mat = ch_norm.combine( Channel.of([[],[],[]]) ) + ch_mat = ch_norm.map {meta, norm -> [meta, [norm]]} } else { - ch_processed_matrices = ch_norm - .combine( rlog_counts.ifEmpty([[],[]]) ) - .combine( vst_counts.ifEmpty([[],[]]) ) - .map { meta, norm, meta_rlog, rlog, meta_vst, vst -> - def matrices = [meta, norm] - if (meta_rlog == [] || meta == meta_rlog) matrices += [rlog] - if (meta_vst == [] || meta == meta_vst) matrices += [vst] - return matrices // meta, norm, rlog, vst - } - ch_mat = ch_raw.combine(ch_processed_matrices) - .map { meta_exp, raw, meta_norm, norm, rlog, vst -> - if (meta_norm.subMap(meta_exp.keySet()) == meta_exp) { - return [meta_norm, raw, norm, rlog, vst] - } + ch_mat = ch_raw + .combine(ch_norm) + .combine( ch_differential_var.ifEmpty([[],[]]) ) + .map { meta_exp, raw, meta_norm, norm, meta_var, matrices -> + def matrices_new = [raw, norm] + matrices + if ((meta_norm.subMap(meta_exp.keySet()) == meta_exp) && + (meta_var == [] || meta_norm == meta_var) + ) { + return [meta_norm, matrices_new] + } } } ch_all_matrices = VALIDATOR.out.sample_meta // meta, samples .join(VALIDATOR.out.feature_meta) // meta, samples, features .combine(ch_mat) - .map { meta_exp, samples, features, meta_mat, raw, norm, rlog, vst -> + .map { meta_exp, samples, features, meta_mat, matrices -> if (meta_mat.subMap(meta_exp.keySet()) == meta_exp) { - def processed_matrices = [raw] - if (norm != []) processed_matrices += [norm] - if (rlog != []) processed_matrices += [rlog] - if (vst != []) processed_matrices += [vst] - return [meta_mat, samples, features, processed_matrices] + return [meta_mat, samples, features, matrices] } } From 4f039eb5be1ce4b7afa78fc4bd9cef018f291502 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Fri, 31 Jan 2025 14:30:37 +0000 Subject: [PATCH 21/29] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 208a5d02..f5ddba47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [[#431](https://github.com/nf-core/differentialabundance/pull/431)] - Add differential and functional subworkflows. ([@suzannejin](https://github.com/suzannejin), co-authored by [@bjlang](https://github.com/bjlang) and [@caraiz2001](https://github.com/caraiz2001), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#421](https://github.com/nf-core/differentialabundance/pull/421)] - Add immunedeconv module ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#380](https://github.com/nf-core/differentialabundance/pull/380)] - Replace local filter_diff_table module with nf-core one, and create nf-tests for tabular_to_gsea_chip. ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Added software version check in nf-tests and gene biotype column check in `.Rmd` ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) @@ -32,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [[#431](https://github.com/nf-core/differentialabundance/pull/431)] - Replace the calls to differential and functional analysis modules by subworkflows. ([@suzannejin](https://github.com/suzannejin), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#410](https://github.com/nf-core/differentialabundance/pull/410)] - Update contrasts file format to allow yaml ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)). - [[#374](https://github.com/nf-core/differentialabundance/pull/374)] - Update all modules and subworkflows ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)). - [[#348](https://github.com/nf-core/differentialabundance/pull/348)] - Update test_full profile matrix file and indentation of profiles in nextflow.config ([@nschcolnicov](https://github.com/nschcolnicov), review by [@WackerO](https://github.com/WackerO) and [@pinin4fjords](https://github.com/pinin4fjords)) From 2b036591c4ac416e30e2316e1ff452f698eb8427 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 09:40:13 +0000 Subject: [PATCH 22/29] remove subset option from LIMMA_NORM and DESEQ2_NORM --- conf/modules.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e9e4ba34..9df3563b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -187,7 +187,6 @@ process { "--vst_nsub $params.deseq2_vst_nsub", "--shrink_lfc $params.deseq2_shrink_lfc", "--cores $params.deseq2_cores", - "--subset_to_contrast_samples $params.differential_subset_to_contrast_samples", ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), // TODO check what is the impact of blocking for NORM ].join(' ').trim() } } @@ -264,7 +263,6 @@ process { "--p.value ${params.limma_p_value}", "--lfc ${params.limma_lfc}", "--confint ${params.limma_confint}", - "--subset_to_contrast_samples $params.differential_subset_to_contrast_samples", "--use_voom \"${params.limma_use_voom}\"", ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), ].join(' ').trim() } From 2aefd3a4ff32f621e397cdb4e43bad6391a9f149 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 10:08:54 +0000 Subject: [PATCH 23/29] change(differentialabundance): simplify tools_differential and tools_functional declaration. Co-authored-by: Jonathan Manning --- workflows/differentialabundance.nf | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index a8a61395..28dbe8f4 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -79,28 +79,16 @@ if (run_gene_set_analysis) { } // Define tool channel -// For the moment, it allows a single combination of tools, but this will be changed with -// the toolsheet and introduction of multi-tool logic. -if (params.study_type == 'affy_array' || - params.study_type == 'geo_soft_file' || - params.study_type == 'maxquant' || - (params.study_type == 'rnaseq' && params.differential_use_limma) - ) { - tools_differential = ['method': 'limma'] - } else { - tools_differential = ['method': 'deseq2'] - } -tools_differential += [ - 'fc_threshold': params.differential_min_fold_change, - 'stat_threshold': params.differential_max_qval +tools_differential = [ + method : ((params.study_type in ['affy_array', 'geo_soft_file', 'maxquant']) || + (params.study_type == 'rnaseq' && params.differential_use_limma)) + ? 'limma' : 'deseq2', + fc_threshold : params.differential_min_fold_change, + stat_threshold: params.differential_max_qval ] -tools_functional = [] -if (params.gsea_run) { - tools_functional = ['method': 'gsea', 'input_type': 'norm'] -} -if (params.gprofiler2_run) { - tools_functional = ['method': 'gprofiler2', 'input_type': 'filtered'] -} +tools_functional = params.gprofiler2_run ? + [method: 'gprofiler2', input_type: 'filtered'] : + (params.gsea_run ? [method: 'gsea', input_type: 'norm'] : []) ch_tools = Channel.of([tools_differential, tools_functional]) // report related files From 022a8eaac1ff62f233892443c6e56458956e0b49 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 10:31:15 +0000 Subject: [PATCH 24/29] change(differentialabundance): use map criterias instead of meta method replacement function --- workflows/differentialabundance.nf | 49 ++++++++++++++++++------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 28dbe8f4..e8b9e04b 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -145,20 +145,29 @@ include { DIFFERENTIAL_FUNCTIONAL_ENRICHMENT } from '../subworkfl /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - DEFINE FUNCTIONS + DEFINE MAP CRITERIAS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -def replace_meta_method_id (channel, new_id, only_one=true) { - return channel.map { it -> - def meta = it[0] - ['method': it[0].method] - meta[new_id] = it[0].method - if (only_one) { - return [meta, it[1]] - } else { - return [ meta, it[1..it.size()-1] ].flatten() - } - } +// When running differential and functional subworkflows, the method used +// to produce a given output is stored in the metadata 'method'. +// To avoid metadata overlapping, these criterias are used to replace +// 'method' by 'method_differential' or 'method_functional' afterwards. + +def methodCriteriaDifferential = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_differential'] = it[0].method + return [meta, it[1]] +} +def methodCriteriaFunctional = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_functional'] = it[0].method + return [meta, it[1]] +} +def methodCriteriaFunctionalFlatten = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_functional'] = it[0].method + return [meta, it[1..it.size()-1]].flatten() } /* @@ -418,11 +427,11 @@ workflow DIFFERENTIALABUNDANCE { // collect differential results // meta.method would be replaced by meta.method_differential - ch_differential_results = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise, 'method_differential') - ch_differential_results_filtered = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered, 'method_differential') - ch_differential_model = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.model, 'method_differential') - ch_differential_norm = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix, 'method_differential') - ch_differential_var = replace_meta_method_id(ABUNDANCE_DIFFERENTIAL_FILTER.out.variance_stabilised_matrix.filter{ it != null}, 'method_differential') + ch_differential_results = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise.map(methodCriteriaDifferential) + ch_differential_results_filtered = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered.map(methodCriteriaDifferential) + ch_differential_model = ABUNDANCE_DIFFERENTIAL_FILTER.out.model.map(methodCriteriaDifferential) + ch_differential_norm = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix.map(methodCriteriaDifferential) + ch_differential_var = ABUNDANCE_DIFFERENTIAL_FILTER.out.variance_stabilised_matrix.filter{ it != null}.map(methodCriteriaDifferential) ch_versions = ch_versions .mix(ABUNDANCE_DIFFERENTIAL_FILTER.out.versions) @@ -468,10 +477,10 @@ workflow DIFFERENTIALABUNDANCE { // Prepare the results for downstream analysis - ch_gsea_results = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report, 'method_functional', false) - gprofiler2_plot_html = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_plot_html, 'method_functional') - gprofiler2_all_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_all_enrich, 'method_functional') - gprofiler2_sub_enrich = replace_meta_method_id(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_sub_enrich, 'method_functional') + ch_gsea_results = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report.map(methodCriteriaFunctionalFlatten) + gprofiler2_plot_html = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_plot_html.map(methodCriteriaFunctional) + gprofiler2_all_enrich = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_all_enrich.map(methodCriteriaFunctional) + gprofiler2_sub_enrich = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_sub_enrich.map(methodCriteriaFunctional) ch_versions = ch_versions .mix(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.versions) From e6d39414aabb41412dbc37e9369d647c822a1e2f Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 10:49:31 +0000 Subject: [PATCH 25/29] change(abundance_differential_filter): use groupTuple for ch_variance_stabilised_matrix --- .../nf-core/abundance_differential_filter/main.nf | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf index 88cbbec4..9010ae73 100644 --- a/subworkflows/nf-core/abundance_differential_filter/main.nf +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -126,16 +126,9 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { .mix(LIMMA_DIFFERENTIAL.out.model) ch_variance_stabilised_matrix = DESEQ2_NORM.out.rlog_counts.ifEmpty([[],[]]) - .combine(DESEQ2_NORM.out.vst_counts.ifEmpty([[],[]])) - .map { meta_rlog, rlog, meta_vst, vst -> - if (meta_rlog == meta_vst && meta_rlog != []) { - return [meta_rlog, [rlog, vst]] - } else if (meta_rlog != [] && meta_vst == []) { - return [meta_rlog, [rlog]] - } else if (meta_rlog == [] && meta_vst != []) { - return [meta_vst, [vst]] - } - } + .mix(DESEQ2_NORM.out.vst_counts.ifEmpty([[],[]])) + .groupTuple() + .filter{ meta, files -> meta != [] } ch_versions = DESEQ2_DIFFERENTIAL.out.versions .mix(LIMMA_DIFFERENTIAL.out.versions) From a7d03578e5ea35d4f72571a3a3889d3219401078 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 14:05:37 +0000 Subject: [PATCH 26/29] change(subworkflows and report): revert to mergeMaps in differential and functional subworkflows. Also fix issues encountered in rmarkdown file. And update test snapshots --- assets/differentialabundance_report.Rmd | 45 +- .../abundance_differential_filter/main.nf | 8 +- .../main.nf | 8 +- tests/test.nf.test.snap | 382 +++++++------- tests/test_affy.nf.test.snap | 487 +++++++++++++----- tests/test_maxquant.nf.test.snap | 90 ++-- tests/test_nogtf.nf.test.snap | 56 +- tests/test_rnaseq_limma.nf.test.snap | 182 +++---- tests/test_soft.nf.test.snap | 24 +- 9 files changed, 758 insertions(+), 524 deletions(-) diff --git a/assets/differentialabundance_report.Rmd b/assets/differentialabundance_report.Rmd index 3eb3379e..dc9283b5 100644 --- a/assets/differentialabundance_report.Rmd +++ b/assets/differentialabundance_report.Rmd @@ -367,7 +367,10 @@ if (is.null(differential_file_suffix)) { differential_file_suffix <- ifelse(params$study_type %in% c('rnaseq'), ".deseq2.results.tsv", ".limma.results.tsv") } differential_files <- lapply(contrasts$id, function(d){ - file.path(params$input_dir, paste0(gsub(' |;', '_', d), differential_file_suffix)) + file.path(params$input_dir, paste0(gsub(' |;', '_', d), '_', params$study_name, differential_file_suffix)) +}) +differential_names <- lapply(contrasts$id, function(d){ + paste0(gsub(' |;', '_', d), '_', params$study_name) }) # Initialize vector to store warning messages before merging tables @@ -428,7 +431,7 @@ results <- lapply(differential_files, function(diff_file) { differential_results <- lapply(results, `[[`, "diff_features") warnings_list <- unlist(lapply(results, `[[`, "warnings")) -names(differential_results) <- contrasts$id +names(differential_results) <- differential_names ``` @@ -978,8 +981,8 @@ if (any(unlist(params[paste0(possible_gene_set_methods, '_run')]))){ gmt_name <- basename(tools::file_path_sans_ext(gmt_file)) cat("\n##### ", gmt_name ," {.tabset}\n") - reference_gsea_tables <- paste0(contrasts$id, ".", gmt_name, '.gsea_report_for_', contrasts$reference, '.tsv') - target_gsea_tables <- paste0(contrasts$id, ".", gmt_name, '.gsea_report_for_', contrasts$target, '.tsv') + reference_gsea_tables <- paste0(differential_names, ".", gmt_name, '.gsea_report_for_', contrasts$reference, '.tsv') + target_gsea_tables <- paste0(differential_names, ".", gmt_name, '.gsea_report_for_', contrasts$target, '.tsv') for (i in 1:nrow(contrasts)){ cat("\n###### ", contrast_descriptions[i], "\n") target_gsea_results <- read_metadata(target_gsea_tables[i])[,c(-2,-3)] @@ -997,23 +1000,23 @@ if (any(unlist(params[paste0(possible_gene_set_methods, '_run')]))){ ifelse(params$gprofiler2_significant, paste0(" Enrichment was only considered if significant, i.e. adjusted p-value <= ", params$gprofiler2_max_qval, "."), "Enrichment was also considered if not significant."), "\n")) # Make sure to grab only non-empty files - for (i in 1:nrow(contrasts)) { - cat(paste0("\n##### ", contrasts$id[i], "\n")) - - table <- paste0(contrasts$id[i], ".gprofiler2.all_enriched_pathways.tsv") - table_path <- file.path(params$input_dir, table) - if (!file.exists(table_path) || file.size(table_path) == 0){ - cat(paste0("No ", ifelse(params$gprofiler2_significant, "significantly", ""), " enriched pathways were found for this contrast.")) - } else { - all_enriched <- read.table(table_path, header=T, sep="\t", quote="\"") - all_enriched <- data.frame("Pathway name" = all_enriched$term_name, "Pathway code" = all_enriched$term_id, - "Differential features" = all_enriched$intersection_size, "Pathway size" = all_enriched$term_size, - "Differential fraction" = (all_enriched$intersection_size/all_enriched$term_size), - "Adjusted p value" = all_enriched$p_value, check.names = FALSE) - all_enriched <- round_dataframe_columns(all_enriched, digits=params$report_round_digits) - print(htmltools::tagList(datatable(all_enriched, caption = paste('Enriched pathways in', contrasts$id[i], " (check", table, "for more detail)"), rownames = FALSE))) - } - cat("\n") + for (name in differential_names) { + cat(paste0("\n##### ", name, "\n")) + + table <- paste0(name, ".gprofiler2.all_enriched_pathways.tsv") + table_path <- file.path(params$input_dir, table) + if (!file.exists(table_path) || file.size(table_path) == 0){ + cat(paste0("No ", ifelse(params$gprofiler2_significant, "significantly", ""), " enriched pathways were found for this contrast.")) + } else { + all_enriched <- read.table(table_path, header=T, sep="\t", quote="\"") + all_enriched <- data.frame("Pathway name" = all_enriched$term_name, "Pathway code" = all_enriched$term_id, + "Differential features" = all_enriched$intersection_size, "Pathway size" = all_enriched$term_size, + "Differential fraction" = (all_enriched$intersection_size/all_enriched$term_size), + "Adjusted p value" = all_enriched$p_value, check.names = FALSE) + all_enriched <- round_dataframe_columns(all_enriched, digits=params$report_round_digits) + print(htmltools::tagList(datatable(all_enriched, caption = paste('Enriched pathways in', name, " (check", table, "for more detail)"), rownames = FALSE))) + } + cat("\n") } } } diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf index 9010ae73..d2617fb5 100644 --- a/subworkflows/nf-core/abundance_differential_filter/main.nf +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -9,6 +9,12 @@ include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../../../modules/nf-core/d include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../../../modules/nf-core/custom/filterdifferentialtable/main' +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} workflow ABUNDANCE_DIFFERENTIAL_FILTER { take: @@ -25,7 +31,7 @@ workflow ABUNDANCE_DIFFERENTIAL_FILTER { // Set up how the channels crossed below will be used to generate channels for processing def criteria = multiMapCriteria { meta_input, abundance, analysis_method, fc_threshold, stat_threshold, meta_exp, samplesheet, meta_contrasts, variable, reference, target -> - def meta_for_diff = meta_input + meta_contrasts + [ 'method': analysis_method ] + def meta_for_diff = mergeMaps(meta_contrasts, meta_input) + [ 'method': analysis_method ] def meta_input_new = meta_input + [ 'method': analysis_method ] samples_and_matrix: [ meta_input_new, samplesheet, abundance ] diff --git a/subworkflows/nf-core/differential_functional_enrichment/main.nf b/subworkflows/nf-core/differential_functional_enrichment/main.nf index a2e3d0cc..ff18aedc 100644 --- a/subworkflows/nf-core/differential_functional_enrichment/main.nf +++ b/subworkflows/nf-core/differential_functional_enrichment/main.nf @@ -9,6 +9,12 @@ include { CUSTOM_TABULARTOGSEACHIP } from '../../../modules/nf-core/custom/tabul include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' include { PROPR_GREA } from "../../../modules/nf-core/propr/grea/main.nf" +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { take: @@ -49,7 +55,7 @@ workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { def criteria = multiMapCriteria { meta_input, input, genesets, meta_exp, samplesheet, featuresheet, features_id, features_symbol, meta_contrasts, variable, reference, target -> def meta_contrasts_new = meta_contrasts + [ 'variable': variable, 'reference': reference, 'target': target ] // make sure variable, reference, target are in the meta - def meta_all = meta_input + meta_contrasts_new + def meta_all = mergeMaps(meta_contrasts_new, meta_input) input: [ meta_all, input ] genesets: diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index f151dbf9..62ad9f07 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -41,20 +41,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -70,60 +70,60 @@ "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -133,10 +133,10 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/immunedeconv", "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", "tables/processed_abundance", @@ -144,10 +144,10 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "volcano.png:md5,32d82a790e028f9476972a7f38190430", "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", @@ -160,35 +160,35 @@ "versions.yml:md5,837080c1af397890cab637f12f6c4851", "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" @@ -198,7 +198,7 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-31T10:42:33.001429417" + "timestamp": "2025-02-04T13:36:42.611371022" }, "Test profile - yml contrasts": { "content": [ @@ -242,20 +242,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -271,60 +271,60 @@ "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -334,10 +334,10 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/immunedeconv", "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", "tables/processed_abundance", @@ -345,10 +345,10 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "volcano.png:md5,32d82a790e028f9476972a7f38190430", "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", @@ -361,35 +361,35 @@ "versions.yml:md5,837080c1af397890cab637f12f6c4851", "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" @@ -399,6 +399,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-31T10:39:32.981523099" + "timestamp": "2025-02-04T13:33:48.399168757" } -} +} \ No newline at end of file diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index 3ee5ca78..bcf08163 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -41,14 +41,14 @@ "other/affy", "other/affy/raw._eset.rds", "other/limma", - "other/limma/phenotype_uninvolved_lesional.MArrayLM.limma.rds", + "other/limma/phenotype_uninvolved_lesional_GSE50790.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/phenotype_uninvolved_lesional", - "plots/differential/phenotype_uninvolved_lesional/png", - "plots/differential/phenotype_uninvolved_lesional/png/volcano.png", + "plots/differential/phenotype_uninvolved_lesional_GSE50790", + "plots/differential/phenotype_uninvolved_lesional_GSE50790/png", + "plots/differential/phenotype_uninvolved_lesional_GSE50790/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/phenotype", @@ -61,95 +61,205 @@ "plots/exploratory/phenotype/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/phenotype_uninvolved_lesional.limma.mean_difference.png", + "plots/qc/phenotype_uninvolved_lesional_GSE50790.limma.mean_difference.png", "report", "report/GSE50790.html", "report/GSE50790.zip", "report/gsea", - "report/gsea/phenotype_uninvolved_lesional", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Gsea.rpt", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.heat_map_corr_plot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.index.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.neg_snapshot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.pos_snapshot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS_79.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION_46.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE_94.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION_100.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS_58.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM_64.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS_76.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT_37.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR_19.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS_13.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY_85.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM_82.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT_16.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING_55.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING_25.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE_31.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE_52.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE_34.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN_97.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE_40.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING_10.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1_4.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2_22.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS_67.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING_88.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION_49.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY_61.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME_70.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION_106.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_43.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING_103.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB_7.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE_28.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN_91.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING_73.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Gsea.rpt", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.butterfly_plot.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ADIPOGENESIS_78.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ALLOGRAFT_REJECTION_45.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ANDROGEN_RESPONSE_93.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APICAL_JUNCTION_99.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APOPTOSIS_57.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_BILE_ACID_METABOLISM_63.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_CHOLESTEROL_HOMEOSTASIS_75.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_COMPLEMENT_36.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_DNA_REPAIR_18.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_E2F_TARGETS_12.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_84.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_FATTY_ACID_METABOLISM_81.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_G2M_CHECKPOINT_15.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL2_STAT5_SIGNALING_54.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_24.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INFLAMMATORY_RESPONSE_30.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_GAMMA_RESPONSE_33.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_96.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MITOTIC_SPINDLE_39.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MTORC1_SIGNALING_9.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V1_3.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V2_21.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYOGENESIS_66.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_NOTCH_SIGNALING_87.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_48.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_P53_PATHWAY_60.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PEROXISOME_69.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PROTEIN_SECRETION_105.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_42.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TGF_BETA_SIGNALING_102.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TNFA_SIGNALING_VIA_NFKB_6.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UNFOLDED_PROTEIN_RESPONSE_27.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UV_RESPONSE_DN_90.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_72.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.global_es_histogram.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_101.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_104.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_107.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_11.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_14.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_17.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_20.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_23.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_26.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_29.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_32.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_35.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_38.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_41.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_44.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_47.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_5.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_50.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_53.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_56.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_59.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_62.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_65.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_68.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_71.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_74.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_77.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_8.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_80.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_83.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_86.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_89.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_92.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_95.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_98.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_1.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_corr_plot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.index.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.neg_snapshot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.pos_snapshot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.pvalues_vs_nes_plot.png", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/GSE50790", "shinyngs_app/GSE50790/app.R", @@ -159,8 +269,8 @@ "tables/annotation", "tables/annotation/hgu133plus2.annotation.tsv", "tables/differential", - "tables/differential/phenotype_uninvolved_lesional.limma.results.tsv", - "tables/differential/phenotype_uninvolved_lesional.limma.results_filtered.tsv", + "tables/differential/phenotype_uninvolved_lesional_GSE50790.limma.results.tsv", + "tables/differential/phenotype_uninvolved_lesional_GSE50790.limma.results_filtered.tsv", "tables/processed_abundance", "untar", "untar/GSE50790", @@ -175,7 +285,7 @@ ], [ "raw._eset.rds:md5,8c6c7807ce6c5d8204bd681b941eeb0f", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", + "phenotype_uninvolved_lesional_GSE50790.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", "volcano.png:md5,d4381dd34786c58e25b8e4ed1fa8bf26", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", "boxplot.png:md5,552c6cf37521fae8170368e3adb4da80", @@ -185,50 +295,159 @@ "pca3d.png:md5,1aa274734110ab804ce6503e5f555c85", "sample_dendrogram.png:md5,69e00857f24a2aa4c02042bdb87d4fd8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv:md5,4070abb7bce1b665cae361d1fafadc4a", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", - "gene_sets_phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", + "phenotype_uninvolved_lesional_GSE50790.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS_79.png:md5,8936dd96e0ea1f529e0800662f85c9a3", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION_46.png:md5,3c1e6fbb869a3656869a10de99221464", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE_94.png:md5,99244a60e157cc6313011d76d1dea93c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION_100.png:md5,0fb2a7f0f23599d9b004c17f890c005c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS_58.png:md5,5ef94a9d9de76df7a654d372e159a33c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM_64.png:md5,4c3cbc2318251919c48134943aeac389", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS_76.png:md5,c0d9344f177cfd17d3d71ee219c7af96", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT_37.png:md5,81ae62bd970fb0d9c7612a0b84969f0c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR_19.png:md5,9785c507e7aab4f4043be83fcc920785", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS_13.png:md5,356c751443d323d46832a357b6b55b19", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY_85.png:md5,78fc820312e8d110d78f112762b42d94", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM_82.png:md5,11387f87a7964c7f4f4c80660c444f7a", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT_16.png:md5,6a13f545d6e742acb5abba48d0aeb852", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING_55.png:md5,45bb17002f45ccf1143e0df85590b48d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING_25.png:md5,9023d56896be7e25b954a53ad3190c96", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE_31.png:md5,b3a7d294ccceac1d2daf42c8d09b6583", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE_52.png:md5,d8409a55a3f43af7a4bad00d68208a1c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE_34.png:md5,ace7a9c954374f48a39ecb2b7ca82163", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN_97.png:md5,578f2f02b50ba36e637dfa3cd51811f9", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE_40.png:md5,24dd124eb97d9c81b80dd8bbdd712b1b", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING_10.png:md5,b53dcbbc2bf9620adb506052761bba5f", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1_4.png:md5,cb716d36d5be9dc8d652f19a8a44ff77", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2_22.png:md5,987103bc589f0a44be80869906f36ca8", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS_67.png:md5,fd6a188e123de6c2ed754d81ae67dad7", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING_88.png:md5,a92d4dfb4799c939f9876da331dbb393", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION_49.png:md5,e757aa1dbea1721b5d4278eea90d778b", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv:md5,4070abb7bce1b665cae361d1fafadc4a", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY_61.png:md5,7c8e29f8d87edd88035412126ba3677d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME_70.png:md5,398539972f450696ea5e477eb7247058", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION_106.png:md5,6ccae6478c86b755503cf81f46e6d985", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_43.png:md5,1fbedf6201baf539ba7bd23776ded0c1", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING_103.png:md5,624282245d018f357a39ff200cc2862e", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB_7.png:md5,5b5323d2e2c382d17a4ec6d4c2f43248", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE_28.png:md5,71f4c67fbe3b8031cd21779e0d20ee36", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN_91.png:md5,0c907d53dfcffe2be441885729278663", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING_73.png:md5,82fb4fb0156349d0b95a3b8316d72b6c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ADIPOGENESIS_78.png:md5,1f8df28c6eae6b392dba0eadd524f86d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ALLOGRAFT_REJECTION_45.png:md5,3b565e1ba22c91b97f74bf26cfc9de48", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ANDROGEN_RESPONSE_93.png:md5,039347ef72346b99429c950e57277e9b", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APICAL_JUNCTION_99.png:md5,63b71f9f004dd4de6874dd0df4f17ed1", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APOPTOSIS_57.png:md5,159a73718dc5ff7c340ca88b5a1f15f2", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_BILE_ACID_METABOLISM_63.png:md5,64c7afa135c429d124b499cc9d01610e", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_CHOLESTEROL_HOMEOSTASIS_75.png:md5,c28e3d6d6691acc0bde23a4c6a0d7702", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_COMPLEMENT_36.png:md5,f87fb9a80fd139849e00061580e651ba", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_DNA_REPAIR_18.png:md5,b6c9ae1d14beacaad6c61c5e54ca3734", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_E2F_TARGETS_12.png:md5,fb79f77f8d777aa27615cb3a7af33dc6", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_84.png:md5,ba2e0a4db7137ad4fec67e2ee4758d7d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_FATTY_ACID_METABOLISM_81.png:md5,aa320806a7143d2cc82d3f9a6a364612", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_G2M_CHECKPOINT_15.png:md5,dabf5628bc6588833e00460fa2b2bf00", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL2_STAT5_SIGNALING_54.png:md5,727d4b50db689eea1ba8ede0d28f89cf", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_24.png:md5,1a5f6c84195d9f93d1aa4bf684cb3d62", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INFLAMMATORY_RESPONSE_30.png:md5,23bed59bffcf0a65fb7e2d0ffdf147c3", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png:md5,81566dae8597f942372fb32b5cda6f8e", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_GAMMA_RESPONSE_33.png:md5,17cb8393949fabff6ab190ae4bd8bf8f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_96.png:md5,e8e31e4cc4776ea237d002d1b5599baa", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MITOTIC_SPINDLE_39.png:md5,d76cd54d4199a61168d47bb6be70ed60", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MTORC1_SIGNALING_9.png:md5,a10ad05d6f9516c0767b7f04c944ecee", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V1_3.png:md5,8dda645d9ac433ea47fd4c75d04ff6b2", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V2_21.png:md5,798cdd31de306237e748f36c60fb7e92", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYOGENESIS_66.png:md5,53c9709d736a7ad18cde9d15760a1e04", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_NOTCH_SIGNALING_87.png:md5,3c7d1add7d31e387f5f6c918662b3d47", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_48.png:md5,1e28433cbafcec8c6d797405c849808d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_P53_PATHWAY_60.png:md5,5446ee47a303468eb08bc20fa6793f9f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PEROXISOME_69.png:md5,c482f0fcbabba4ef0a0678ff61bd8def", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PROTEIN_SECRETION_105.png:md5,67bb88632bae3eaadcf4ea2763a2c114", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_42.png:md5,b68502bd12985ac39d93dc2b4c0f250d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TGF_BETA_SIGNALING_102.png:md5,0bfdfb73e442b871c54408e8e155064d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TNFA_SIGNALING_VIA_NFKB_6.png:md5,89de9dc3306e6d98e5b971e4ab5c1fc7", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UNFOLDED_PROTEIN_RESPONSE_27.png:md5,0bf599c3effa030b61d66e7ead1f1876", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UV_RESPONSE_DN_90.png:md5,e6cb85452d62c4056c7303b978ca8e96", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_72.png:md5,6edf8a0ffe0b0bcc9904366232a26f18", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.global_es_histogram.png:md5,d87080d27237cf15353b4fb35cc7105f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv:md5,b672c906a847b8a9c697f3e966328a9e", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv:md5,430a1f0c4ff9eed8e63c2913c7785077", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_101.png:md5,e836744d7c7e604fd4c425b3b7d09a48", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_104.png:md5,a35b9f97f1ffc908c54c9177b4fc0631", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_107.png:md5,0ca16afc144214ff770f2b6bb9e3fd26", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_11.png:md5,063ac90d6cfb3926da8ccc30f8b655bc", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_14.png:md5,fff65b02b924d3b82a9e9ffe5f33222d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_17.png:md5,6d42a6df888cff692069bc9e5c13809f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_20.png:md5,487ee97605d2af14afe240317acf277f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_23.png:md5,e1438075ee20f64c0d42a54368b5149f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_26.png:md5,0af0ebab47a275398ef094cbf498354f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_29.png:md5,0d8c1cc2573ca93a2b19615f619c2c49", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_32.png:md5,f2c30190a6d66c765fa06b55a1a7f431", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_35.png:md5,17d22f7df8eedd76ad0563a2d4417b0b", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_38.png:md5,a456bd866a515b320caafbade4320022", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_41.png:md5,7174ff40c772674b5865b0dd62adb0f3", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_44.png:md5,5096b4d75a8bae7b88e009f2edddbc15", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_47.png:md5,c697a8dd60cde1994423113dcaaee602", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_50.png:md5,8968c4b2b5156fac4a9aa9ec8106b799", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_53.png:md5,cdc4ebfad309bd008f0a0157c283a44f", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_56.png:md5,a8509a61c02489fbc5e279ef853c0054", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_59.png:md5,411f16e20cac488980fbaa222a9147eb", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_62.png:md5,0ffba2fb4cf706c125f020a8faaf0f58", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_65.png:md5,0928a8033a2ca06fd1f4457e8e7374f2", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_68.png:md5,923996c610fc14e182102cd96fe36ed3", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_71.png:md5,737385bd50d87452dc4ad0aac1387450", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_74.png:md5,3b65044d3c88c1c8570f73f0aba49ba5", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_77.png:md5,fa78fd23bfa702ad57b98109a1295b60", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_8.png:md5,73f0d68983a0957d2e878f53f82aee1a", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_80.png:md5,adb4888522c7c996c160dbc22d0b46f7", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_83.png:md5,4a7bc5265be6e5362ec8d118c0dc9160", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_86.png:md5,606614104962e2012be319da3e1f2d96", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_89.png:md5,f61411020a720c6729fbd0aa1b23f20d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_92.png:md5,b1a2bac4f0731f70dea0d7f809cdd251", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_95.png:md5,273063eeb78e07178738b198092fb274", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_98.png:md5,5a3de2afe34ade478b4b143825a1c921", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_1.png:md5,2d8a508a224072e3a68b3f2cafb87119", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_list_corr_2.png:md5,50c67d7cd4e833c26b3f2f0e0be92d7a", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "hgu133plus2.annotation.tsv:md5,f2b82ef12b2a2e8e575de06766583d96", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", + "phenotype_uninvolved_lesional_GSE50790.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", + "phenotype_uninvolved_lesional_GSE50790.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", "GSM1229341_Gudjohnsson_001_6690_PP.CEL.gz:md5,259d0908211a071351450f366fd51cad", "GSM1229342_Gudjohnsson_002_6690_PN.CEL.gz:md5,31cc2b8b26e210760b8ebd4b304b52ba", "GSM1229343_Gudjohnsson_003_7450_PN.CEL.gz:md5,713a3ca75a883cbff6da0be7bd251422", @@ -243,6 +462,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T14:16:48.032845231" + "timestamp": "2025-02-04T14:00:47.075444942" } } \ No newline at end of file diff --git a/tests/test_maxquant.nf.test.snap b/tests/test_maxquant.nf.test.snap index 392a03c9..db7c8302 100644 --- a/tests/test_maxquant.nf.test.snap +++ b/tests/test_maxquant.nf.test.snap @@ -29,10 +29,10 @@ [ "other", "other/limma", - "other/limma/fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_FoB.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_t2.MArrayLM.limma.rds", + "other/limma/fakebatch_fakeBatch_b1_b2_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_FoB_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_MZ_fakeBatch_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_t2_PXD043349.MArrayLM.limma.rds", "other/proteus", "other/proteus/Celltype", "other/proteus/Celltype/normalizeMedian.normalized_proteingroups.rds", @@ -45,18 +45,18 @@ "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/fakebatch_fakeBatch_b1_b2", - "plots/differential/fakebatch_fakeBatch_b1_b2/png", - "plots/differential/fakebatch_fakeBatch_b1_b2/png/volcano.png", - "plots/differential/genotype_celltype_t1_FoB", - "plots/differential/genotype_celltype_t1_FoB/png", - "plots/differential/genotype_celltype_t1_FoB/png/volcano.png", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch/png", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch/png/volcano.png", - "plots/differential/genotype_celltype_t1_t2", - "plots/differential/genotype_celltype_t1_t2/png", - "plots/differential/genotype_celltype_t1_t2/png/volcano.png", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349/png", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_FoB_PXD043349", + "plots/differential/genotype_celltype_t1_FoB_PXD043349/png", + "plots/differential/genotype_celltype_t1_FoB_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349/png", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_t2_PXD043349", + "plots/differential/genotype_celltype_t1_t2_PXD043349/png", + "plots/differential/genotype_celltype_t1_t2_PXD043349/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/Celltype", @@ -88,23 +88,23 @@ "plots/proteus/fakeBatch/normalizeMedian.normalized_mean_variance_relationship.png", "plots/proteus/fakeBatch/raw_distributions.png", "plots/qc", - "plots/qc/fakebatch_fakeBatch_b1_b2.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_FoB.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_t2.limma.mean_difference.png", + "plots/qc/fakebatch_fakeBatch_b1_b2_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_FoB_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_t2_PXD043349.limma.mean_difference.png", "report", "report/PXD043349.html", "report/PXD043349.zip", "tables", "tables/differential", - "tables/differential/fakebatch_fakeBatch_b1_b2.limma.results.tsv", - "tables/differential/fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_FoB.limma.results.tsv", - "tables/differential/genotype_celltype_t1_FoB.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv", - "tables/differential/genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_t2.limma.results.tsv", - "tables/differential/genotype_celltype_t1_t2.limma.results_filtered.tsv", + "tables/differential/fakebatch_fakeBatch_b1_b2_PXD043349.limma.results.tsv", + "tables/differential/fakebatch_fakeBatch_b1_b2_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_FoB_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_FoB_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_t2_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_t2_PXD043349.limma.results_filtered.tsv", "tables/proteus", "tables/proteus/Celltype", "tables/proteus/Celltype/normalizeMedian.normalized_proteingroups_tab.tsv", @@ -114,10 +114,10 @@ "tables/proteus/fakeBatch/raw_proteingroups_tab.tsv" ], [ - "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", - "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", - "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", - "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", + "fakebatch_fakeBatch_b1_b2_PXD043349.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", + "genotype_celltype_t1_FoB_PXD043349.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", + "genotype_celltype_t1_t2_PXD043349.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", "normalizeMedian.normalized_proteingroups.rds:md5,da660b225f066a1e87bf8bb4196adcc6", "raw_proteingroups.rds:md5,0b38726c41e7b32213e5e15380c29612", "R_sessionInfo.log:md5,411badddf7904da0ed1de02b544109d2", @@ -149,18 +149,18 @@ "normalizeMedian.normalized_distributions.png:md5,eff54bf61eafda77f8891e41239aaf9c", "normalizeMedian.normalized_mean_variance_relationship.png:md5,b5ba9b01fe4534191e3e577302beaead", "raw_distributions.png:md5,086370f56bc89e418744dc77f445e5e5", - "fakebatch_fakeBatch_b1_b2.limma.mean_difference.png:md5,45da19bbbebe47c7b08216e585f0d6d1", - "genotype_celltype_t1_FoB.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", - "genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", - "genotype_celltype_t1_t2.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", - "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", - "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", - "genotype_celltype_t1_FoB.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", - "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", - "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", - "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", - "genotype_celltype_t1_t2.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", - "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", + "fakebatch_fakeBatch_b1_b2_PXD043349.limma.mean_difference.png:md5,45da19bbbebe47c7b08216e585f0d6d1", + "genotype_celltype_t1_FoB_PXD043349.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", + "genotype_celltype_t1_t2_PXD043349.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", + "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", + "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", + "genotype_celltype_t1_FoB_PXD043349.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", + "genotype_celltype_t1_FoB_PXD043349.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", + "genotype_celltype_t1_t2_PXD043349.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", + "genotype_celltype_t1_t2_PXD043349.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", "raw_proteingroups_tab.tsv:md5,33a8791f84c676ea1aea4842231acb6a", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", @@ -171,6 +171,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T14:02:26.455693403" + "timestamp": "2025-02-04T13:55:28.714172369" } } \ No newline at end of file diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index afa0aae4..5ae00475 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -23,20 +23,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -49,8 +49,8 @@ "plots/exploratory/treatment/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", @@ -61,19 +61,19 @@ "shinyngs_app/versions.yml", "tables", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/processed_abundance", "tables/processed_abundance/all.normalised_counts.tsv", "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", "volcano.png:md5,db4fda5e682a1659af157c11985d0783", "volcano.png:md5,396facf5c1dbe8b445e3360e6280f9c1", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", @@ -84,14 +84,14 @@ "pca3d.png:md5,99fd4104a7c08b5eae0ff88dc7eaf0d0", "sample_dendrogram.png:md5,4fda57a4e2b34c063d233558d509f7a8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,ed14d196fadbe460d560982ef1e2ac91", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", + "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,ed14d196fadbe460d560982ef1e2ac91", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", "all.normalised_counts.tsv:md5,e960aa685547a3ea778523da84fae136", "all.vst.tsv:md5,ea4e437ee57b2c5ef8c19d427656e3c6" ] @@ -100,6 +100,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-31T10:50:58.957242958" + "timestamp": "2025-02-04T13:51:49.033487904" } -} +} \ No newline at end of file diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap index 2aa495e5..fe08c706 100644 --- a/tests/test_rnaseq_limma.nf.test.snap +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -41,18 +41,18 @@ [ "other", "other/limma", - "other/limma/treatment_mCherry_hND6_.MArrayLM.limma.rds", - "other/limma/treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds", + "other/limma/treatment_mCherry_hND6__SRP254919.MArrayLM.limma.rds", + "other/limma/treatment_mCherry_hND6_sample_number_SRP254919.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -65,60 +65,60 @@ "plots/exploratory/treatment/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.limma.mean_difference.png", - "plots/qc/treatment_mCherry_hND6_sample_number.limma.mean_difference.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.limma.mean_difference.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.limma.mean_difference.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -128,16 +128,16 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.limma.results.tsv", - "tables/differential/treatment_mCherry_hND6_.limma.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.limma.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.limma.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.limma.results_filtered.tsv", "tables/processed_abundance", "tables/processed_abundance/all.normalised_counts.tsv" ], [ - "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", - "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", + "treatment_mCherry_hND6__SRP254919.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", + "treatment_mCherry_hND6_sample_number_SRP254919.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", @@ -148,35 +148,35 @@ "pca3d.png:md5,458d2c497557113ec203fe38186f5e1c", "sample_dendrogram.png:md5,eb02da7195194e0d56578df41022f9bf", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6_.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", - "treatment_mCherry_hND6_sample_number.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "gene_sets_treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "gene_sets_treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", + "treatment_mCherry_hND6__SRP254919.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", + "treatment_mCherry_hND6_sample_number_SRP254919.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", - "treatment_mCherry_hND6_.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", - "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", - "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "treatment_mCherry_hND6__SRP254919.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", + "treatment_mCherry_hND6__SRP254919.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "treatment_mCherry_hND6_sample_number_SRP254919.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", + "treatment_mCherry_hND6_sample_number_SRP254919.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", "all.normalised_counts.tsv:md5,7510c89d6665176d5026b7af0a64344d" ] ], @@ -184,6 +184,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T13:55:44.270128379" + "timestamp": "2025-02-04T13:49:21.804334557" } } \ No newline at end of file diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap index f0f94ef2..5ecd8940 100644 --- a/tests/test_soft.nf.test.snap +++ b/tests/test_soft.nf.test.snap @@ -29,14 +29,14 @@ "other/affy", "other/affy/normalised.eset.rds", "other/limma", - "other/limma/phenotype_uninvolved_lesional.MArrayLM.limma.rds", + "other/limma/phenotype_uninvolved_lesional_study.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/phenotype_uninvolved_lesional", - "plots/differential/phenotype_uninvolved_lesional/png", - "plots/differential/phenotype_uninvolved_lesional/png/volcano.png", + "plots/differential/phenotype_uninvolved_lesional_study", + "plots/differential/phenotype_uninvolved_lesional_study/png", + "plots/differential/phenotype_uninvolved_lesional_study/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/phenotype", @@ -49,7 +49,7 @@ "plots/exploratory/phenotype/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/phenotype_uninvolved_lesional.limma.mean_difference.png", + "plots/qc/phenotype_uninvolved_lesional_study.limma.mean_difference.png", "report", "report/study.html", "report/study.zip", @@ -62,14 +62,14 @@ "tables/annotation", "tables/annotation/normalised.annotation.tsv", "tables/differential", - "tables/differential/phenotype_uninvolved_lesional.limma.results.tsv", - "tables/differential/phenotype_uninvolved_lesional.limma.results_filtered.tsv", + "tables/differential/phenotype_uninvolved_lesional_study.limma.results.tsv", + "tables/differential/phenotype_uninvolved_lesional_study.limma.results_filtered.tsv", "tables/processed_abundance", "tables/processed_abundance/normalised.matrix.tsv" ], [ "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", + "phenotype_uninvolved_lesional_study.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", @@ -79,12 +79,12 @@ "pca3d.png:md5,d32182b1005d696da648170f3bd9dbe8", "sample_dendrogram.png:md5,b66045a3c9df5310f3241544c50f3fd1", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", + "phenotype_uninvolved_lesional_study.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", + "phenotype_uninvolved_lesional_study.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", + "phenotype_uninvolved_lesional_study.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", "normalised.matrix.tsv:md5,230f87f91c0c1a7e2ab354200c4b978c" ] ], @@ -92,6 +92,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-01-30T13:53:09.212530448" + "timestamp": "2025-02-04T13:46:38.371505567" } } \ No newline at end of file From 278b88f52bff8e33ce928e391aa2f4cada1bc491 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 16:54:59 +0000 Subject: [PATCH 27/29] change(tests): ignore pngs from test snapshotting --- tests/test.nf.test | 4 +- tests/test.nf.test.snap | 48 +----- tests/test_affy.nf.test | 8 +- tests/test_affy.nf.test.snap | 231 +-------------------------- tests/test_maxquant.nf.test | 2 +- tests/test_maxquant.nf.test.snap | 30 +--- tests/test_nogtf.nf.test | 2 +- tests/test_nogtf.nf.test.snap | 12 +- tests/test_rnaseq_limma.nf.test | 2 +- tests/test_rnaseq_limma.nf.test.snap | 22 +-- tests/test_soft.nf.test | 2 +- tests/test_soft.nf.test.snap | 10 +- 12 files changed, 19 insertions(+), 354 deletions(-) diff --git a/tests/test.nf.test b/tests/test.nf.test index 69f66447..df2194a0 100644 --- a/tests/test.nf.test +++ b/tests/test.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( @@ -50,7 +50,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index 62ad9f07..da0cd114 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -148,40 +148,18 @@ "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "volcano.png:md5,32d82a790e028f9476972a7f38190430", - "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", - "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", - "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", - "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", - "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", - "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", @@ -198,7 +176,7 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:36:42.611371022" + "timestamp": "2025-02-04T16:23:35.713188367" }, "Test profile - yml contrasts": { "content": [ @@ -349,40 +327,18 @@ "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "volcano.png:md5,32d82a790e028f9476972a7f38190430", - "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", - "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", - "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", - "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", - "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", - "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,3c3b95eeb25e86bc218ed9de4d4c0e99", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,759889920027cd575e945a2044918f50", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", @@ -399,6 +355,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:33:48.399168757" + "timestamp": "2025-02-04T16:10:38.458716344" } } \ No newline at end of file diff --git a/tests/test_affy.nf.test b/tests/test_affy.nf.test index 5fab9052..2e4bdcd8 100644 --- a/tests/test_affy.nf.test +++ b/tests/test_affy.nf.test @@ -17,11 +17,11 @@ nextflow_pipeline { then { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}', - 'report/gsea/phenotype_uninvolved_lesional/**/*.png', - 'report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv}', - 'report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv}']) + 'report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png', + 'report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv}', + 'report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index bcf08163..d835f6b5 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -70,196 +70,86 @@ "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS_79.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION_46.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE_94.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION_100.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS_58.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM_64.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS_76.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT_37.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR_19.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS_13.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY_85.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM_82.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT_16.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING_55.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING_25.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE_31.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE_52.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE_34.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN_97.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE_40.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING_10.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1_4.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2_22.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS_67.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING_88.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION_49.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY_61.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME_70.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION_106.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_43.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING_103.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB_7.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE_28.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN_91.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING_73.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Gsea.rpt", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.butterfly_plot.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ADIPOGENESIS_78.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ALLOGRAFT_REJECTION_45.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ANDROGEN_RESPONSE_93.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APICAL_JUNCTION_99.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APOPTOSIS_57.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_BILE_ACID_METABOLISM_63.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_CHOLESTEROL_HOMEOSTASIS_75.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_COMPLEMENT_36.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_DNA_REPAIR_18.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_E2F_TARGETS_12.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_84.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_FATTY_ACID_METABOLISM_81.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_G2M_CHECKPOINT_15.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL2_STAT5_SIGNALING_54.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_24.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INFLAMMATORY_RESPONSE_30.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_GAMMA_RESPONSE_33.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_96.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MITOTIC_SPINDLE_39.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MTORC1_SIGNALING_9.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V1_3.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V2_21.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYOGENESIS_66.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_NOTCH_SIGNALING_87.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_48.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_P53_PATHWAY_60.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PEROXISOME_69.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PROTEIN_SECRETION_105.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_42.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TGF_BETA_SIGNALING_102.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TNFA_SIGNALING_VIA_NFKB_6.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UNFOLDED_PROTEIN_RESPONSE_27.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UV_RESPONSE_DN_90.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_72.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.global_es_histogram.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_101.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_104.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_107.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_11.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_14.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_17.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_20.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_23.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_26.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_29.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_32.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_35.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_38.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_41.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_44.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_47.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_5.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_50.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_53.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_56.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_59.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_62.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_65.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_68.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_71.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_74.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_77.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_8.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_80.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_83.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_86.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_89.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_92.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_95.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_98.png", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_1.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_corr_plot.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.index.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.neg_snapshot.html", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.pos_snapshot.html", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.pvalues_vs_nes_plot.png", "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv", - "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/GSE50790", "shinyngs_app/GSE50790/app.R", @@ -286,163 +176,48 @@ [ "raw._eset.rds:md5,8c6c7807ce6c5d8204bd681b941eeb0f", "phenotype_uninvolved_lesional_GSE50790.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", - "volcano.png:md5,d4381dd34786c58e25b8e4ed1fa8bf26", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,552c6cf37521fae8170368e3adb4da80", - "density.png:md5,d03da965d4260ac137eccd2b193c38ca", - "mad_correlation.png:md5,2d448f4560bde14a1c56b42f8d9030ca", - "pca2d.png:md5,38cf71613192a86a72c44294b885aa41", - "pca3d.png:md5,1aa274734110ab804ce6503e5f555c85", - "sample_dendrogram.png:md5,69e00857f24a2aa4c02042bdb87d4fd8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional_GSE50790.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS_79.png:md5,8936dd96e0ea1f529e0800662f85c9a3", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION_46.png:md5,3c1e6fbb869a3656869a10de99221464", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE_94.png:md5,99244a60e157cc6313011d76d1dea93c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION_100.png:md5,0fb2a7f0f23599d9b004c17f890c005c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS_58.png:md5,5ef94a9d9de76df7a654d372e159a33c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM_64.png:md5,4c3cbc2318251919c48134943aeac389", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS_76.png:md5,c0d9344f177cfd17d3d71ee219c7af96", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT_37.png:md5,81ae62bd970fb0d9c7612a0b84969f0c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR_19.png:md5,9785c507e7aab4f4043be83fcc920785", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS_13.png:md5,356c751443d323d46832a357b6b55b19", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY_85.png:md5,78fc820312e8d110d78f112762b42d94", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM_82.png:md5,11387f87a7964c7f4f4c80660c444f7a", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT_16.png:md5,6a13f545d6e742acb5abba48d0aeb852", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING_55.png:md5,45bb17002f45ccf1143e0df85590b48d", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING_25.png:md5,9023d56896be7e25b954a53ad3190c96", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE_31.png:md5,b3a7d294ccceac1d2daf42c8d09b6583", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE_52.png:md5,d8409a55a3f43af7a4bad00d68208a1c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE_34.png:md5,ace7a9c954374f48a39ecb2b7ca82163", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN_97.png:md5,578f2f02b50ba36e637dfa3cd51811f9", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE_40.png:md5,24dd124eb97d9c81b80dd8bbdd712b1b", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING_10.png:md5,b53dcbbc2bf9620adb506052761bba5f", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1_4.png:md5,cb716d36d5be9dc8d652f19a8a44ff77", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2_22.png:md5,987103bc589f0a44be80869906f36ca8", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS_67.png:md5,fd6a188e123de6c2ed754d81ae67dad7", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING_88.png:md5,a92d4dfb4799c939f9876da331dbb393", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION_49.png:md5,e757aa1dbea1721b5d4278eea90d778b", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv:md5,4070abb7bce1b665cae361d1fafadc4a", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY_61.png:md5,7c8e29f8d87edd88035412126ba3677d", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME_70.png:md5,398539972f450696ea5e477eb7247058", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION_106.png:md5,6ccae6478c86b755503cf81f46e6d985", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_43.png:md5,1fbedf6201baf539ba7bd23776ded0c1", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING_103.png:md5,624282245d018f357a39ff200cc2862e", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB_7.png:md5,5b5323d2e2c382d17a4ec6d4c2f43248", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE_28.png:md5,71f4c67fbe3b8031cd21779e0d20ee36", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN_91.png:md5,0c907d53dfcffe2be441885729278663", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING_73.png:md5,82fb4fb0156349d0b95a3b8316d72b6c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ADIPOGENESIS_78.png:md5,1f8df28c6eae6b392dba0eadd524f86d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ALLOGRAFT_REJECTION_45.png:md5,3b565e1ba22c91b97f74bf26cfc9de48", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ANDROGEN_RESPONSE_93.png:md5,039347ef72346b99429c950e57277e9b", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APICAL_JUNCTION_99.png:md5,63b71f9f004dd4de6874dd0df4f17ed1", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_APOPTOSIS_57.png:md5,159a73718dc5ff7c340ca88b5a1f15f2", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_BILE_ACID_METABOLISM_63.png:md5,64c7afa135c429d124b499cc9d01610e", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_CHOLESTEROL_HOMEOSTASIS_75.png:md5,c28e3d6d6691acc0bde23a4c6a0d7702", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_COMPLEMENT_36.png:md5,f87fb9a80fd139849e00061580e651ba", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_DNA_REPAIR_18.png:md5,b6c9ae1d14beacaad6c61c5e54ca3734", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_E2F_TARGETS_12.png:md5,fb79f77f8d777aa27615cb3a7af33dc6", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_84.png:md5,ba2e0a4db7137ad4fec67e2ee4758d7d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_FATTY_ACID_METABOLISM_81.png:md5,aa320806a7143d2cc82d3f9a6a364612", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_G2M_CHECKPOINT_15.png:md5,dabf5628bc6588833e00460fa2b2bf00", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL2_STAT5_SIGNALING_54.png:md5,727d4b50db689eea1ba8ede0d28f89cf", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_24.png:md5,1a5f6c84195d9f93d1aa4bf684cb3d62", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INFLAMMATORY_RESPONSE_30.png:md5,23bed59bffcf0a65fb7e2d0ffdf147c3", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png:md5,81566dae8597f942372fb32b5cda6f8e", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_INTERFERON_GAMMA_RESPONSE_33.png:md5,17cb8393949fabff6ab190ae4bd8bf8f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_96.png:md5,e8e31e4cc4776ea237d002d1b5599baa", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MITOTIC_SPINDLE_39.png:md5,d76cd54d4199a61168d47bb6be70ed60", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MTORC1_SIGNALING_9.png:md5,a10ad05d6f9516c0767b7f04c944ecee", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V1_3.png:md5,8dda645d9ac433ea47fd4c75d04ff6b2", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYC_TARGETS_V2_21.png:md5,798cdd31de306237e748f36c60fb7e92", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_MYOGENESIS_66.png:md5,53c9709d736a7ad18cde9d15760a1e04", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_NOTCH_SIGNALING_87.png:md5,3c7d1add7d31e387f5f6c918662b3d47", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_48.png:md5,1e28433cbafcec8c6d797405c849808d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_P53_PATHWAY_60.png:md5,5446ee47a303468eb08bc20fa6793f9f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PEROXISOME_69.png:md5,c482f0fcbabba4ef0a0678ff61bd8def", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_PROTEIN_SECRETION_105.png:md5,67bb88632bae3eaadcf4ea2763a2c114", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY_42.png:md5,b68502bd12985ac39d93dc2b4c0f250d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TGF_BETA_SIGNALING_102.png:md5,0bfdfb73e442b871c54408e8e155064d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_TNFA_SIGNALING_VIA_NFKB_6.png:md5,89de9dc3306e6d98e5b971e4ab5c1fc7", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UNFOLDED_PROTEIN_RESPONSE_27.png:md5,0bf599c3effa030b61d66e7ead1f1876", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_UV_RESPONSE_DN_90.png:md5,e6cb85452d62c4056c7303b978ca8e96", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.enplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_72.png:md5,6edf8a0ffe0b0bcc9904366232a26f18", "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.global_es_histogram.png:md5,d87080d27237cf15353b4fb35cc7105f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv:md5,b672c906a847b8a9c697f3e966328a9e", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv:md5,430a1f0c4ff9eed8e63c2913c7785077", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_101.png:md5,e836744d7c7e604fd4c425b3b7d09a48", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_104.png:md5,a35b9f97f1ffc908c54c9177b4fc0631", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_107.png:md5,0ca16afc144214ff770f2b6bb9e3fd26", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_11.png:md5,063ac90d6cfb3926da8ccc30f8b655bc", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_14.png:md5,fff65b02b924d3b82a9e9ffe5f33222d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_17.png:md5,6d42a6df888cff692069bc9e5c13809f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_20.png:md5,487ee97605d2af14afe240317acf277f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_23.png:md5,e1438075ee20f64c0d42a54368b5149f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_26.png:md5,0af0ebab47a275398ef094cbf498354f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_29.png:md5,0d8c1cc2573ca93a2b19615f619c2c49", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_32.png:md5,f2c30190a6d66c765fa06b55a1a7f431", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_35.png:md5,17d22f7df8eedd76ad0563a2d4417b0b", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_38.png:md5,a456bd866a515b320caafbade4320022", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_41.png:md5,7174ff40c772674b5865b0dd62adb0f3", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_44.png:md5,5096b4d75a8bae7b88e009f2edddbc15", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_47.png:md5,c697a8dd60cde1994423113dcaaee602", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_50.png:md5,8968c4b2b5156fac4a9aa9ec8106b799", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_53.png:md5,cdc4ebfad309bd008f0a0157c283a44f", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_56.png:md5,a8509a61c02489fbc5e279ef853c0054", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_59.png:md5,411f16e20cac488980fbaa222a9147eb", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_62.png:md5,0ffba2fb4cf706c125f020a8faaf0f58", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_65.png:md5,0928a8033a2ca06fd1f4457e8e7374f2", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_68.png:md5,923996c610fc14e182102cd96fe36ed3", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_71.png:md5,737385bd50d87452dc4ad0aac1387450", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_74.png:md5,3b65044d3c88c1c8570f73f0aba49ba5", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_77.png:md5,fa78fd23bfa702ad57b98109a1295b60", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_8.png:md5,73f0d68983a0957d2e878f53f82aee1a", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_80.png:md5,adb4888522c7c996c160dbc22d0b46f7", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_83.png:md5,4a7bc5265be6e5362ec8d118c0dc9160", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_86.png:md5,606614104962e2012be319da3e1f2d96", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_89.png:md5,f61411020a720c6729fbd0aa1b23f20d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_92.png:md5,b1a2bac4f0731f70dea0d7f809cdd251", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_95.png:md5,273063eeb78e07178738b198092fb274", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gset_rnd_es_dist_98.png:md5,5a3de2afe34ade478b4b143825a1c921", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_1.png:md5,2d8a508a224072e3a68b3f2cafb87119", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv:md5,dd05ffd4fae9d1b5539d1f74c016ec5d", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv:md5,b3de35531f650651529c6f53d81ab1da", "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_list_corr_2.png:md5,50c67d7cd4e833c26b3f2f0e0be92d7a", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "hgu133plus2.annotation.tsv:md5,f2b82ef12b2a2e8e575de06766583d96", @@ -462,6 +237,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T14:00:47.075444942" + "timestamp": "2025-02-04T16:52:57.326488609" } } \ No newline at end of file diff --git a/tests/test_maxquant.nf.test b/tests/test_maxquant.nf.test index a9c7cc7f..75c0e08d 100644 --- a/tests/test_maxquant.nf.test +++ b/tests/test_maxquant.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_maxquant.nf.test.snap b/tests/test_maxquant.nf.test.snap index db7c8302..2e8c18b7 100644 --- a/tests/test_maxquant.nf.test.snap +++ b/tests/test_maxquant.nf.test.snap @@ -123,36 +123,8 @@ "R_sessionInfo.log:md5,411badddf7904da0ed1de02b544109d2", "normalizeMedian.normalized_proteingroups.rds:md5,6f7def9ce31c8ee07f649675db394848", "raw_proteingroups.rds:md5,daef7d25977a1628870dee75e2977ee3", - "volcano.png:md5,3d64aa38b9c321f1162565a28d254bd1", - "volcano.png:md5,2497d3bd1e925d358b5856a21209f4bc", - "volcano.png:md5,1b28d0983a895d0619c470553a1be47f", - "volcano.png:md5,198730d78767da2e46ce6e1d25f52e64", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,17074b29c8babf56c5b884c13429c81e", - "density.png:md5,919c3d2f01bae9ba6c656f0223d2d19f", - "mad_correlation.png:md5,e2033c95c4c5b3d695d65158a6a246e4", - "pca2d.png:md5,50ff3bd8c8de40f32f078fe879c72d55", - "pca3d.png:md5,c3ced5600509551d5e0410019c717445", - "sample_dendrogram.png:md5,49bcc85503e49cb9da71e86973db3263", - "boxplot.png:md5,bb306103d822eecc37c29bb07674d29f", - "density.png:md5,d5a5e915557eab1fc05a914571b27f02", - "mad_correlation.png:md5,e14dd0b2ab73187658b386dfc6227d37", - "pca2d.png:md5,ed7f1342d245d5764898b637a6530c8d", - "pca3d.png:md5,dcedf79d5795c48a57117a2279dd4a0e", - "sample_dendrogram.png:md5,bacaf55f4f5863992ce7c166cde9c5b9", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "normalizeMedian.normalized_dendrogram.png:md5,6bf22a6e3aba7d3c53dc80d3bbd2bb27", - "normalizeMedian.normalized_distributions.png:md5,39b6f96288b8cd2e7dd2d02f424d6d78", - "normalizeMedian.normalized_mean_variance_relationship.png:md5,4ed879017fcbe0ea8279bd362ac0d9bd", - "raw_distributions.png:md5,1def04dd0f8cb116164e91a6aaab11ce", - "normalizeMedian.normalized_dendrogram.png:md5,181e8e0ccad205a19414975dee1f3ca0", - "normalizeMedian.normalized_distributions.png:md5,eff54bf61eafda77f8891e41239aaf9c", - "normalizeMedian.normalized_mean_variance_relationship.png:md5,b5ba9b01fe4534191e3e577302beaead", - "raw_distributions.png:md5,086370f56bc89e418744dc77f445e5e5", - "fakebatch_fakeBatch_b1_b2_PXD043349.limma.mean_difference.png:md5,45da19bbbebe47c7b08216e585f0d6d1", - "genotype_celltype_t1_FoB_PXD043349.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", - "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", - "genotype_celltype_t1_t2_PXD043349.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", "genotype_celltype_t1_FoB_PXD043349.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", @@ -171,6 +143,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:55:28.714172369" + "timestamp": "2025-02-04T16:34:30.49106646" } } \ No newline at end of file diff --git a/tests/test_nogtf.nf.test b/tests/test_nogtf.nf.test index 263513d2..efee3f00 100644 --- a/tests/test_nogtf.nf.test +++ b/tests/test_nogtf.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index 5ae00475..0dca00b8 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -74,18 +74,8 @@ "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "volcano.png:md5,db4fda5e682a1659af157c11985d0783", - "volcano.png:md5,396facf5c1dbe8b445e3360e6280f9c1", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,25940632bb9493d3ca2868fdaffdf6c0", - "density.png:md5,042695a1d452549a92a1ba91f342cfb0", - "mad_correlation.png:md5,9fbc55281829a254a99d735a729a332f", - "pca2d.png:md5,0406ba91b742676689417add1f20ebbd", - "pca3d.png:md5,99fd4104a7c08b5eae0ff88dc7eaf0d0", - "sample_dendrogram.png:md5,4fda57a4e2b34c063d233558d509f7a8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png:md5,ed14d196fadbe460d560982ef1e2ac91", - "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", @@ -100,6 +90,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:51:49.033487904" + "timestamp": "2025-02-04T16:34:10.733187148" } } \ No newline at end of file diff --git a/tests/test_rnaseq_limma.nf.test b/tests/test_rnaseq_limma.nf.test index 5139b177..d04a74f9 100644 --- a/tests/test_rnaseq_limma.nf.test +++ b/tests/test_rnaseq_limma.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap index fe08c706..a370b614 100644 --- a/tests/test_rnaseq_limma.nf.test.snap +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -138,38 +138,18 @@ [ "treatment_mCherry_hND6__SRP254919.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", "treatment_mCherry_hND6_sample_number_SRP254919.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", - "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", - "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,fddc3f29ff4561a856cd2d58a1dfe637", - "density.png:md5,d7552dab8e578124da77edaeff22dccf", - "mad_correlation.png:md5,340df9eb381307cf4d98d79da3213e6f", - "pca2d.png:md5,ce23b7e9b1300fb83bd593781fc70648", - "pca3d.png:md5,458d2c497557113ec203fe38186f5e1c", - "sample_dendrogram.png:md5,eb02da7195194e0d56578df41022f9bf", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6__SRP254919.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", - "treatment_mCherry_hND6_sample_number_SRP254919.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,1027a6c8ec8c37be6462d3f91defcaef", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,7031641b539ba303c6188ce43c9ebe67", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", @@ -184,6 +164,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:49:21.804334557" + "timestamp": "2025-02-04T16:31:49.020898734" } } \ No newline at end of file diff --git a/tests/test_soft.nf.test b/tests/test_soft.nf.test index 0d8b6605..5cbffb7f 100644 --- a/tests/test_soft.nf.test +++ b/tests/test_soft.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap index 5ecd8940..f9cc1c5d 100644 --- a/tests/test_soft.nf.test.snap +++ b/tests/test_soft.nf.test.snap @@ -70,16 +70,8 @@ [ "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", "phenotype_uninvolved_lesional_study.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", - "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", - "density.png:md5,551c933a5d3dfe216dc000de19d9725f", - "mad_correlation.png:md5,60f9c0e924d52a569d976a3fb2c22a43", - "pca2d.png:md5,aad430028daa7ffa7cd6bea1c6c41d43", - "pca3d.png:md5,d32182b1005d696da648170f3bd9dbe8", - "sample_dendrogram.png:md5,b66045a3c9df5310f3241544c50f3fd1", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional_study.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", @@ -92,6 +84,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T13:46:38.371505567" + "timestamp": "2025-02-04T16:25:47.716237078" } } \ No newline at end of file From 80bda7bb149ce845f05ff8d722425f2002b908e5 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 17:35:22 +0000 Subject: [PATCH 28/29] fix(tests): remove unstable files from affy test snapshots --- tests/.nftignore | 9 +++++---- tests/test.nf.test | 2 +- tests/test_affy.nf.test | 7 +++---- tests/test_affy.nf.test.snap | 5 +---- tests/test_maxquant.nf.test | 2 +- tests/test_nogtf.nf.test | 2 +- tests/test_rnaseq_limma.nf.test | 2 +- tests/test_soft.nf.test | 2 +- 8 files changed, 14 insertions(+), 17 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index cfb2b95c..604f6bbe 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -5,11 +5,12 @@ report/gsea/**/*butterfly_plot.png report/gsea/**/*.gsea_report_for_hND6.tsv report/gsea/**/*.symbols.Gsea.rpt report/gsea/**/*.html -report/gsea/phenotype_uninvolved_lesional/**/*.png -report/gsea/**/phenotype_uninvolved_lesional.*.gsea_report_for_*.tsv +report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png +report/gsea/**/phenotype_uninvolved_lesional_GSE50790.*.gsea_report_for_*.tsv report/*.html report/*.zip *html shinyngs_app/**/data.rds -report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv} -report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv} +report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv} +report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv} +**/*.png diff --git a/tests/test.nf.test b/tests/test.nf.test index df2194a0..0613105c 100644 --- a/tests/test.nf.test +++ b/tests/test.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_affy.nf.test b/tests/test_affy.nf.test index 2e4bdcd8..4e612ea7 100644 --- a/tests/test_affy.nf.test +++ b/tests/test_affy.nf.test @@ -17,11 +17,10 @@ nextflow_pipeline { then { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}', - 'report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png', - 'report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv}', - 'report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv}']) + 'report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png' + ]) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index d835f6b5..1cf1e3e2 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -204,7 +204,6 @@ "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", - "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv:md5,4070abb7bce1b665cae361d1fafadc4a", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", @@ -215,8 +214,6 @@ "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv:md5,dd05ffd4fae9d1b5539d1f74c016ec5d", - "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv:md5,b3de35531f650651529c6f53d81ab1da", "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", @@ -237,6 +234,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-02-04T16:52:57.326488609" + "timestamp": "2025-02-04T17:09:00.489407892" } } \ No newline at end of file diff --git a/tests/test_maxquant.nf.test b/tests/test_maxquant.nf.test index 75c0e08d..a9c7cc7f 100644 --- a/tests/test_maxquant.nf.test +++ b/tests/test_maxquant.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_nogtf.nf.test b/tests/test_nogtf.nf.test index efee3f00..263513d2 100644 --- a/tests/test_nogtf.nf.test +++ b/tests/test_nogtf.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_rnaseq_limma.nf.test b/tests/test_rnaseq_limma.nf.test index d04a74f9..5139b177 100644 --- a/tests/test_rnaseq_limma.nf.test +++ b/tests/test_rnaseq_limma.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/test_soft.nf.test b/tests/test_soft.nf.test index 5cbffb7f..0d8b6605 100644 --- a/tests/test_soft.nf.test +++ b/tests/test_soft.nf.test @@ -18,7 +18,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot( From 8ad04dedf3216f2d00c320c1191cfa78a3b5fc8c Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 4 Feb 2025 17:41:33 +0000 Subject: [PATCH 29/29] fix(tests): remove redundant ignore png --- tests/test.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test.nf.test b/tests/test.nf.test index 0613105c..69f66447 100644 --- a/tests/test.nf.test +++ b/tests/test.nf.test @@ -50,7 +50,7 @@ nextflow_pipeline { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['**/*.png']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, { assert snapshot(