diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/__packages b/blogdown/en/sp/spr/SPRinstall_cache/html/__packages new file mode 100644 index 000000000..560927c56 --- /dev/null +++ b/blogdown/en/sp/spr/SPRinstall_cache/html/__packages @@ -0,0 +1,3 @@ +base +BiocStyle +magrittr diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.RData b/blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.RData new file mode 100644 index 000000000..957eacfee Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.rdb b/blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.rdb rename to blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.rdx b/blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.rdx rename to blogdown/en/sp/spr/SPRinstall_cache/html/setup_8554bf6df8df60863ac5aab935273910.rdx diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.RData b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.RData new file mode 100644 index 000000000..f233c13e1 Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.rdb b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.rdb rename to blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.rdx b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.rdx rename to blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_ed0b32c45b1ec6c9ba18b7f1fc35abd5.rdx diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.RData b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.RData new file mode 100644 index 000000000..690cd8234 Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.rdb b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.rdb rename to blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.rdx b/blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.rdx rename to blogdown/en/sp/spr/SPRinstall_cache/html/spr_install_gh_2b6d5e464b583c5c810abaf808720c6b.rdx diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.RData b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.RData new file mode 100644 index 000000000..e362a944f Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.RData differ diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdb b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdb new file mode 100644 index 000000000..802fe729c Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdb differ diff --git a/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdx b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdx new file mode 100644 index 000000000..1e93f4a4d Binary files /dev/null and b/blogdown/en/sp/spr/SPRinstall_cache/html/table_tools_9e871a9d4d440e5569f5a8245d835a28.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/__packages b/blogdown/en/sp/spr/cwl_and_spr_cache/html/__packages new file mode 100644 index 000000000..fe74ef528 --- /dev/null +++ b/blogdown/en/sp/spr/cwl_and_spr_cache/html/__packages @@ -0,0 +1,18 @@ +base +BiocStyle +BiocGenerics +S4Vectors +IRanges +GenomeInfoDb +GenomicRanges +XVector +Biostrings +Rsamtools +BiocParallel +matrixStats +MatrixGenerics +Biobase +SummarizedExperiment +GenomicAlignments +ShortRead +systemPipeR diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.RData new file mode 100644 index 000000000..ec17a6eab Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdb new file mode 100644 index 000000000..e1ab54f7c Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdx new file mode 100644 index 000000000..f0b001f72 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/cmd_8647f3c24634f286f339e97b5b1d1825.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.RData new file mode 100644 index 000000000..6c3bb83c7 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdb new file mode 100644 index 000000000..e4cbc31a1 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdx new file mode 100644 index 000000000..e3e31ba81 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_7a988beda51686a1c5ac71abbff946a0.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.RData new file mode 100644 index 000000000..ecfcb174a Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdb new file mode 100644 index 000000000..82e52028e Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdx new file mode 100644 index 000000000..d70775416 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/fromFile_example_1b555c44be60a54b3033b2114ccf1fa2.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.RData new file mode 100644 index 000000000..ae5573815 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/saving_2d299f30249cc0d5e41333077c76e8e3.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.RData new file mode 100644 index 000000000..7e27f2bab Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/setup_bd6c1bf6973b99e71a771d4e62b92047.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.RData new file mode 100644 index 000000000..81ed68c3f Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/sprCWL_573b4ccede3d1318f305a55df0d7d7b6.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.RData new file mode 100644 index 000000000..1eb6664bb Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-10_254288b1863220aad693e0a161d4d01a.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.RData new file mode 100644 index 000000000..ff70bcfdd Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-11_562d9ac1a4c0149dc624b3d9bdb5b2f7.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.RData new file mode 100644 index 000000000..c367043d6 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-12_6f3df6dfbed410d1649bd70a4cf4f9f2.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.RData new file mode 100644 index 000000000..63b6a9aff Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdb new file mode 100644 index 000000000..0c02e43c8 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdx new file mode 100644 index 000000000..73e9013ee Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-1_3637c76f278eea2e30ee682137ae64dd.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.RData new file mode 100644 index 000000000..320d97291 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdb new file mode 100644 index 000000000..ed1c42893 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdx new file mode 100644 index 000000000..732712df8 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-2_8fbdfb7ab02202bbb3a4669b224e64ad.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.RData new file mode 100644 index 000000000..15aedeea5 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdb new file mode 100644 index 000000000..31024774c Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdx new file mode 100644 index 000000000..c1794c4e2 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-3_4669f51f2d06a5ff2424307335b510e7.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.RData new file mode 100644 index 000000000..5b57d14ef Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.rdb similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.rdb rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.rdb diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.rdx similarity index 100% rename from blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.rdx rename to blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-4_6b121f769a440d9356ebd7e14395c2d7.rdx diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.RData new file mode 100644 index 000000000..53856b157 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdb new file mode 100644 index 000000000..65ff4d0f3 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdx new file mode 100644 index 000000000..071b9e61f Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-5_f2003fcccde8bf1b68dad8759d8307a0.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.RData new file mode 100644 index 000000000..5f8b423cb Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdb new file mode 100644 index 000000000..6ffa88467 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdx new file mode 100644 index 000000000..33d46b383 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-6_f867ffd750ab31b87b2fc1a705f836cb.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.RData new file mode 100644 index 000000000..0881c6a41 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdb new file mode 100644 index 000000000..3a4e4eb18 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdx new file mode 100644 index 000000000..867f168d5 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-7_ba0b20103b2b53a332834a503a82d1c6.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.RData new file mode 100644 index 000000000..9b69e5592 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdb new file mode 100644 index 000000000..1fb2581e4 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdx new file mode 100644 index 000000000..adc40c023 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-8_212fc6a35e2c23a66fbd86b67c37af93.rdx differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.RData b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.RData new file mode 100644 index 000000000..3d85f65f1 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.RData differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdb b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdb new file mode 100644 index 000000000..06a29fe45 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdb differ diff --git a/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdx b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdx new file mode 100644 index 000000000..4e110022c Binary files /dev/null and b/blogdown/en/sp/spr/cwl_and_spr_cache/html/unnamed-chunk-9_79cbafb0b324cc2b4cb6f9e4a5758c2d.rdx differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/__packages b/blogdown/en/sp/spr/cwl_syntax_cache/html/__packages new file mode 100644 index 000000000..400c69a17 --- /dev/null +++ b/blogdown/en/sp/spr/cwl_syntax_cache/html/__packages @@ -0,0 +1,22 @@ +base +BiocStyle +BiocGenerics +S4Vectors +IRanges +GenomeInfoDb +GenomicRanges +XVector +Biostrings +Rsamtools +BiocParallel +matrixStats +MatrixGenerics +Biobase +SummarizedExperiment +GenomicAlignments +ShortRead +systemPipeR +ggplot2 +ape +batchtools +magrittr diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.RData new file mode 100644 index 000000000..3b62d489a Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.RData differ diff --git a/content/en/sp/spr/steps_cache/html/align_stats1_6e425d027079265be0428b9b061929a9.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats1_6e425d027079265be0428b9b061929a9.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.rdb diff --git a/content/en/sp/spr/steps_cache/html/align_stats1_6e425d027079265be0428b9b061929a9.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats1_6e425d027079265be0428b9b061929a9.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/setup_f6425e5fdb93d4f1c87289d40be83e93.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.RData new file mode 100644 index 000000000..91e558db8 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.RData differ diff --git a/content/en/sp/spr/steps_cache/html/align_stats2_206329667a843ede0f348976a3373d75.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats2_206329667a843ede0f348976a3373d75.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.rdb diff --git a/content/en/sp/spr/steps_cache/html/align_stats2_206329667a843ede0f348976a3373d75.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats2_206329667a843ede0f348976a3373d75.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/sysargslistImage_4a77d472d2b5fd188374b09f78fc622d.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.RData new file mode 100644 index 000000000..b396a26ad Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.RData differ diff --git a/content/en/sp/spr/steps_cache/html/align_stats_parallel_6ddd1cc8f83287812e4b39a8e7fa882b.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats_parallel_6ddd1cc8f83287812e4b39a8e7fa882b.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.rdb diff --git a/content/en/sp/spr/steps_cache/html/align_stats_parallel_6ddd1cc8f83287812e4b39a8e7fa882b.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats_parallel_6ddd1cc8f83287812e4b39a8e7fa882b.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-10_c0e7f0497cc06fb9c187ccdfdbfa9679.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.RData new file mode 100644 index 000000000..16eb36ab6 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.RData differ diff --git a/content/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_4a193b9254d3c3fe1d20387fdfa0c528.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_4a193b9254d3c3fe1d20387fdfa0c528.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.rdb diff --git a/content/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_4a193b9254d3c3fe1d20387fdfa0c528.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_4a193b9254d3c3fe1d20387fdfa0c528.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-11_d7e9dde92d75d3dc2df0b2cecf51050e.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.RData new file mode 100644 index 000000000..3cd9f802d Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_31f13017dcefa8ecddf8e70e9cd6b8cc.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_31f13017dcefa8ecddf8e70e9cd6b8cc.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.rdb diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_31f13017dcefa8ecddf8e70e9cd6b8cc.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_31f13017dcefa8ecddf8e70e9cd6b8cc.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-12_4bc9a4053f1a375926d500df16430206.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.RData new file mode 100644 index 000000000..cb0e12236 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.RData differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdb new file mode 100644 index 000000000..7984afd11 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdb differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdx new file mode 100644 index 000000000..15680a9f8 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-1_e0d2518256449035114ca43fd205bb34.rdx differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.RData new file mode 100644 index 000000000..cdc198e89 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_cluster_0e5f9f8827f83e36bdce0e82a5e4b271.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_cluster_0e5f9f8827f83e36bdce0e82a5e4b271.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.rdb diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_cluster_0e5f9f8827f83e36bdce0e82a5e4b271.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_cluster_0e5f9f8827f83e36bdce0e82a5e4b271.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-2_e1c7d0d19e98268acafa9b08e88f4cc3.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.RData new file mode 100644 index 000000000..4c0e6aca8 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_index_7f826e8bfa28138ff85f9fb1fba0804d.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_index_7f826e8bfa28138ff85f9fb1fba0804d.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.rdb diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_index_7f826e8bfa28138ff85f9fb1fba0804d.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_index_7f826e8bfa28138ff85f9fb1fba0804d.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-3_3f2f1f3390a0c8029d9922f16935668f.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.RData new file mode 100644 index 000000000..cb4f8a385 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_sm_72f3af538b704311ef8c8291da780a81.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_sm_72f3af538b704311ef8c8291da780a81.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.rdb diff --git a/content/en/sp/spr/steps_cache/html/bowtie2_sm_72f3af538b704311ef8c8291da780a81.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie2_sm_72f3af538b704311ef8c8291da780a81.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-4_83d550da57123d3e692603835945f79a.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.RData new file mode 100644 index 000000000..a1619cf42 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bowtie_index_6e801a7d652bf85f09e7272fe4b5df45.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie_index_6e801a7d652bf85f09e7272fe4b5df45.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.rdb diff --git a/content/en/sp/spr/steps_cache/html/bowtie_index_6e801a7d652bf85f09e7272fe4b5df45.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bowtie_index_6e801a7d652bf85f09e7272fe4b5df45.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-5_a9c9d5f66640fd92f7702ad04213d846.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.RData new file mode 100644 index 000000000..47f5ea2d3 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bwa-pe_alignment_0a3503d3dc6a5034457f393fcd91e102.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bwa-pe_alignment_0a3503d3dc6a5034457f393fcd91e102.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.rdb diff --git a/content/en/sp/spr/steps_cache/html/bwa-pe_alignment_0a3503d3dc6a5034457f393fcd91e102.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bwa-pe_alignment_0a3503d3dc6a5034457f393fcd91e102.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-6_691650d13355ffeeddc7c2646fabbe7d.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.RData new file mode 100644 index 000000000..a1f65ac7d Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.RData differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdb new file mode 100644 index 000000000..30d904727 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdb differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdx new file mode 100644 index 000000000..41d7bef66 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-7_7004a3496142fd70c0da8423c979ac50.rdx differ diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.RData new file mode 100644 index 000000000..7e719e2c2 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.RData differ diff --git a/content/en/sp/spr/steps_cache/html/bwa_index_8012e619b7f89c3bcf4e5a1f32d78057.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/bwa_index_8012e619b7f89c3bcf4e5a1f32d78057.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.rdb diff --git a/content/en/sp/spr/steps_cache/html/bwa_index_8012e619b7f89c3bcf4e5a1f32d78057.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/bwa_index_8012e619b7f89c3bcf4e5a1f32d78057.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-8_1419ee623e5d95e05d4b9cdeaba06cc9.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.RData new file mode 100644 index 000000000..38177b642 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.RData differ diff --git a/content/en/sp/spr/steps_cache/html/clusterRun_args_ad7fc3ced89063c2d9a2708058e9e159.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/clusterRun_args_ad7fc3ced89063c2d9a2708058e9e159.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.rdb diff --git a/content/en/sp/spr/steps_cache/html/clusterRun_args_ad7fc3ced89063c2d9a2708058e9e159.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/clusterRun_args_ad7fc3ced89063c2d9a2708058e9e159.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/unnamed-chunk-9_d0114035a6e9941e2d51340ed9c5fbfa.rdx diff --git a/blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.RData b/blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.RData new file mode 100644 index 000000000..2789ad740 Binary files /dev/null and b/blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.RData differ diff --git a/content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_947cd154bf9a4f037f5d3369680b2b09.rdb b/blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_947cd154bf9a4f037f5d3369680b2b09.rdb rename to blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.rdb diff --git a/content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_947cd154bf9a4f037f5d3369680b2b09.rdx b/blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_947cd154bf9a4f037f5d3369680b2b09.rdx rename to blogdown/en/sp/spr/cwl_syntax_cache/html/utilities_52eb2521606b0d36c64b2830e8402e7b.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.RData deleted file mode 100644 index 4a2dca944..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_099c5009c8c8298a23befa3ba15f24d7.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.RData new file mode 100644 index 000000000..4e9eb758a Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.RData differ diff --git a/content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_76dd283f4ac409fb76a14cdc8b0a1f66.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_76dd283f4ac409fb76a14cdc8b0a1f66.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.rdb diff --git a/content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_76dd283f4ac409fb76a14cdc8b0a1f66.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_76dd283f4ac409fb76a14cdc8b0a1f66.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/cleaning_af88f1bc1bb0e2057ad9574402ceed22.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/comment_lines_a751a89d87bb00e5f1af74a63fb49a1c.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/comment_lines_a751a89d87bb00e5f1af74a63fb49a1c.RData index 9d1d5eba4..5a742fb98 100644 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/comment_lines_a751a89d87bb00e5f1af74a63fb49a1c.RData and b/blogdown/en/sp/spr/gettingstarted_cache/html/comment_lines_a751a89d87bb00e5f1af74a63fb49a1c.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.RData deleted file mode 100644 index 9b74a8119..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/dir_3f0833b061790677c6646f0fcb766916.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.RData new file mode 100644 index 000000000..02a25db25 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.RData differ diff --git a/content/en/sp/spr/steps_cache/html/create_txdb_e52d7977be69727f22b38eae45736584.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/create_txdb_e52d7977be69727f22b38eae45736584.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.rdb diff --git a/content/en/sp/spr/steps_cache/html/create_txdb_e52d7977be69727f22b38eae45736584.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/create_txdb_e52d7977be69727f22b38eae45736584.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/dir_d9f91c6228ae83cccffeb400a69bb949.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.RData new file mode 100644 index 000000000..a8b161557 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.RData differ diff --git a/content/en/sp/spr/steps_cache/html/custom_preprocessing_b01b3c1d8fb554e4ea67c8d2c506cac3.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/custom_preprocessing_b01b3c1d8fb554e4ea67c8d2c506cac3.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.rdb diff --git a/content/en/sp/spr/steps_cache/html/custom_preprocessing_b01b3c1d8fb554e4ea67c8d2c506cac3.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/custom_preprocessing_b01b3c1d8fb554e4ea67c8d2c506cac3.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/documentation_108296e6faff1ad3205187446fd230ad.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.RData deleted file mode 100644 index 8f3fd9757..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_3369537b5da7730cafdc54b7e06bce1a.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.RData deleted file mode 100644 index f951b1a43..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/documentation_cf1d4843db726ce663b2bf916e2f450b.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.RData deleted file mode 100644 index bbf7a454c..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/install_0ebfe8510aceb616bf6e78aee75d88e2.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.RData deleted file mode 100644 index 0161d7914..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/install_7b263913cc8ee3c735574321403e08b8.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.RData new file mode 100644 index 000000000..3fa61a59b Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.RData differ diff --git a/content/en/sp/spr/steps_cache/html/edger_deg_stats_e14bc959538ccf0771fd4fd76583fdf3.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_deg_stats_e14bc959538ccf0771fd4fd76583fdf3.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.rdb diff --git a/content/en/sp/spr/steps_cache/html/edger_deg_stats_e14bc959538ccf0771fd4fd76583fdf3.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_deg_stats_e14bc959538ccf0771fd4fd76583fdf3.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/install_deda95614c78b56fa13821d4a76a10a2.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.RData new file mode 100644 index 000000000..1d12342af Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.RData differ diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_41ee5fb48c2db6578f459be8ce9ccd0c.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_41ee5fb48c2db6578f459be8ce9ccd0c.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.rdb diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_41ee5fb48c2db6578f459be8ce9ccd0c.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_41ee5fb48c2db6578f459be8ce9ccd0c.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/setup_0791de71a9b1c983efd747e47ada9ceb.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.RData deleted file mode 100644 index f3c1ca180..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_364d4b0afd20170202ebe6c445f9700f.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.RData deleted file mode 100644 index 374bd8302..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/setup_b2105ac0d2ccba413cf8eafdb5073f26.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.RData new file mode 100644 index 000000000..0fd911d1e Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.RData differ diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_49f0d1290e28b1bf7cf8daf58c4e4064.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_49f0d1290e28b1bf7cf8daf58c4e4064.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.rdb diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_49f0d1290e28b1bf7cf8daf58c4e4064.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_49f0d1290e28b1bf7cf8daf58c4e4064.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_4012986a1ec65274e17a3eb3f36661a7.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.RData deleted file mode 100644 index c4c57df34..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsFig_5c9371815426b7b2e17a029843a1690b.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.RData deleted file mode 100644 index 5455b9f3f..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdb deleted file mode 100644 index 3a8b22621..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdb and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdx deleted file mode 100644 index 32714e45e..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_876f242ada989683e2dff3045126207e.rdx and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.RData new file mode 100644 index 000000000..e37ed0962 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdb new file mode 100644 index 000000000..5bddec2f0 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdb differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdx new file mode 100644 index 000000000..8cc364377 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsPE_9e629ff07f8f09da5e18cec03dcbd90e.rdx differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.RData deleted file mode 100644 index cfc9164e0..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdb deleted file mode 100644 index bbf65191d..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdb and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdx deleted file mode 100644 index 0a2b0e7e1..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_0f0d8e9ecd132a6c5a9f4a50776e1de0.rdx and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.RData new file mode 100644 index 000000000..9fb369786 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdb new file mode 100644 index 000000000..1d45b91cd Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdb differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdx new file mode 100644 index 000000000..5cf2cb8c5 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetsSE_2c23d1d347f9a7bad3cf2c2ab93336a6.rdx differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.RData deleted file mode 100644 index 44afc7912..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.RData and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdb deleted file mode 100644 index bd42277e7..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdb and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdx deleted file mode 100644 index 915a2ed8d..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_41cd78bb9c41eb6afff6e76a658b31aa.rdx and /dev/null differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.RData new file mode 100644 index 000000000..2c9026c40 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.RData differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdb new file mode 100644 index 000000000..d30825b69 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdb differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdx new file mode 100644 index 000000000..3c881df81 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targets_echo_5df2e9f765638460a19da30048dd2671.rdx differ diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.RData new file mode 100644 index 000000000..3b57554e9 Binary files /dev/null and b/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.RData differ diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_5b1564106f2b840be6480447b9cd5d70.rdb b/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_5b1564106f2b840be6480447b9cd5d70.rdb rename to blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.rdb diff --git a/content/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_5b1564106f2b840be6480447b9cd5d70.rdx b/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_5b1564106f2b840be6480447b9cd5d70.rdx rename to blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_79d62d33ebd81a0807bd482b7bdd7768.rdx diff --git a/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.RData b/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.RData deleted file mode 100644 index 702ef48f0..000000000 Binary files a/blogdown/en/sp/spr/gettingstarted_cache/html/targetscomp_a16aec4247ee217dbaf82f15ba34e9d0.RData and /dev/null differ diff --git a/content/en/sp/spr/steps_cache/html/__packages b/blogdown/en/sp/spr/steps_cache/html/__packages similarity index 100% rename from content/en/sp/spr/steps_cache/html/__packages rename to blogdown/en/sp/spr/steps_cache/html/__packages diff --git a/blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.RData b/blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.RData new file mode 100644 index 000000000..00808df36 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.RData differ diff --git a/content/en/sp/spr/steps_cache/html/get_go_biomart_4dc593b5439f1dec6fcfd43518db4beb.rdb b/blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/get_go_biomart_4dc593b5439f1dec6fcfd43518db4beb.rdb rename to blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.rdb diff --git a/content/en/sp/spr/steps_cache/html/get_go_biomart_4dc593b5439f1dec6fcfd43518db4beb.rdx b/blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/get_go_biomart_4dc593b5439f1dec6fcfd43518db4beb.rdx rename to blogdown/en/sp/spr/steps_cache/html/align_stats1_bbed94d6c92615d94d5d3f175e681c09.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.RData b/blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.RData new file mode 100644 index 000000000..c8c5aab53 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.RData differ diff --git a/content/en/sp/spr/steps_cache/html/go_enrichment_35387ce89176d3f0e4f98b66acca148f.rdb b/blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/go_enrichment_35387ce89176d3f0e4f98b66acca148f.rdb rename to blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.rdb diff --git a/content/en/sp/spr/steps_cache/html/go_enrichment_35387ce89176d3f0e4f98b66acca148f.rdx b/blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/go_enrichment_35387ce89176d3f0e4f98b66acca148f.rdx rename to blogdown/en/sp/spr/steps_cache/html/align_stats2_f22d201c8f92ffb5670975c1ff8dd45f.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.RData b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.RData new file mode 100644 index 000000000..883023561 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.RData differ diff --git a/content/en/sp/spr/steps_cache/html/gsnap_89ae5ce91c3357980d46051cad056c24.rdb b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/gsnap_89ae5ce91c3357980d46051cad056c24.rdb rename to blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.rdb diff --git a/content/en/sp/spr/steps_cache/html/gsnap_89ae5ce91c3357980d46051cad056c24.rdx b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/gsnap_89ae5ce91c3357980d46051cad056c24.rdx rename to blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_cluster_086068d906c9258c3ce3f182b66b95a8.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.RData b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.RData new file mode 100644 index 000000000..bf9893e60 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.RData differ diff --git a/content/en/sp/spr/steps_cache/html/hierarchical_clustering_05d3ce56f6243ea7b6e6ec456a5ca350.rdb b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/hierarchical_clustering_05d3ce56f6243ea7b6e6ec456a5ca350.rdb rename to blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.rdb diff --git a/content/en/sp/spr/steps_cache/html/hierarchical_clustering_05d3ce56f6243ea7b6e6ec456a5ca350.rdx b/blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/hierarchical_clustering_05d3ce56f6243ea7b6e6ec456a5ca350.rdx rename to blogdown/en/sp/spr/steps_cache/html/align_stats_parallel_e979f127f5223d5a7a6264536e6c117c.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.RData b/blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.RData new file mode 100644 index 000000000..68534d1da Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.RData differ diff --git a/content/en/sp/spr/steps_cache/html/hisat_alignment_e669aa8f2ed56a267110172c4013bce1.rdb b/blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/hisat_alignment_e669aa8f2ed56a267110172c4013bce1.rdb rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.rdb diff --git a/content/en/sp/spr/steps_cache/html/hisat_alignment_e669aa8f2ed56a267110172c4013bce1.rdx b/blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/hisat_alignment_e669aa8f2ed56a267110172c4013bce1.rdx rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_SYSargs2_0ba1c929e47af08723bdbef9dcaa06f5.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.RData b/blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.RData new file mode 100644 index 000000000..387c5c1f5 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.RData differ diff --git a/content/en/sp/spr/steps_cache/html/hisat_index_25d74645d1f7b27eb56822ad36381b7b.rdb b/blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/hisat_index_25d74645d1f7b27eb56822ad36381b7b.rdb rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.rdb diff --git a/content/en/sp/spr/steps_cache/html/hisat_index_25d74645d1f7b27eb56822ad36381b7b.rdx b/blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/hisat_index_25d74645d1f7b27eb56822ad36381b7b.rdx rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_cluster_84541c2641463ee0551ec93af01350c7.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.RData b/blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.RData new file mode 100644 index 000000000..7b172a4c5 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.RData differ diff --git a/content/en/sp/spr/steps_cache/html/igv_ece3317146f7e7ed97ce2d0de59851e1.rdb b/blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/igv_ece3317146f7e7ed97ce2d0de59851e1.rdb rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.rdb diff --git a/content/en/sp/spr/steps_cache/html/igv_ece3317146f7e7ed97ce2d0de59851e1.rdx b/blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/igv_ece3317146f7e7ed97ce2d0de59851e1.rdx rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_index_8382c5228cd478f2ba6ab0e21a013b3d.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.RData b/blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.RData new file mode 100644 index 000000000..1cdcc79d4 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.RData differ diff --git a/content/en/sp/spr/steps_cache/html/load_package_6f6a70fd05972b085fe84dd1bd54ac76.rdb b/blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/load_package_6f6a70fd05972b085fe84dd1bd54ac76.rdb rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.rdb diff --git a/content/en/sp/spr/steps_cache/html/load_package_6f6a70fd05972b085fe84dd1bd54ac76.rdx b/blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/load_package_6f6a70fd05972b085fe84dd1bd54ac76.rdx rename to blogdown/en/sp/spr/steps_cache/html/bowtie2_sm_b18a741dd5326898fa27fea0f9d1cc84.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.RData b/blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.RData new file mode 100644 index 000000000..0e813c87d Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.RData differ diff --git a/content/en/sp/spr/steps_cache/html/output_865596eb82456661421f2c6f4e555b0a.rdb b/blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/output_865596eb82456661421f2c6f4e555b0a.rdb rename to blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.rdb diff --git a/content/en/sp/spr/steps_cache/html/output_865596eb82456661421f2c6f4e555b0a.rdx b/blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/output_865596eb82456661421f2c6f4e555b0a.rdx rename to blogdown/en/sp/spr/steps_cache/html/bowtie_index_394fac0e0b547f4c75bde11c859ff908.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.RData b/blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.RData new file mode 100644 index 000000000..99924e963 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.RData differ diff --git a/content/en/sp/spr/steps_cache/html/plot_go_enrichment_833c2c54a3520f2b1070d876a70dec01.rdb b/blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/plot_go_enrichment_833c2c54a3520f2b1070d876a70dec01.rdb rename to blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.rdb diff --git a/content/en/sp/spr/steps_cache/html/plot_go_enrichment_833c2c54a3520f2b1070d876a70dec01.rdx b/blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/plot_go_enrichment_833c2c54a3520f2b1070d876a70dec01.rdx rename to blogdown/en/sp/spr/steps_cache/html/bwa-pe_alignment_e03c6c80578d0fbed2bef40b5f062b07.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.RData b/blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.RData new file mode 100644 index 000000000..330d9a3a2 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.RData differ diff --git a/content/en/sp/spr/steps_cache/html/preprocessing_56b1b4000496862fe9f3bceb787719a5.rdb b/blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/preprocessing_56b1b4000496862fe9f3bceb787719a5.rdb rename to blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.rdb diff --git a/content/en/sp/spr/steps_cache/html/preprocessing_56b1b4000496862fe9f3bceb787719a5.rdx b/blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/preprocessing_56b1b4000496862fe9f3bceb787719a5.rdx rename to blogdown/en/sp/spr/steps_cache/html/bwa_index_745e218536bf605c1bac0002d3baf091.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.RData b/blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.RData new file mode 100644 index 000000000..e62650752 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.RData differ diff --git a/content/en/sp/spr/steps_cache/html/process_monitoring_2e6e25d17bd7df07433846378baa2936.rdb b/blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/process_monitoring_2e6e25d17bd7df07433846378baa2936.rdb rename to blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.rdb diff --git a/content/en/sp/spr/steps_cache/html/process_monitoring_2e6e25d17bd7df07433846378baa2936.rdx b/blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/process_monitoring_2e6e25d17bd7df07433846378baa2936.rdx rename to blogdown/en/sp/spr/steps_cache/html/clusterRun_args_79c841a002a5de4486783c2c3c31d530.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.RData b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.RData new file mode 100644 index 000000000..654b891c8 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.RData differ diff --git a/content/en/sp/spr/steps_cache/html/read_counting_mirna_66b5a07a5be94ab1e2f670cec2fc67fd.rdb b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_mirna_66b5a07a5be94ab1e2f670cec2fc67fd.rdb rename to blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.rdb diff --git a/content/en/sp/spr/steps_cache/html/read_counting_mirna_66b5a07a5be94ab1e2f670cec2fc67fd.rdx b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_mirna_66b5a07a5be94ab1e2f670cec2fc67fd.rdx rename to blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-pe_158bfd8b75e929f8c402a13f131e5dd2.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.RData b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.RData new file mode 100644 index 000000000..d38b73adf Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.RData differ diff --git a/content/en/sp/spr/steps_cache/html/read_counting_multicore_41871f98000ea684a2e2cda2cdde5a81.rdb b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_multicore_41871f98000ea684a2e2cda2cdde5a81.rdb rename to blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.rdb diff --git a/content/en/sp/spr/steps_cache/html/read_counting_multicore_41871f98000ea684a2e2cda2cdde5a81.rdx b/blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_multicore_41871f98000ea684a2e2cda2cdde5a81.rdx rename to blogdown/en/sp/spr/steps_cache/html/construct_SYSargs2_trim-se_8b5ebda9947aba81a017f76a7779eb82.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.RData b/blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.RData new file mode 100644 index 000000000..ceeb72752 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.RData differ diff --git a/content/en/sp/spr/steps_cache/html/read_counting_multinode_03a1e0fc570dbee395c0fed986f615f0.rdb b/blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_multinode_03a1e0fc570dbee395c0fed986f615f0.rdb rename to blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.rdb diff --git a/content/en/sp/spr/steps_cache/html/read_counting_multinode_03a1e0fc570dbee395c0fed986f615f0.rdx b/blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/read_counting_multinode_03a1e0fc570dbee395c0fed986f615f0.rdx rename to blogdown/en/sp/spr/steps_cache/html/create_txdb_e4df674f257dbf4b02caf293e331b31e.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.RData b/blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.RData new file mode 100644 index 000000000..f3397d483 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.RData differ diff --git a/content/en/sp/spr/steps_cache/html/rsubread_1ac9c4d5dc0336480fc5e5de040febb9.rdb b/blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/rsubread_1ac9c4d5dc0336480fc5e5de040febb9.rdb rename to blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.rdb diff --git a/content/en/sp/spr/steps_cache/html/rsubread_1ac9c4d5dc0336480fc5e5de040febb9.rdx b/blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/rsubread_1ac9c4d5dc0336480fc5e5de040febb9.rdx rename to blogdown/en/sp/spr/steps_cache/html/custom_preprocessing_cbfb8462495e4f2be1a150bf301deae0.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.RData b/blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.RData new file mode 100644 index 000000000..b451d8364 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.RData differ diff --git a/content/en/sp/spr/steps_cache/html/deseq2_deg_counts_486957f565e99d9ddc5a6e45d7683ded.rdb b/blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/deseq2_deg_counts_486957f565e99d9ddc5a6e45d7683ded.rdb rename to blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.rdb diff --git a/content/en/sp/spr/steps_cache/html/deseq2_deg_counts_486957f565e99d9ddc5a6e45d7683ded.rdx b/blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/deseq2_deg_counts_486957f565e99d9ddc5a6e45d7683ded.rdx rename to blogdown/en/sp/spr/steps_cache/html/deseq2_deg_counts_26dc89b184693371049e7082d894b2a1.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.RData b/blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.RData new file mode 100644 index 000000000..a7b06bebf Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.RData differ diff --git a/content/en/sp/spr/steps_cache/html/deseq2_wrapper_bc871c74bafc63343820156ac0c8fc0c.rdb b/blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/deseq2_wrapper_bc871c74bafc63343820156ac0c8fc0c.rdb rename to blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.rdb diff --git a/content/en/sp/spr/steps_cache/html/deseq2_wrapper_bc871c74bafc63343820156ac0c8fc0c.rdx b/blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/deseq2_wrapper_bc871c74bafc63343820156ac0c8fc0c.rdx rename to blogdown/en/sp/spr/steps_cache/html/deseq2_wrapper_9f0ac28bd96218989eff50345fdc6460.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.RData b/blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.RData new file mode 100644 index 000000000..22a75f46b Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.RData differ diff --git a/content/en/sp/spr/steps_cache/html/edger_deg_counts_4b283f3f029939b2d9ca463b6ebc5bdc.rdb b/blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_deg_counts_4b283f3f029939b2d9ca463b6ebc5bdc.rdb rename to blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.rdb diff --git a/content/en/sp/spr/steps_cache/html/edger_deg_counts_4b283f3f029939b2d9ca463b6ebc5bdc.rdx b/blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_deg_counts_4b283f3f029939b2d9ca463b6ebc5bdc.rdx rename to blogdown/en/sp/spr/steps_cache/html/edger_deg_counts_cc09379f2c605cdf8f43fafdb766ddf6.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.RData b/blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.RData new file mode 100644 index 000000000..52b4c5896 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.RData differ diff --git a/content/en/sp/spr/steps_cache/html/runCommandline_align_35bd45e3201e14ca6e386f36a01b3e2b.rdb b/blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/runCommandline_align_35bd45e3201e14ca6e386f36a01b3e2b.rdb rename to blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.rdb diff --git a/content/en/sp/spr/steps_cache/html/runCommandline_align_35bd45e3201e14ca6e386f36a01b3e2b.rdx b/blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/runCommandline_align_35bd45e3201e14ca6e386f36a01b3e2b.rdx rename to blogdown/en/sp/spr/steps_cache/html/edger_deg_stats_174f0af974b06e7eef9cdf3cc03c85b9.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.RData b/blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.RData new file mode 100644 index 000000000..c0c17aa48 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.RData differ diff --git a/content/en/sp/spr/steps_cache/html/edger_wrapper_1c7ea98bdb048701e6b14cf866decf9a.rdb b/blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_wrapper_1c7ea98bdb048701e6b14cf866decf9a.rdb rename to blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.rdb diff --git a/content/en/sp/spr/steps_cache/html/edger_wrapper_1c7ea98bdb048701e6b14cf866decf9a.rdx b/blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/edger_wrapper_1c7ea98bdb048701e6b14cf866decf9a.rdx rename to blogdown/en/sp/spr/steps_cache/html/edger_wrapper_812f9ce7e5aadc6b316f29b4b58f7fcc.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.RData b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.RData new file mode 100644 index 000000000..2f89d5fa4 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.RData differ diff --git a/content/en/sp/spr/steps_cache/html/sample_tree_rpkm_1f9226dec5d65932acf8cdc1853468ea.rdb b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/sample_tree_rpkm_1f9226dec5d65932acf8cdc1853468ea.rdb rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.rdb diff --git a/content/en/sp/spr/steps_cache/html/sample_tree_rpkm_1f9226dec5d65932acf8cdc1853468ea.rdx b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/sample_tree_rpkm_1f9226dec5d65932acf8cdc1853468ea.rdx rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_a043cbf691f8c697b612554b66dfbd1f.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.RData b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.RData new file mode 100644 index 000000000..2498138f5 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.RData differ diff --git a/content/en/sp/spr/steps_cache/html/setup_2fda07be3e05c55236ab5847520a2087.rdb b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/setup_2fda07be3e05c55236ab5847520a2087.rdb rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.rdb diff --git a/content/en/sp/spr/steps_cache/html/setup_2fda07be3e05c55236ab5847520a2087.rdx b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/setup_2fda07be3e05c55236ab5847520a2087.rdx rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_cluster_5930e862fa2c06bba1ddefa75a6b12a2.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.RData b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.RData new file mode 100644 index 000000000..5f71150eb Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.RData differ diff --git a/content/en/sp/spr/steps_cache/html/subset_22f1033586d00a8365e3c1c4a555d7f2.rdb b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/subset_22f1033586d00a8365e3c1c4a555d7f2.rdb rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.rdb diff --git a/content/en/sp/spr/steps_cache/html/subset_22f1033586d00a8365e3c1c4a555d7f2.rdx b/blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/subset_22f1033586d00a8365e3c1c4a555d7f2.rdx rename to blogdown/en/sp/spr/steps_cache/html/fastq_quality_parallel_single_c1c22d513aeb52b380886b80d7cf724b.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.RData b/blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.RData new file mode 100644 index 000000000..113ac666f Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.RData differ diff --git a/content/en/sp/spr/steps_cache/html/tophat2-pe_39e3d4ebb1c6758ad27f70af59ec263b.rdb b/blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/tophat2-pe_39e3d4ebb1c6758ad27f70af59ec263b.rdb rename to blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.rdb diff --git a/content/en/sp/spr/steps_cache/html/tophat2-pe_39e3d4ebb1c6758ad27f70af59ec263b.rdx b/blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/tophat2-pe_39e3d4ebb1c6758ad27f70af59ec263b.rdx rename to blogdown/en/sp/spr/steps_cache/html/get_go_biomart_3168324c96b7503b8bea4e31e403b9f3.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.RData b/blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.RData new file mode 100644 index 000000000..237792819 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.RData differ diff --git a/content/en/sp/spr/steps_cache/html/tophat2-pe_parallel_0258d3c3463d17bf2fd452604716766c.rdb b/blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/tophat2-pe_parallel_0258d3c3463d17bf2fd452604716766c.rdb rename to blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.rdb diff --git a/content/en/sp/spr/steps_cache/html/tophat2-pe_parallel_0258d3c3463d17bf2fd452604716766c.rdx b/blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/tophat2-pe_parallel_0258d3c3463d17bf2fd452604716766c.rdx rename to blogdown/en/sp/spr/steps_cache/html/go_enrichment_a398c83f7d02024aab9e5e150ff5e13e.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.RData b/blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.RData new file mode 100644 index 000000000..c31f542e1 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.RData differ diff --git a/content/en/sp/spr/steps_cache/html/trimGalore_1d27f0b61e1f1a75ea8a5e860695f1e5.rdb b/blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/trimGalore_1d27f0b61e1f1a75ea8a5e860695f1e5.rdb rename to blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.rdb diff --git a/content/en/sp/spr/steps_cache/html/trimGalore_1d27f0b61e1f1a75ea8a5e860695f1e5.rdx b/blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/trimGalore_1d27f0b61e1f1a75ea8a5e860695f1e5.rdx rename to blogdown/en/sp/spr/steps_cache/html/gsnap_86c745883aaf259c887eda976f529203.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.RData b/blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.RData new file mode 100644 index 000000000..5a9b01017 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.RData differ diff --git a/content/en/sp/spr/steps_cache/html/trimmomatic_c1337f35f54014372a282bd4f7c28658.rdb b/blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/trimmomatic_c1337f35f54014372a282bd4f7c28658.rdb rename to blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.rdb diff --git a/content/en/sp/spr/steps_cache/html/trimmomatic_c1337f35f54014372a282bd4f7c28658.rdx b/blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/trimmomatic_c1337f35f54014372a282bd4f7c28658.rdx rename to blogdown/en/sp/spr/steps_cache/html/hierarchical_clustering_bf9334202a8f2aa138adbfd8ba8b9004.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.RData b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.RData new file mode 100644 index 000000000..d949e912d Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdb b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdb new file mode 100644 index 000000000..cbda37563 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdb differ diff --git a/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdx b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdx new file mode 100644 index 000000000..97cc83779 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hisat_SYSargs2_object_cee2d481d5bc62cd9bd9552681ca40ac.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.RData b/blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.RData new file mode 100644 index 000000000..de6151561 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bbc83c7921f23b96205e3f06cdebb350.rdb b/blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bbc83c7921f23b96205e3f06cdebb350.rdb rename to blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bbc83c7921f23b96205e3f06cdebb350.rdx b/blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bbc83c7921f23b96205e3f06cdebb350.rdx rename to blogdown/en/sp/spr/steps_cache/html/hisat_alignment_77a56be64debcd838768ff7ba4a88b45.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.RData b/blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.RData new file mode 100644 index 000000000..1763abba0 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_c490e07d97c5e44329f43281434c7c70.rdb b/blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_c490e07d97c5e44329f43281434c7c70.rdb rename to blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_c490e07d97c5e44329f43281434c7c70.rdx b/blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_c490e07d97c5e44329f43281434c7c70.rdx rename to blogdown/en/sp/spr/steps_cache/html/hisat_index_3a047704386bd2711c04185f63af28a8.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.RData b/blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.RData new file mode 100644 index 000000000..54c21f8c4 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_73573f9488148085e18501ae1cd1b04c.rdb b/blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_73573f9488148085e18501ae1cd1b04c.rdb rename to blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_73573f9488148085e18501ae1cd1b04c.rdx b/blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_73573f9488148085e18501ae1cd1b04c.rdx rename to blogdown/en/sp/spr/steps_cache/html/igv_fc1e7f5854c379df53bff2dbfa04c07e.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.RData b/blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.RData new file mode 100644 index 000000000..b11e694a8 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b7bd00114f269283ee7a9b41aa32cd3f.rdb b/blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b7bd00114f269283ee7a9b41aa32cd3f.rdb rename to blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b7bd00114f269283ee7a9b41aa32cd3f.rdx b/blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b7bd00114f269283ee7a9b41aa32cd3f.rdx rename to blogdown/en/sp/spr/steps_cache/html/load_package_687920534f55eca0c3c599a08f4fe7b1.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.RData b/blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.RData new file mode 100644 index 000000000..4d73d44cd Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_5b07227a78e433d4d8e5894b06d1a5c3.rdb b/blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_5b07227a78e433d4d8e5894b06d1a5c3.rdb rename to blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_5b07227a78e433d4d8e5894b06d1a5c3.rdx b/blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_5b07227a78e433d4d8e5894b06d1a5c3.rdx rename to blogdown/en/sp/spr/steps_cache/html/output_45955bf2307d4138648c30adc53afa5f.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.RData b/blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.RData new file mode 100644 index 000000000..b86648689 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.RData differ diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_0f67b9ef6f60e38e525300baa3ff35af.rdb b/blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_0f67b9ef6f60e38e525300baa3ff35af.rdb rename to blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.rdb diff --git a/content/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_0f67b9ef6f60e38e525300baa3ff35af.rdx b/blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_0f67b9ef6f60e38e525300baa3ff35af.rdx rename to blogdown/en/sp/spr/steps_cache/html/plot_go_enrichment_57b055cbc105081b847cf8e95cda6642.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.RData b/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.RData new file mode 100644 index 000000000..c5d7c859e Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.rdb b/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.rdx b/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/preprocessing_a244441f267cbda2f639670931750f8e.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.RData b/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.RData new file mode 100644 index 000000000..5e8274546 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.rdb b/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.rdx b/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/process_monitoring_984453409c373bd97bd05499b020ae29.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.RData b/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.RData new file mode 100644 index 000000000..32e46af4b Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.rdb b/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.rdx b/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_mirna_df23bbcf4d853dd569b5aa11c305c785.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.RData b/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.RData new file mode 100644 index 000000000..39a24be3f Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.rdb b/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.rdx b/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_multicore_5305ed412adf89d921e0e024b5cdaf6d.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.RData b/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.RData new file mode 100644 index 000000000..adf98699f Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.rdb b/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.rdx b/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/read_counting_multinode_74cf29033a84963d0ab065feb34ab75a.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.RData b/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.RData new file mode 100644 index 000000000..b697daf8f Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.rdb b/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.rdx b/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/rsubread_5f8fb3a103bb5fd8420786ed2e5d5d67.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.RData b/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.RData new file mode 100644 index 000000000..053eca3e0 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.rdb b/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.rdx b/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/runCommandline_align_ab0102d9aaa91dfc24b8aae41657ddaa.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.RData b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.RData new file mode 100644 index 000000000..c1e9bab8e Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.RData differ diff --git a/content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdb b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdb similarity index 98% rename from content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdb rename to blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdb index ab375f15a..33ca08f9f 100644 Binary files a/content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdb and b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdb differ diff --git a/content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdx b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdx similarity index 60% rename from content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdx rename to blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdx index 0ac38425c..3d629a277 100644 Binary files a/content/en/sp/spr/steps_cache/html/sample_tree_rlog_c81b1c899f1daced817d4fd4c5db16a5.rdx and b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rlog_dfba617e2275bab16dab41ac6518c1aa.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.RData b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.RData new file mode 100644 index 000000000..d9adddc23 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.rdb b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.rdx b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/sample_tree_rpkm_e6d1049e27de516ab69248d47308a78a.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.RData b/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.RData new file mode 100644 index 000000000..db39ff7ef Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.rdb b/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.rdx b/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/setup_3cbfd5b0a3fc3a205925a05c22c50dbc.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.RData b/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.RData new file mode 100644 index 000000000..bf921d004 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.rdb b/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.rdx b/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/subset_a3a54e728976ccff12a950e6567d0cb8.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.RData b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.RData new file mode 100644 index 000000000..75dc78a05 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.rdb b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.rdx b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_f498b685a7ba0e87e765b010ad0d596d.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.RData b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.RData new file mode 100644 index 000000000..ae3d39a24 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.rdb b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.rdx b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/tophat2-pe_parallel_8fd781ff645c1208ee4ddb02ff6474ef.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.RData b/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.RData new file mode 100644 index 000000000..c669b3b90 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.rdb b/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.rdx b/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/trimGalore_b1cfb8e6363f99c230e98894beb63c5b.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.RData b/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.RData new file mode 100644 index 000000000..1276b4efc Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.rdb b/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.rdx b/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/trimmomatic_e32e9b73a212ed3a853f4bea921f18d4.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.RData b/blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.RData new file mode 100644 index 000000000..f54bad162 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.RData differ diff --git a/content/en/sp/spr/steps_cache/html/vennplot_4adb227323bb9b1404fce13c3a059901.rdb b/blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.rdb similarity index 100% rename from content/en/sp/spr/steps_cache/html/vennplot_4adb227323bb9b1404fce13c3a059901.rdb rename to blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.rdb diff --git a/content/en/sp/spr/steps_cache/html/vennplot_4adb227323bb9b1404fce13c3a059901.rdx b/blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.rdx similarity index 100% rename from content/en/sp/spr/steps_cache/html/vennplot_4adb227323bb9b1404fce13c3a059901.rdx rename to blogdown/en/sp/spr/steps_cache/html/vennplot_cd8ec7b8c4dd60491e94fd04608b7e9d.rdx diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.RData new file mode 100644 index 000000000..9584b42e3 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_7b1be5dfcface5ea02e433cbd6e2467a.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.RData new file mode 100644 index 000000000..bf50adb6a Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bowtiePE_61c636b3067cb0605eb1bd5e9d2c0c1e.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.RData new file mode 100644 index 000000000..606a73707 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_bwaPE_a2221721a031147c59e6274d5274d19f.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.RData new file mode 100644 index 000000000..14e0414f0 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_gsnap_b50c0a298105a83432938a525e433c59.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.RData new file mode 100644 index 000000000..a27887b23 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_rsubread_72e89cfc55e78ca9eaf1ec5e518484a2.rdx differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.RData b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.RData new file mode 100644 index 000000000..642ff9342 Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.RData differ diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.rdb b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.rdb new file mode 100644 index 000000000..e69de29bb diff --git a/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.rdx b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.rdx new file mode 100644 index 000000000..99a1b29ad Binary files /dev/null and b/blogdown/en/sp/spr/steps_cache/html/writeTargetsout_tophat2PE_f582295bc6f9537d2bf79b01d009ab02.rdx differ diff --git a/blogdown/md5sum.txt b/blogdown/md5sum.txt index 24799e551..313162e60 100644 --- a/blogdown/md5sum.txt +++ b/blogdown/md5sum.txt @@ -7,19 +7,21 @@ "content/en/presentations/sps/SPS_intro.Rmd" "2dffa2488c602e1daaff2edde3eb25ec" "content/en/presentations/SPS/SPS_intro.Rmd" "2dffa2488c602e1daaff2edde3eb25ec" "content/en/sp/SP_docker.Rmd" "c6f6969d28205d0daa3939f5be85603a" +"content/en/sp/spr/cwl_and_spr.Rmd" "7a704a87f32eed9aebeb504a488ed902" +"content/en/sp/spr/cwl_syntax.Rmd" "ba601785df9ab8f776dc4107e80bba1b" "content/en/sp/spr/gettingstarted.Rmarkdown" "f2bf3b498d3bc1bd3abc5733f2e40052" "content/en/sp/SPR/gettingstarted.Rmarkdown" "f58fbedb6be2b84484cd0707adaf1736" -"content/en/sp/spr/gettingstarted.Rmd" "2987c3ebeb5f5843a020c0166657859b" +"content/en/sp/spr/gettingstarted.Rmd" "6b9cb8c3e22c627627e52eae4f2a3e36" "content/en/sp/spr/introduction.Rmarkdown" "db6ccd750b920a509a97fbe8ffdced36" "content/en/sp/SPR/introduction.Rmarkdown" "db6ccd750b920a509a97fbe8ffdced36" "content/en/sp/spr/introduction.Rmd" "892cf3d3c5d7fbc98a2e64f7d40f2cc1" -"content/en/sp/spr/SP_docker.Rmd" "bec0e2c81c6e9dac4b3e76366c2b5843" +"content/en/sp/spr/SP_docker.Rmd" "50a95cf7008fb630d13edc63ad2190a8" "content/en/sp/SPR/SP_docker.Rmd" "5610ea02695b82efb82d765646d6dc3d" "content/en/sp/spr/spr_run.Rmarkdown" "b6b58d19329135f57f7fb6a07fbf29ad" "content/en/sp/SPR/spr_run.Rmarkdown" "f5c82aa80df42ea875b63f68c3479d6d" -"content/en/sp/spr/SPRinstall.Rmarkdown" "6cd516529bbd80e97f946e6612680b09" +"content/en/sp/spr/SPRinstall.Rmarkdown" "fd1d0ebf38c3655a881fbb0e183c0d95" "content/en/sp/SPR/SPRinstall.Rmarkdown" "6cd516529bbd80e97f946e6612680b09" -"content/en/sp/spr/steps.Rmarkdown" "449b8b221732c3c94e78af965081c57d" +"content/en/sp/spr/steps.Rmarkdown" "9a78a8a956dd92ba25c4661a89b2f200" "content/en/sp/SPR/steps.Rmarkdown" "449b8b221732c3c94e78af965081c57d" "content/en/sp/spr/templates.Rmarkdown" "498f6995986f6e5c113b7d51212a40ac" "content/en/sp/SPR/templates.Rmarkdown" "498f6995986f6e5c113b7d51212a40ac" @@ -58,7 +60,7 @@ "content/en/sps/adv_features/tabs.Rmarkdown" "fe5d1c5a26323e41ef5ec6acb93e8ecd" "content/en/sps/adv_features/tabs.Rmd" "90362ef199db468ce49d09e19dca8fec" "content/en/sps/dev/_index.Rmarkdown" "fd3ea8c1242d03c38b67b7a97b7ce38c" -"content/en/sps/dev/_index.Rmd" "79a0871e20ee4372e29c5cb750d9642e" +"content/en/sps/dev/_index.Rmd" "962db203eb746c63b36e42ace811c631" "content/en/sps/dev/spscomps/server.Rmarkdown" "bbac38b3912e031093f84803cc96a3c3" "content/en/sps/dev/spscomps/server.Rmd" "bbac38b3912e031093f84803cc96a3c3" "content/en/sps/dev/spscomps/ui.Rmarkdown" "b94a428e18b0864e8617baf7ccbc30bc" diff --git a/content/en/sp/spr/.SPRproject/SYSargsList.yml b/content/en/sp/spr/.SPRproject/SYSargsList.yml deleted file mode 100644 index aeccf4663..000000000 --- a/content/en/sp/spr/.SPRproject/SYSargsList.yml +++ /dev/null @@ -1,464 +0,0 @@ -stepsWF: - newStep2: | - codeLine: - - mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", - paste0(names(split(iris, factor(iris$Species))), ".csv"))) - - '3.91202300542815' - codeChunkStart: [] - rmdPath: [] - stepName: export_iris - dependency: - export_iris: '' - status: - status.summary: Pending - status.completed: - Step: export_iris - status.summary: Pending - status.time: {} - files: [] - newIndex: | - targets: - SE: - FileName: results/setosa.csv - SampleName: SE - VE: - FileName: results/versicolor.csv - SampleName: VE - VI: - FileName: results/virginica.csv - SampleName: VI - targetsheader: - targetsheader: '# Project ID: SPR Example gzip' - modules: [] - wf: - class: Workflow - cwlVersion: v1.0 - inputs: - file: File - SampleName: string - ext: string - results_path: Directory - outputs: - gzip_file: - outputSource: gzip/gzip_file - type: stdout - steps: - gzip: - in: - file: file - SampleName: SampleName - ext: ext - results_path: results_path - out: '[gzip_file]' - run: gunzip/gzip.cwl - clt: - gunzip/gzip.cwl: - cwlVersion: v1.0 - class: CommandLineTool - baseCommand: gzip - requirements: - - class: InlineJavascriptRequirement - - class: InitialWorkDirRequirement - listing: $(inputs.results_path) - arguments: - - prefix: -c - inputs: - file: - type: File - inputBinding: - position: 1 - SampleName: - label: Filename to write output to - type: string - ext: - label: Filename extension - type: string - results_path: - label: Directory to write output to - type: Directory - outputs: - gzip_file: - type: stdout - stdout: $(inputs.results_path.basename)/$(inputs.SampleName).$(inputs.ext) - yamlinput: - file: - class: File - path: _FILE_PATH_ - SampleName: _SampleName_ - ext: txt.gz - results_path: - class: Directory - path: ./results - cmdlist: - SE: - gzip: gzip -c results/setosa.csv > results/SE.txt.gz - VE: - gzip: gzip -c results/versicolor.csv > results/VE.txt.gz - VI: - gzip: gzip -c results/virginica.csv > results/VI.txt.gz - input: - SE: - FileName: results/setosa.csv - SampleName: SE - VE: - FileName: results/versicolor.csv - SampleName: VE - VI: - FileName: results/virginica.csv - SampleName: VI - output: - SE: - gzip: results/SE.txt.gz - VE: - gzip: results/VE.txt.gz - VI: - gzip: results/VI.txt.gz - files: - cwl: gunzip/workflow_gzip.cwl - yml: gunzip/gzip.yml - dir_path: /home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/cwl - steps: gzip - cltpaths: /home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/cwl/gunzip/gzip.cwl - output_names: gzip_file - targets: home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/cwl/gunzip/targets_gunzip.txt - inputvars: - FileName: _FILE_PATH_ - SampleName: _SampleName_ - cmdToCwl: [] - status: - status.summary: Pending - status.completed: - Targets: - - SE - - VE - - VI - Total_Files: - - 1.0 - - 1.0 - - 1.0 - Existing_Files: - - 0.0 - - 0.0 - - 0.0 - Missing_Files: - - 1.0 - - 1.0 - - 1.0 - gzip: - - Pending - - Pending - - Pending - status.time: {} - internal_outfiles: - SE: - gzip: results/SE.txt.gz - VE: - gzip: results/VE.txt.gz - VI: - gzip: results/VI.txt.gz - gunzip: | - targets: - SE: - gzip_file: results/SE.csv.gz - SampleName: SE - VE: - gzip_file: results/VE.csv.gz - SampleName: VE - VI: - gzip_file: results/VI.csv.gz - SampleName: VI - targetsheader: - targetsheader: '# Project ID: SPR Example gzip' - modules: [] - wf: - class: Workflow - cwlVersion: v1.0 - inputs: - file: File - SampleName: string - ext: string - results_path: Directory - outputs: - gunzip_file: - outputSource: gunzip/gunzip_file - type: stdout - steps: - gunzip: - in: - file: file - SampleName: SampleName - ext: ext - results_path: results_path - out: '[gunzip_file]' - run: gunzip/gunzip.cwl - clt: - gunzip/gunzip.cwl: - cwlVersion: v1.0 - class: CommandLineTool - baseCommand: gunzip - requirements: - - class: InlineJavascriptRequirement - - class: InitialWorkDirRequirement - listing: $(inputs.results_path) - arguments: - - prefix: -c - inputs: - file: - type: File - inputBinding: - position: 1 - SampleName: - label: Filename to write output to - type: string - ext: - label: Filename extension - type: string - results_path: - label: Directory to write output to - type: Directory - outputs: - gunzip_file: - type: stdout - stdout: $(inputs.results_path.basename)/$(inputs.SampleName).csv - yamlinput: - file: - class: File - path: _FILE_PATH_ - SampleName: _SampleName_ - ext: csv - results_path: - class: Directory - path: ./results - cmdlist: - SE: - gunzip: gunzip -c results/SE.csv.gz > results/SE.csv - VE: - gunzip: gunzip -c results/VE.csv.gz > results/VE.csv - VI: - gunzip: gunzip -c results/VI.csv.gz > results/VI.csv - input: - SE: - gzip_file: results/SE.csv.gz - SampleName: SE - VE: - gzip_file: results/VE.csv.gz - SampleName: VE - VI: - gzip_file: results/VI.csv.gz - SampleName: VI - output: - SE: - gunzip: results/SE.csv - VE: - gunzip: results/VE.csv - VI: - gunzip: results/VI.csv - files: - cwl: gunzip/workflow_gunzip.cwl - yml: gunzip/gunzip.yml - dir_path: /home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/cwl - steps: gunzip - cltpaths: /home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/cwl/gunzip/gunzip.cwl - output_names: gunzip_file - targets: .na - inputvars: - gzip_file: _FILE_PATH_ - SampleName: _SampleName_ - cmdToCwl: [] - status: - status.summary: Pending - status.completed: - Targets: - - SE - - VE - - VI - Total_Files: - - 1.0 - - 1.0 - - 1.0 - Existing_Files: - - 0.0 - - 0.0 - - 0.0 - Missing_Files: - - 1.0 - - 1.0 - - 1.0 - gunzip: - - Pending - - Pending - - Pending - status.time: {} - internal_outfiles: - SE: - gunzip: results/SE.csv - VE: - gunzip: results/VE.csv - VI: - gunzip: results/VI.csv - iris_stats: | - codeLine: - - df <- lapply(getColumn(sal, step = "gunzip", "outfiles"), function(x) read.delim(x, - sep = ",")[-1]) - - df <- do.call(rbind, df) - - stats <- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], - 2, sd))) - - stats$species <- rownames(stats) - - plot <- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) - + ggplot2::geom_bar(stat = "identity", color = "black", position = ggplot2::position_dodge()) - + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width - = 0.2, position = ggplot2::position_dodge(0.9)) - codeChunkStart: [] - rmdPath: [] - stepName: iris_stats - dependency: - iris_stats: gzip - status: - status.summary: Pending - status.completed: - Step: iris_stats - status.summary: Pending - status.time: {} - files: [] -statusWF: - newStep2: | - newStep2: - status.summary: Pending - status.completed: - Step: export_iris - status.summary: Pending - status.time: {} - newIndex: | - newIndex: - status.summary: Pending - status.completed: - Targets: - - SE - - VE - - VI - Total_Files: - - 1.0 - - 1.0 - - 1.0 - Existing_Files: - - 0.0 - - 0.0 - - 0.0 - Missing_Files: - - 1.0 - - 1.0 - - 1.0 - gzip: - - Pending - - Pending - - Pending - status.time: {} - gunzip: | - gunzip: - status.summary: Pending - status.completed: - Targets: - - SE - - VE - - VI - Total_Files: - - 1.0 - - 1.0 - - 1.0 - Existing_Files: - - 0.0 - - 0.0 - - 0.0 - Missing_Files: - - 1.0 - - 1.0 - - 1.0 - gunzip: - - Pending - - Pending - - Pending - status.time: {} - iris_stats: | - iris_stats: - status.summary: Pending - status.completed: - Step: iris_stats - status.summary: Pending - status.time: {} -targetsWF: - newStep2: | - {} - newIndex: | - FileName: - - results/setosa.csv - - results/versicolor.csv - - results/virginica.csv - SampleName: - - SE - - VE - - VI - gunzip: | - gzip_file: - - results/SE.csv.gz - - results/VE.csv.gz - - results/VI.csv.gz - SampleName: - - SE - - VE - - VI - iris_stats: | - {} -outfiles: - newStep2: | - {} - newIndex: | - gzip_file: - - results/SE.csv.gz - - results/VE.csv.gz - - results/VI.csv.gz - gunzip: | - gunzip_file: - - results/SE.csv - - results/VE.csv - - results/VI.csv - iris_stats: | - {} -SEobj: | - [] -dependency: - newStep2: | - newStep2: '' - newIndex: | - newIndex: newStep2 - gunzip: | - gunzip: newIndex - iris_stats: | - iris_stats: newIndex -targets_connection: - newStep2: | - newStep2: ~ - newIndex: | - newIndex: ~ - gunzip: | - gunzip: - targets_step: newIndex - new_targets_col: - new_targets_col: - - gzip_file - - SampleName - rm_targets_col: - rm_targets_col: FileName - iris_stats: | - iris_stats: ~ -projectInfo: | - project: /home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr - data: data - param: param - results: results - logsDir: .SPRproject - sysargslist: .SPRproject/SYSargsList.yml -runInfo: | - newStep2: no - newIndex: yes - gunzip: yes - iris_stats: no diff --git a/content/en/sp/spr/.~1EMZjOx0kYtHjoPe-rLWT8TepMqa4-3lg-60623e.insyncdl b/content/en/sp/spr/.~1EMZjOx0kYtHjoPe-rLWT8TepMqa4-3lg-60623e.insyncdl new file mode 100644 index 000000000..e69de29bb diff --git a/content/en/sp/spr/SPRinstall.Rmarkdown b/content/en/sp/spr/SPRinstall.Rmarkdown index 1889f8e6c..ddd338e0f 100644 --- a/content/en/sp/spr/SPRinstall.Rmarkdown +++ b/content/en/sp/spr/SPRinstall.Rmarkdown @@ -16,7 +16,7 @@ bibliography: bibtex_install.bib editor_options: chunk_output_type: console type: docs -weight: 7 +weight: 8 --- ```{css, echo=FALSE} @@ -48,11 +48,10 @@ suppressPackageStartupMessages({ }) ``` -# - ## `systemPipeR` Installation -To install the `systemPipeR` package [@H_Backman2016-bt], please use the _`BiocManager::install`_ command: +To install the `systemPipeR` package [@H_Backman2016-bt], please use +the _`BiocManager::install`_ command: ```{r spr_install, eval=FALSE} if (!requireNamespace("BiocManager", quietly=TRUE)) @@ -61,57 +60,34 @@ BiocManager::install("systemPipeR") ``` To obtain the most recent updates immediately, one can install it directly from -[github](https://github.com/tgirke/systemPipeR) as follow: +[GitHub](https://github.com/tgirke/systemPipeR) as follow: ```{r spr_install_gh, eval=FALSE} if (!requireNamespace("BiocManager", quietly=TRUE)) install.packages("BiocManager") -BiocManager::install("tgirke/systemPipeR", build_vignettes=TRUE, dependencies=TRUE) +BiocManager::install("tgirke/systemPipeR", dependencies=TRUE) ``` ## Third-party software tools in *`SPR`* -This guide provides detailed installation instructions for the software tools used within `systemPipeR` package. This guide provides the instruction for a Linux system. - -### BWA - -[Burrow-Wheeler Aligner (BWA)](https://github.com/lh3/bwa) for short-read alignment [@Li2013-sw]. - -```{bash bwa, eval=FALSE} -git clone https://github.com/lh3/bwa.git -cd bwa -make -vim ~/.bashrc ## Open the Bash shell script -export PATH=$PATH:/path/to/bwa ## "/path/to/bwa" is an example! Replace with real PATH -source ~/.bashrc -bwa ## Test if the installation was successful -``` - -Note: In some systems, `~/.bash_profile` is used in place of `~/.bashrc`. - -More information about how to set an enviroment variable [here](https://en.wikipedia.org/wiki/Environment_variable). - -### BLAST - -Please check the [BLAST Command Line Applications User Manual](https://www.ncbi.nlm.nih.gov/books/NBK279671/) to -find the installation introduction for your system environment. - -Download the latest version from [here](https://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/), as the following example: - -```{bash blast, eval=FALSE} -wget https://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/ncbi-blast-2.11.0+-x64-linux.tar.gz -tar zxvpf ncbi-blast-2.11.0+-x64-linux.tar.gz ncbi-blast-2.11.0+/ -cd ncbi-blast-2.11.0+/ -export PATH=$PATH:/path/to//ncbi-blast-2.11.0+/bin ## "/path/to/ncbi-blast-2.11.0+" is an example! Replace with real PATH -``` - -### Cutadapt - -Please check the [Cutadapt Manual](https://cutadapt.readthedocs.io/en/stable/installation.html) to -find the installation introduction for your system environment. - -```{bash Cutadapt, eval=FALSE} -sudo apt install cutadapt +Current, *systemPipeR* provides the _`param`_ file templates for third-party +software tools. Please check the listed software tools. + +```{r table_tools, echo=FALSE, message=FALSE} +library(magrittr) +SPR_software <- system.file("extdata", "SPR_software.csv", package = "systemPipeR") +software <- read.delim(SPR_software, sep = ",", comment.char = "#") +colors <- colorRampPalette((c("darkseagreen", "indianred1")))(length(unique(software$Category))) +id <- as.numeric(c((unique(software$Category)))) +software %>% + dplyr::mutate(Step = kableExtra::cell_spec(Step, color = "white", bold = TRUE, + background = factor(Category, id, colors) + )) %>% + dplyr::select(Tool, Description, Step) %>% + dplyr::arrange(Tool) %>% + kableExtra::kable(escape = FALSE, align = "c", col.names = c("Tool Name", "Description", "Step")) %>% + kableExtra::kable_styling(c("striped", "hover", "condensed"), full_width = TRUE) %>% + kableExtra::scroll_box(width = "100%", height = "500px") ``` ## References diff --git a/content/en/sp/spr/SPRinstall.markdown b/content/en/sp/spr/SPRinstall.markdown index 127982e0b..32b880aba 100644 --- a/content/en/sp/spr/SPRinstall.markdown +++ b/content/en/sp/spr/SPRinstall.markdown @@ -1,7 +1,7 @@ --- -title: "SPR detailed installation instructions" +title: "SPR detailed installation instructions" author: "Author: Daniela Cassol (danicassol@gmail.com)" -date: "Last update: 20 April, 2021" +date: "Last update: 28 October, 2021" output: BiocStyle::html_document: toc_float: true @@ -13,12 +13,16 @@ vignette: | %\VignetteEngine{knitr::rmarkdown} fontsize: 14pt bibliography: bibtex_install.bib -editor_options: +editor_options: chunk_output_type: console type: docs -weight: 7 +weight: 8 --- + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - -
-

0.1 Define environment settings and samples

-

A typical workflow starts with generating the expected working environment -containing the proper directory structure, input files, and parameter settings. -To simplify this task, one can load one of the existing NGS workflows templates -provided by systemPipeRdata into the current working directory. The -following does this for the rnaseq template. The name of the resulting -workflow directory can be specified under the mydirname argument. The -default NULL uses the name of the chosen workflow. An error is issued if a -directory of the same name and path exists already. On Linux and OS X systems -one can also create new workflow instances from the command-line of a terminal as shown -here. -To apply workflows to custom data, the user needs to modify the targets file and if -necessary update the corresponding .cwl and .yml files. A collection of pre-generated .cwl and .yml files are provided in the param/cwl subdirectory of each workflow template. They -are also viewable in the GitHub repository of systemPipeRdata (see -here).

-
library(systemPipeR)
-library(systemPipeRdata)
-genWorkenvir(workflow = "rnaseq", mydirname = NULL)
-setwd("rnaseq")
-
-
-

0.2 Read Preprocessing

-
-

0.2.1 Preprocessing with preprocessReads function

-

The function preprocessReads allows to apply predefined or custom -read preprocessing functions to all FASTQ files referenced in a -SYSargs2 container, such as quality filtering or adaptor trimming -routines. The paths to the resulting output FASTQ files are stored in the -output slot of the SYSargs2 object. Internally, -preprocessReads uses the FastqStreamer function from -the ShortRead package to stream through large FASTQ files in a -memory-efficient manner. The following example performs adaptor trimming with -the trimLRPatterns function from the Biostrings package. -After the trimming step a new targets file is generated (here -targets_trimPE.txt) containing the paths to the trimmed FASTQ files. -The new targets file can be used for the next workflow step with an updated -SYSargs2 instance, e.g. running the NGS alignments with the -trimmed FASTQ files.

-

Construct SYSargs2 object from cwl and yml param and targets files.

-
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/preprocessReads/trim-pe", package = "systemPipeR")
-trim <- loadWorkflow(targets = targetsPE, wf_file = "trim-pe.cwl", input_file = "trim-pe.yml",
-    dir_path = dir_path)
-trim <- renderWF(trim, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-trim
-output(trim)[1:2]
-
preprocessReads(args = trim, Fct = "trimLRPatterns(Rpattern='GCCCGGGTAA', 
-                subject=fq)",
-    batchsize = 1e+05, overwrite = TRUE, compress = TRUE)
-

The following example shows how one can design a custom read preprocessing function -using utilities provided by the ShortRead package, and then run it -in batch mode with the ‘preprocessReads’ function (here on paired-end reads).

-
filterFct <- function(fq, cutoff = 20, Nexceptions = 0) {
-    qcount <- rowSums(as(quality(fq), "matrix") <= cutoff, na.rm = TRUE)
-    # Retains reads where Phred scores are >= cutoff with N exceptions
-    fq[qcount <= Nexceptions]
-}
-preprocessReads(args = trim, Fct = "filterFct(fq, cutoff=20, Nexceptions=0)", batchsize = 1e+05)
-
-
-

0.2.2 Preprocessing with TrimGalore!

-

TrimGalore! is -a wrapper tool to consistently apply quality and adapter trimming to fastq files, -with some extra functionality for removing Reduced Representation Bisulfite-Seq -(RRBS) libraries.

-
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/trim_galore/trim_galore-se", package = "systemPipeR")
-trimG <- loadWorkflow(targets = targets, wf_file = "trim_galore-se.cwl", input_file = "trim_galore-se.yml",
-    dir_path = dir_path)
-trimG <- renderWF(trimG, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
-trimG
-cmdlist(trimG)[1:2]
-output(trimG)[1:2]
-## Run Single Machine Option
-trimG <- runCommandline(trimG[1], make_bam = FALSE)
-
-
-

0.2.3 Preprocessing with Trimmomatic

-
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/trimmomatic/trimmomatic-pe", package = "systemPipeR")
-trimM <- loadWorkflow(targets = targetsPE, wf_file = "trimmomatic-pe.cwl", input_file = "trimmomatic-pe.yml",
-    dir_path = dir_path)
-trimM <- renderWF(trimM, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-trimM
-cmdlist(trimM)[1:2]
-output(trimM)[1:2]
-## Run Single Machine Option
-trimM <- runCommandline(trimM[1], make_bam = FALSE)
-
-
-
-

0.3 FASTQ quality report

-

The following seeFastq and seeFastqPlot functions generate and plot a series of -useful quality statistics for a set of FASTQ files including per cycle quality -box plots, base proportions, base-level quality trends, relative k-mer -diversity, length and occurrence distribution of reads, number of reads above -quality cutoffs and mean quality distribution.
-The function seeFastq computes the quality statistics and stores the results in a -relatively small list object that can be saved to disk with save() and -reloaded with load() for later plotting. The argument klength specifies the -k-mer length and batchsize the number of reads to a random sample from each -FASTQ file.

-
fqlist <- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8)
-pdf("./results/fastqReport.pdf", height = 18, width = 4 * length(fqlist))
-seeFastqPlot(fqlist)
-dev.off()
-
- -
-
-Figure 5: FASTQ quality report -
-


-

Parallelization of FASTQ quality report on a single machine with multiple cores.

-
f <- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8)
-fqlist <- bplapply(seq(along = trim), f, BPPARAM = MulticoreParam(workers = 4))
-seeFastqPlot(unlist(fqlist, recursive = FALSE))
-

Parallelization of FASTQ quality report via scheduler (e.g. Slurm) across several compute nodes.

-
library(BiocParallel)
-library(batchtools)
-f <- function(x) {
-    library(systemPipeR)
-    targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-    dir_path <- system.file("extdata/cwl/preprocessReads/trim-pe", package = "systemPipeR")
-    trim <- loadWorkflow(targets = targetsPE, wf_file = "trim-pe.cwl", input_file = "trim-pe.yml",
-        dir_path = dir_path)
-    trim <- renderWF(trim, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-        SampleName = "_SampleName_"))
-    seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8)
-}
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-param <- BatchtoolsParam(workers = 4, cluster = "slurm", template = "batchtools.slurm.tmpl",
-    resources = resources)
-fqlist <- bplapply(seq(along = trim), f, BPPARAM = param)
-seeFastqPlot(unlist(fqlist, recursive = FALSE))
-
-
-

0.4 NGS Alignment software

-

After quality control, the sequence reads can be aligned to a reference genome or -transcriptome database. The following sessions present some NGS sequence alignment -software. Select the most accurate aligner and determining the optimal parameter -for your custom data set project.

-

For all the following examples, it is necessary to install the respective software -and export the PATH accordingly. If it is available Environment Module -in the system, you can load all the request software with moduleload(args) function.

-
-

0.4.1 Alignment with HISAT2 using SYSargs2

-

The following steps will demonstrate how to use the short read aligner Hisat2 -(Kim, Langmead, and Salzberg 2015) in both interactive job submissions and batch submissions to -queuing systems of clusters using the systemPipeR's new CWL command-line interface.

-

The parameter settings of the aligner are defined in the hisat2-mapping-se.cwl -and hisat2-mapping-se.yml files. The following shows how to construct the -corresponding SYSargs2 object, here args.

-
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/hisat2/hisat2-se", package = "systemPipeR")
-args <- loadWorkflow(targets = targets, wf_file = "hisat2-mapping-se.cwl", input_file = "hisat2-mapping-se.yml",
-    dir_path = dir_path)
-args <- renderWF(args, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
-args
-
## Instance of 'SYSargs2':
-##    Slot names/accessors: 
-##       targets: 18 (M1A...V12B), targetsheader: 4 (lines)
-##       modules: 1
-##       wf: 0, clt: 1, yamlinput: 7 (inputs)
-##       input: 18, output: 18
-##       cmdlist: 18
-##    Sub Steps:
-##       1. hisat2-mapping-se (rendered: TRUE)
-
cmdlist(args)[1:2]
-
## $M1A
-## $M1A$`hisat2-mapping-se`
-## [1] "hisat2 -S ./results/M1A.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446027_1.fastq.gz --threads 4"
-## 
-## 
-## $M1B
-## $M1B$`hisat2-mapping-se`
-## [1] "hisat2 -S ./results/M1B.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446028_1.fastq.gz --threads 4"
-
output(args)[1:2]
-
## $M1A
-## $M1A$`hisat2-mapping-se`
-## [1] "./results/M1A.sam"
-## 
-## 
-## $M1B
-## $M1B$`hisat2-mapping-se`
-## [1] "./results/M1B.sam"
-

Subsetting SYSargs2 class slots for each workflow step.

-
subsetWF(args, slot = "input", subset = "FileName")[1:2]  ## Subsetting the input files for this particular workflow 
-
##                           M1A                           M1B 
-## "./data/SRR446027_1.fastq.gz" "./data/SRR446028_1.fastq.gz"
-
subsetWF(args, slot = "output", subset = 1, index = 1)[1:2]  ## Subsetting the output files for one particular step in the workflow 
-
##                 M1A                 M1B 
-## "./results/M1A.sam" "./results/M1B.sam"
-
subsetWF(args, slot = "step", subset = 1)[1]  ## Subsetting the command-lines for one particular step in the workflow 
-
##                                                                                                                                               M1A 
-## "hisat2 -S ./results/M1A.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446027_1.fastq.gz --threads 4"
-
subsetWF(args, slot = "output", subset = 1, index = 1, delete = TRUE)[1]  ## DELETING specific output files
-
## The subset cannot be deleted: no such file
-
##                 M1A 
-## "./results/M1A.sam"
-

Build Hisat2 index.

-
dir_path <- system.file("extdata/cwl/hisat2/hisat2-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "hisat2-index.cwl", input_file = "hisat2-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)
-
-## Run
-runCommandline(idx, make_bam = FALSE)
-
-

0.4.1.1 Interactive job submissions in a single machine

-

To simplify the short read alignment execution for the user, the command-line -can be run with the runCommandline function. -The execution will be on a single machine without submitting to a queuing system -of a computer cluster. This way, the input FASTQ files will be processed sequentially. -By default runCommandline auto detects SAM file outputs and converts them -to sorted and indexed BAM files, using internally the Rsamtools package -(Morgan et al. 2019). Besides, runCommandline allows the user to create a dedicated -results folder for each workflow and a sub-folder for each sample -defined in the targets file. This includes all the output and log files for each -step. When these options are used, the output location will be updated by default -and can be assigned to the same object.

-
runCommandline(args, make_bam = FALSE)  ## generates alignments and writes *.sam files to ./results folder 
-args <- runCommandline(args, make_bam = TRUE)  ## same as above but writes files and converts *.sam files to sorted and indexed BAM files. Assigning the new extention of the output files to the object args.
-

If available, multiple CPU cores can be used for processing each file. The number -of CPU cores (here 4) to use for each process is defined in the *.yml file. -With yamlinput(args)['thread'] one can return this value from the SYSargs2 object.

-
-
-

0.4.1.2 Parallelization on clusters

-

Alternatively, the computation can be greatly accelerated by processing many files -in parallel using several compute nodes of a cluster, where a scheduling/queuing -system is used for load balancing. For this the clusterRun function submits -the computing requests to the scheduler using the run specifications -defined by runCommandline.

-

To avoid over-subscription of CPU cores on the compute nodes, the value from -yamlinput(args)['thread'] is passed on to the submission command, here ncpus -in the resources list object. The number of independent parallel cluster -processes is defined under the Njobs argument. The following example will run -18 processes in parallel using for each 4 CPU cores. If the resources available -on a cluster allow running all 18 processes at the same time then the shown sample -submission will utilize in total 72 CPU cores. Note, clusterRun can be used -with most queueing systems as it is based on utilities from the batchtools -package which supports the use of template files (*.tmpl) for defining the -run parameters of different schedulers. To run the following code, one needs to -have both a conf file (see .batchtools.conf.R samples here) -and a template file (see *.tmpl samples here) -for the queueing available on a system. The following example uses the sample -conf and template files for the Slurm scheduler provided by this package.

-
library(batchtools)
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-reg <- clusterRun(args, FUN = runCommandline, more.args = list(args = args, make_bam = TRUE,
-    dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
-    Njobs = 18, runid = "01", resourceList = resources)
-getStatus(reg = reg)
-waitForJobs(reg = reg)
-

Check and update the output location if necessary.

-
args <- output_update(args, dir = FALSE, replace = TRUE, extension = c(".sam", ".bam"))  ## Updates the output(args) to the right location in the subfolders
-output(args)
-
-
-

0.4.1.3 Create new targets file

-

To establish the connectivity to the next workflow step, one can write a new -targets file with the writeTargetsout function. The new targets file -serves as input to the next loadWorkflow and renderWF call.

-
names(clt(args))
-writeTargetsout(x = args, file = "default", step = 1, new_col = "FileName", new_col_output_index = 1,
-    overwrite = TRUE)
-
-
-

0.4.1.4 Alignment with HISAT2 and SAMtools

-

Alternatively, it possible to build an workflow with HISAT2 and SAMtools.

-
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/workflow-hisat2/workflow-hisat2-se", package = "systemPipeR")
-WF <- loadWorkflow(targets = targets, wf_file = "workflow_hisat2-se.cwl", input_file = "workflow_hisat2-se.yml",
-    dir_path = dir_path)
-WF <- renderWF(WF, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
-WF
-cmdlist(WF)[1:2]
-output(WF)[1:2]
-
-
-
-

0.4.2 Alignment with Tophat2

-

The NGS reads of this project can also be aligned against the reference genome -sequence using Bowtie2/TopHat2 (Kim et al. 2013; Langmead and Salzberg 2012).

-

Build Bowtie2 index.

-
dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "bowtie2-index.cwl", input_file = "bowtie2-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)
-
-## Run in single machine
-runCommandline(idx, make_bam = FALSE)
-

The parameter settings of the aligner are defined in the tophat2-mapping-pe.cwl -and tophat2-mapping-pe.yml files. The following shows how to construct the -corresponding SYSargs2 object, here tophat2PE.

-
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/tophat2/tophat2-pe", package = "systemPipeR")
-tophat2PE <- loadWorkflow(targets = targetsPE, wf_file = "tophat2-mapping-pe.cwl",
-    input_file = "tophat2-mapping-pe.yml", dir_path = dir_path)
-tophat2PE <- renderWF(tophat2PE, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-tophat2PE
-cmdlist(tophat2PE)[1:2]
-output(tophat2PE)[1:2]
-
-## Run in single machine
-tophat2PE <- runCommandline(tophat2PE[1], make_bam = TRUE)
-

Parallelization on clusters.

-
resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-reg <- clusterRun(tophat2PE, FUN = runCommandline, more.args = list(args = tophat2PE,
-    make_bam = TRUE, dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
-    Njobs = 18, runid = "01", resourceList = resources)
-waitForJobs(reg = reg)
-

Create new targets file

-
names(clt(tophat2PE))
-writeTargetsout(x = tophat2PE, file = "default", step = 1, new_col = "tophat2PE",
-    new_col_output_index = 1, overwrite = TRUE)
-
-
-

0.4.3 Alignment with Bowtie2 (e.g. for miRNA profiling)

-

The following example runs Bowtie2 as a single process without submitting it to a cluster.

-

Building the index:

-
dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "bowtie2-index.cwl", input_file = "bowtie2-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)
-
-## Run in single machine
-runCommandline(idx, make_bam = FALSE)
-

Building all the command-line:

-
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-pe", package = "systemPipeR")
-bowtiePE <- loadWorkflow(targets = targetsPE, wf_file = "bowtie2-mapping-pe.cwl",
-    input_file = "bowtie2-mapping-pe.yml", dir_path = dir_path)
-bowtiePE <- renderWF(bowtiePE, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-bowtiePE
-cmdlist(bowtiePE)[1:2]
-output(bowtiePE)[1:2]
-

Running all the jobs to computing nodes.

-
resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-reg <- clusterRun(bowtiePE, FUN = runCommandline, more.args = list(args = bowtiePE,
-    dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
-    Njobs = 18, runid = "01", resourceList = resources)
-getStatus(reg = reg)
-

Alternatively, it possible to run all the jobs in a single machine.

-
bowtiePE <- runCommandline(bowtiePE)
-

Create new targets file.

-
names(clt(bowtiePE))
-writeTargetsout(x = bowtiePE, file = "default", step = 1, new_col = "bowtiePE", new_col_output_index = 1,
-    overwrite = TRUE)
-
-
-

0.4.4 Alignment with BWA-MEM (e.g. for VAR-Seq)

-

The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference

-

Build the index:

-
dir_path <- system.file("extdata/cwl/bwa/bwa-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "bwa-index.cwl", input_file = "bwa-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)  # Indexes reference genome
-
-## Run
-runCommandline(idx, make_bam = FALSE)
-

Running the alignment:

-
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/bwa/bwa-pe", package = "systemPipeR")
-bwaPE <- loadWorkflow(targets = targetsPE, wf_file = "bwa-pe.cwl", input_file = "bwa-pe.yml",
-    dir_path = dir_path)
-bwaPE <- renderWF(bwaPE, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-bwaPE
-cmdlist(bwaPE)[1:2]
-output(bwaPE)[1:2]
-## Single Machine
-bwaPE <- runCommandline(args = bwaPE, make_bam = FALSE)
-
-## Cluster
-library(batchtools)
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-reg <- clusterRun(bwaPE, FUN = runCommandline, more.args = list(args = bwaPE, dir = FALSE),
-    conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl", Njobs = 18,
-    runid = "01", resourceList = resources)
-getStatus(reg = reg)
-

Create new targets file.

-
names(clt(bwaPE))
-writeTargetsout(x = bwaPE, file = "default", step = 1, new_col = "bwaPE", new_col_output_index = 1,
-    overwrite = TRUE)
-
-
-

0.4.5 Alignment with Rsubread (e.g. for RNA-Seq)

-

The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.

-
## Build the index:
-dir_path <- system.file("extdata/cwl/rsubread/rsubread-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "rsubread-index.cwl", input_file = "rsubread-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)
-runCommandline(args = idx, make_bam = FALSE)
-
-## Running the alignment:
-targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/rsubread/rsubread-se", package = "systemPipeR")
-rsubread <- loadWorkflow(targets = targets, wf_file = "rsubread-mapping-se.cwl",
-    input_file = "rsubread-mapping-se.yml", dir_path = dir_path)
-rsubread <- renderWF(rsubread, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
-rsubread
-cmdlist(rsubread)[1]
-
-## Single Machine
-rsubread <- runCommandline(args = rsubread[1])
-

Create new targets file.

-
names(clt(rsubread))
-writeTargetsout(x = rsubread, file = "default", step = 1, new_col = "rsubread", new_col_output_index = 1,
-    overwrite = TRUE)
-
-
-

0.4.6 Alignment with gsnap (e.g. for VAR-Seq and RNA-Seq)

-

Another R-based short read aligner is gsnap from the gmapR package (Wu and Nacu 2010). -The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.

-
## Build the index:
-dir_path <- system.file("extdata/cwl/gsnap/gsnap-idx", package = "systemPipeR")
-idx <- loadWorkflow(targets = NULL, wf_file = "gsnap-index.cwl", input_file = "gsnap-index.yml",
-    dir_path = dir_path)
-idx <- renderWF(idx)
-idx
-cmdlist(idx)
-runCommandline(args = idx, make_bam = FALSE)
-
-## Running the alignment:
-targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
-dir_path <- system.file("extdata/cwl/gsnap/gsnap-pe", package = "systemPipeR")
-gsnap <- loadWorkflow(targets = targetsPE, wf_file = "gsnap-mapping-pe.cwl", input_file = "gsnap-mapping-pe.yml",
-    dir_path = dir_path)
-gsnap <- renderWF(gsnap, inputvars = c(FileName1 = "_FASTQ_PATH1_", FileName2 = "_FASTQ_PATH2_",
-    SampleName = "_SampleName_"))
-gsnap
-cmdlist(gsnap)[1]
-output(gsnap)[1]
-
-## Cluster
-library(batchtools)
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-reg <- clusterRun(gsnap, FUN = runCommandline, more.args = list(args = gsnap, make_bam = FALSE),
-    conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl", Njobs = 18,
-    runid = "01", resourceList = resources)
-getStatus(reg = reg)
-gsnap <- output_update(gsnap, dir = FALSE, replace = TRUE, extension = c(".sam",
-    ".bam"))
-

Create new targets file.

-
names(clt(gsnap))
-writeTargetsout(x = gsnap, file = "default", step = 1, new_col = "gsnap", new_col_output_index = 1,
-    overwrite = TRUE)
-
-
- -
-

0.6 Read counting for mRNA profiling experiments

-

Create txdb (needs to be done only once).

-
library(GenomicFeatures)
-txdb <- makeTxDbFromGFF(file = "data/tair10.gff", format = "gff", dataSource = "TAIR",
-    organism = "Arabidopsis thaliana")
-saveDb(txdb, file = "./data/tair10.sqlite")
-

The following performs read counting with summarizeOverlaps in parallel mode with multiple cores.

-
library(BiocParallel)
-txdb <- loadDb("./data/tair10.sqlite")
-eByg <- exonsBy(txdb, by = "gene")
-outpaths <- subsetWF(args, slot = "output", subset = 1, index = 1)
-bfl <- BamFileList(outpaths, yieldSize = 50000, index = character())
-multicoreParam <- MulticoreParam(workers = 4)
-register(multicoreParam)
-registered()
-counteByg <- bplapply(bfl, function(x) summarizeOverlaps(eByg, x, mode = "Union",
-    ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE))
-
-# Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data
-# set 'singleEnd=FALSE'
-countDFeByg <- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts)
-rownames(countDFeByg) <- names(rowRanges(counteByg[[1]]))
-colnames(countDFeByg) <- names(bfl)
-rpkmDFeByg <- apply(countDFeByg, 2, function(x) returnRPKM(counts = x, ranges = eByg))
-write.table(countDFeByg, "results/countDFeByg.xls", col.names = NA, quote = FALSE,
-    sep = "\t")
-write.table(rpkmDFeByg, "results/rpkmDFeByg.xls", col.names = NA, quote = FALSE,
-    sep = "\t")
-

Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as edgeR or DESeq2, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, e.g. manually comparing the expression levels of different genes or features.

-

Read counting with summarizeOverlaps using multiple nodes of a cluster.

-
library(BiocParallel)
-f <- function(x) {
-    library(systemPipeR)
-    library(BiocParallel)
-    library(GenomicFeatures)
-    txdb <- loadDb("./data/tair10.sqlite")
-    eByg <- exonsBy(txdb, by = "gene")
-    args <- systemArgs(sysma = "param/tophat.param", mytargets = "targets.txt")
-    outpaths <- subsetWF(args, slot = "output", subset = 1, index = 1)
-    bfl <- BamFileList(outpaths, yieldSize = 50000, index = character())
-    summarizeOverlaps(eByg, bfl[x], mode = "Union", ignore.strand = TRUE, inter.feature = TRUE,
-        singleEnd = TRUE)
-}
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-param <- BatchtoolsParam(workers = 4, cluster = "slurm", template = "batchtools.slurm.tmpl",
-    resources = resources)
-counteByg <- bplapply(seq(along = args), f, BPPARAM = param)
-countDFeByg <- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts)
-rownames(countDFeByg) <- names(rowRanges(counteByg[[1]]))
-colnames(countDFeByg) <- names(outpaths)
-

Useful commands for monitoring the progress of submitted jobs

-
getStatus(reg = reg)
-outpaths <- subsetWF(args, slot = "output", subset = 1, index = 1)
-file.exists(outpaths)
-sapply(1:length(outpaths), function(x) loadResult(reg, id = x))  # Works after job completion
-
-

0.6.0.1 Read and alignment count stats

-

Generate a table of read and alignment counts for all samples.

-
read_statsDF <- alignStats(args)
-write.table(read_statsDF, "results/alignStats.xls", row.names = FALSE, quote = FALSE,
-    sep = "\t")
-

The following shows the first four lines of the sample alignment stats file -provided by the systemPipeR package. For simplicity the number of PE reads -is multiplied here by 2 to approximate proper alignment frequencies where each -read in a pair is counted.

-
read.table(system.file("extdata", "alignStats.xls", package = "systemPipeR"), header = TRUE)[1:4,
-    ]
-
##   FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary
-## 1      M1A   192918 177961     92.24697         177961             92.24697
-## 2      M1B   197484 159378     80.70426         159378             80.70426
-## 3      A1A   189870 176055     92.72397         176055             92.72397
-## 4      A1B   188854 147768     78.24457         147768             78.24457
-

Parallelization of read/alignment stats on single machine with multiple cores.

-
f <- function(x) alignStats(args[x])
-read_statsList <- bplapply(seq(along = args), f, BPPARAM = MulticoreParam(workers = 8))
-read_statsDF <- do.call("rbind", read_statsList)
-

Parallelization of read/alignment stats via scheduler (e.g. Slurm) across several compute nodes.

-
library(BiocParallel)
-library(batchtools)
-f <- function(x) {
-    library(systemPipeR)
-    targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-    dir_path <- "param/cwl/hisat2/hisat2-se"  ## TODO: replace path to system.file 
-    args <- loadWorkflow(targets = targets, wf_file = "hisat2-mapping-se.cwl", input_file = "hisat2-mapping-se.yml",
-        dir_path = dir_path)
-    args <- renderWF(args, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
-    args <- output_update(args, dir = FALSE, replace = TRUE, extension = c(".sam",
-        ".bam"))
-    alignStats(args[x])
-}
-resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
-param <- BatchtoolsParam(workers = 4, cluster = "slurm", template = "batchtools.slurm.tmpl",
-    resources = resources)
-read_statsList <- bplapply(seq(along = args), f, BPPARAM = param)
-read_statsDF <- do.call("rbind", read_statsList)
-
-
-
-

0.7 Read counting for miRNA profiling experiments

-

Download miRNA genes from miRBase.

-
system("wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/")
-gff <- import.gff("./data/My_species.gff3")
-gff <- split(gff, elementMetadata(gff)$ID)
-bams <- names(bampaths)
-names(bams) <- targets$SampleName
-bfl <- BamFileList(bams, yieldSize = 50000, index = character())
-countDFmiR <- summarizeOverlaps(gff, bfl, mode = "Union", ignore.strand = FALSE,
-    inter.feature = FALSE)  # Note: inter.feature=FALSE important since pre and mature miRNA ranges overlap
-rpkmDFmiR <- apply(countDFmiR, 2, function(x) returnRPKM(counts = x, gffsub = gff))
-write.table(assays(countDFmiR)$counts, "results/countDFmiR.xls", col.names = NA,
-    quote = FALSE, sep = "\t")
-write.table(rpkmDFmiR, "results/rpkmDFmiR.xls", col.names = NA, quote = FALSE, sep = "\t")
-
-
-

0.8 Correlation analysis of samples

-

The following computes the sample-wise Spearman correlation coefficients from the rlog (regularized-logarithm) transformed expression values generated with the DESeq2 package. After transformation to a distance matrix, hierarchical clustering is performed with the hclust function and the result is plotted as a dendrogram (sample_tree.pdf).

-
library(DESeq2, warn.conflicts = FALSE, quietly = TRUE)
-library(ape, warn.conflicts = FALSE)
-countDFpath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
-countDF <- as.matrix(read.table(countDFpath))
-colData <- data.frame(row.names = targets.as.df(targets(args))$SampleName, condition = targets.as.df(targets(args))$Factor)
-dds <- DESeqDataSetFromMatrix(countData = countDF, colData = colData, design = ~condition)
-
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
-## design formula are characters, converting to factors
-
d <- cor(assay(rlog(dds)), method = "spearman")
-hc <- hclust(dist(1 - d))
-plot.phylo(as.phylo(hc), type = "p", edge.col = 4, edge.width = 3, show.node.label = TRUE,
-    no.margin = TRUE)
-

-
-Figure 6: Correlation dendrogram of samples for rlog values. -
-


-

Alternatively, the clustering can be performed with RPKM normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.

-
rpkmDFeBygpath <- system.file("extdata", "rpkmDFeByg.xls", package = "systemPipeR")
-rpkmDFeByg <- read.table(rpkmDFeBygpath, check.names = FALSE)
-rpkmDFeByg <- rpkmDFeByg[rowMeans(rpkmDFeByg) > 50, ]
-d <- cor(rpkmDFeByg, method = "spearman")
-hc <- hclust(as.dist(1 - d))
-plot.phylo(as.phylo(hc), type = "p", edge.col = "blue", edge.width = 2, show.node.label = TRUE,
-    no.margin = TRUE)
-
-
-

0.9 DEG analysis with edgeR

-

The following run_edgeR function is a convenience wrapper for -identifying differentially expressed genes (DEGs) in batch mode with -edgeR’s GML method (Robinson, McCarthy, and Smyth 2010) for any number of -pairwise sample comparisons specified under the cmp argument. Users -are strongly encouraged to consult the -edgeR vignette -for more detailed information on this topic and how to properly run edgeR -on data sets with more complex experimental designs.

-
targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
-targets <- read.delim(targetspath, comment = "#")
-cmp <- readComp(file = targetspath, format = "matrix", delim = "-")
-cmp[[1]]
-
##       [,1]  [,2] 
-##  [1,] "M1"  "A1" 
-##  [2,] "M1"  "V1" 
-##  [3,] "A1"  "V1" 
-##  [4,] "M6"  "A6" 
-##  [5,] "M6"  "V6" 
-##  [6,] "A6"  "V6" 
-##  [7,] "M12" "A12"
-##  [8,] "M12" "V12"
-##  [9,] "A12" "V12"
-
countDFeBygpath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
-countDFeByg <- read.delim(countDFeBygpath, row.names = 1)
-edgeDF <- run_edgeR(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], independent = FALSE,
-    mdsplot = "")
-
## Disp = 0.21829 , BCV = 0.4672
-

Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the FDR value has been set to a relatively high threshold (here 10%). More commonly used FDR cutoffs are 1% or 5%. The definition of ‘up’ and ‘down’ is given in the corresponding help file. To open it, type ?filterDEGs in the R console.

-
DEG_list <- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10))
-

-
-Figure 7: Up and down regulated DEGs identified by edgeR. -
-


-
names(DEG_list)
-
## [1] "UporDown" "Up"       "Down"     "Summary"
-
DEG_list$Summary[1:4, ]
-
##       Comparisons Counts_Up_or_Down Counts_Up Counts_Down
-## M1-A1       M1-A1                 0         0           0
-## M1-V1       M1-V1                 1         1           0
-## A1-V1       A1-V1                 1         1           0
-## M6-A6       M6-A6                 0         0           0
-
-
-

0.10 DEG analysis with DESeq2

-

The following run_DESeq2 function is a convenience wrapper for -identifying DEGs in batch mode with DESeq2 (Love, Huber, and Anders 2014) for any number of -pairwise sample comparisons specified under the cmp argument. Users -are strongly encouraged to consult the -DESeq2 vignette -for more detailed information on this topic and how to properly run DESeq2 -on data sets with more complex experimental designs.

-
degseqDF <- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]],
-    independent = FALSE)
-
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
-## design formula are characters, converting to factors
-

Filter and plot DEG results for up and down-regulated genes.

-
DEG_list2 <- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10))
-

-
-Figure 8: Up and down regulated DEGs identified by DESeq2. -
-


-
-
-

0.11 Venn Diagrams

-

The function overLapper can compute Venn intersects for large numbers of sample sets (up to 20 or more) and vennPlot can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).

-
vennsetup <- overLapper(DEG_list$Up[6:9], type = "vennsets")
-vennsetdown <- overLapper(DEG_list$Down[6:9], type = "vennsets")
-vennPlot(list(vennsetup, vennsetdown), mymain = "", mysub = "", colmode = 2, ccol = c("blue",
-    "red"))
-

-
-Figure 9: Venn Diagram for 4 Up and Down DEG Sets. -
-


-
-
-

0.12 GO term enrichment analysis of DEGs

-
-

0.12.1 Obtain gene-to-GO mappings

-

The following shows how to obtain gene-to-GO mappings from biomaRt (here for A. thaliana) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s *.db genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the load function as shown in the next subsection.

-
library("biomaRt")
-listMarts()  # To choose BioMart database
-listMarts(host = "plants.ensembl.org")
-m <- useMart("plants_mart", host = "plants.ensembl.org")
-listDatasets(m)
-m <- useMart("plants_mart", dataset = "athaliana_eg_gene", host = "plants.ensembl.org")
-listAttributes(m)  # Choose data types you want to download
-go <- getBM(attributes = c("go_id", "tair_locus", "namespace_1003"), mart = m)
-go <- go[go[, 3] != "", ]
-go[, 3] <- as.character(go[, 3])
-go[go[, 3] == "molecular_function", 3] <- "F"
-go[go[, 3] == "biological_process", 3] <- "P"
-go[go[, 3] == "cellular_component", 3] <- "C"
-go[1:4, ]
-dir.create("./data/GO")
-write.table(go, "data/GO/GOannotationsBiomart_mod.txt", quote = FALSE, row.names = FALSE,
-    col.names = FALSE, sep = "\t")
-catdb <- makeCATdb(myfile = "data/GO/GOannotationsBiomart_mod.txt", lib = NULL, org = "",
-    colno = c(1, 2, 3), idconv = NULL)
-save(catdb, file = "data/GO/catdb.RData")
-
-
-

0.12.2 Batch GO term enrichment analysis

-

Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the FDR filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the GOCluster_Report function. When method="all", it returns all GO terms passing the p-value cutoff specified under the cutoff arguments. When method="slim", it returns only the GO terms specified under the myslimv argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.

-
load("data/GO/catdb.RData")
-DEG_list <- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 50), plot = FALSE)
-up_down <- DEG_list$UporDown
-names(up_down) <- paste(names(up_down), "_up_down", sep = "")
-up <- DEG_list$Up
-names(up) <- paste(names(up), "_up", sep = "")
-down <- DEG_list$Down
-names(down) <- paste(names(down), "_down", sep = "")
-DEGlist <- c(up_down, up, down)
-DEGlist <- DEGlist[sapply(DEGlist, length) > 0]
-BatchResult <- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = "all",
-    id_type = "gene", CLSZ = 2, cutoff = 0.9, gocats = c("MF", "BP", "CC"), recordSpecGO = NULL)
-library("biomaRt")
-m <- useMart("plants_mart", dataset = "athaliana_eg_gene", host = "plants.ensembl.org")
-goslimvec <- as.character(getBM(attributes = c("goslim_goa_accession"), mart = m)[,
-    1])
-BatchResultslim <- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = "slim",
-    id_type = "gene", myslimv = goslimvec, CLSZ = 10, cutoff = 0.01, gocats = c("MF",
-        "BP", "CC"), recordSpecGO = NULL)
-
-
-

0.12.3 Plot batch GO term results

-

The data.frame generated by GOCluster_Report can be plotted with the goBarplot function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.

-
gos <- BatchResultslim[grep("M6-V6_up_down", BatchResultslim$CLID), ]
-gos <- BatchResultslim
-pdf("GOslimbarplotMF.pdf", height = 8, width = 10)
-goBarplot(gos, gocat = "MF")
-dev.off()
-goBarplot(gos, gocat = "BP")
-goBarplot(gos, gocat = "CC")
- -
-Figure 10: GO Slim Barplot for MF Ontology. -
-


-
-
-
-

0.13 Clustering and heat maps

-

The following example performs hierarchical clustering on the rlog transformed expression matrix subsetted by the DEGs identified in the -above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.

-
library(pheatmap)
-geneids <- unique(as.character(unlist(DEG_list[[1]])))
-y <- assay(rlog(dds))[geneids, ]
-pdf("heatmap1.pdf")
-pheatmap(y, scale = "row", clustering_distance_rows = "correlation", clustering_distance_cols = "correlation")
-dev.off()
-
- -
-
-Figure 11: Heat map with hierarchical clustering dendrograms of DEGs. -
-


-
-
-

References

-
-
-Kim, Daehwan, Ben Langmead, and Steven L Salzberg. 2015. HISAT: A Fast Spliced Aligner with Low Memory Requirements.” Nat. Methods 12 (4): 357–60. -
-
-Kim, Daehwan, Geo Pertea, Cole Trapnell, Harold Pimentel, Ryan Kelley, and Steven L Salzberg. 2013. TopHat2: Accurate Alignment of Transcriptomes in the Presence of Insertions, Deletions and Gene Fusions.” Genome Biol. 14 (4): R36. https://doi.org/10.1186/gb-2013-14-4-r36. -
-
-Langmead, Ben, and Steven L Salzberg. 2012. “Fast Gapped-Read Alignment with Bowtie 2.” Nat. Methods 9 (4): 357–59. https://doi.org/10.1038/nmeth.1923. -
-
-Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-seq Data with DESeq2.” Genome Biol. 15 (12): 550. https://doi.org/10.1186/s13059-014-0550-8. -
-
-Morgan, Martin, Hervé Pagès, Valerie Obenchain, and Nathaniel Hayden. 2019. Rsamtools: Binary Alignment (BAM), FASTA, Variant Call (BCF), and Tabix File Import. http://bioconductor.org/packages/Rsamtools. -
-
-Robinson, M D, D J McCarthy, and G K Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616. -
-
-Wu, T D, and S Nacu. 2010. “Fast and SNP-tolerant Detection of Complex Variants and Splicing in Short Reads.” Bioinformatics 26 (7): 873–81. https://doi.org/10.1093/bioinformatics/btq057. -
-
-
- - - -
-
- -
- - - - - - - - - - - - - - - - - - diff --git a/content/en/sp/spr/steps.markdown b/content/en/sp/spr/steps.markdown index 45c0f2e8f..7b874531a 100644 --- a/content/en/sp/spr/steps.markdown +++ b/content/en/sp/spr/steps.markdown @@ -1,7 +1,7 @@ --- title: "Workflow steps overview" author: "Author: Daniela Cassol (danielac@ucr.edu) and Thomas Girke (thomas.girke@ucr.edu)" -date: "Last update: 20 April, 2021" +date: "Last update: 28 October, 2021" output: BiocStyle::html_document: toc_float: true @@ -14,7 +14,7 @@ vignette: | %\VignetteEngine{knitr::rmarkdown} fontsize: 14pt bibliography: bibtex.bib -editor_options: +editor_options: chunk_output_type: console type: docs weight: 4 @@ -31,7 +31,7 @@ document.addEventListener("DOMContentLoaded", function() {

Not found

Oops! This page doesn't exist. Try going back to our home page.

You can learn how to make a 404 page like this in Custom 404 Pages.

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

Not found

+

Oops! This page doesn't exist. Try going back to our home page.

+ +

You can learn how to make a 404 page like this in Custom 404 Pages.

+
+
+ +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/about/acknowledgement/index.html b/public/about/acknowledgement/index.html index 45af71f6f..ec94f42de 100644 --- a/public/about/acknowledgement/index.html +++ b/public/about/acknowledgement/index.html @@ -1,47 +1,822 @@ -Acknowledgement | sysPipe

Acknowledgement

Acknowledgement

This project is funded by NSF award ABI-1661152 and the USDA National Institute of Food and Agriculture, Hatch project #1016331.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

Acknowledgement

+ + +

Acknowledgement

+

This project is funded by NSF award ABI-1661152 and the USDA National Institute of Food and Agriculture, Hatch project #1016331.

+
+ + + +
Last modified 2021-05-05: offline search;no_render (7d8d025a) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/about/contact/index.html b/public/about/contact/index.html index ec1d597b9..17a8a587c 100644 --- a/public/about/contact/index.html +++ b/public/about/contact/index.html @@ -1,50 +1,836 @@ -Contact | sysPipe

Contact



Thomas Girke, Ph.D.
Professor of Bioinformatics
Director of HPC Center (HPCC)
Institute for Integrative Genome Biology (IIGB)
Department of Botany and Plant Sciences (BPSC)
1207F Genomics Building
University of California, Riverside (UCR)
CA 92521
Email: thomas.girke@ucr.edu

Daniela Cassol, Ph.D.
Postdoctoral Researcher
Department of Botany and Plant Sciences (BPSC)
1207E Genomics Building
University of California, Riverside (UCR)
CA 92521

Email: danielac@ucr.edu

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

Contact

+ + +



+

Thomas Girke, Ph.D.
+Professor of Bioinformatics
+Director of HPC Center (HPCC)
+Institute for Integrative Genome Biology (IIGB)
+Department of Botany and Plant Sciences (BPSC)
+1207F Genomics Building
+University of California, Riverside (UCR)
+CA 92521
+Email: thomas.girke@ucr.edu

+

Daniela Cassol, Ph.D.
+Postdoctoral Researcher
+Department of Botany and Plant Sciences (BPSC)
+1207E Genomics Building
+University of California, Riverside (UCR)
+CA 92521

+

Email: danielac@ucr.edu

+ + + +
Last modified 2021-05-05: offline search;no_render (7d8d025a) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/about/index.html b/public/about/index.html index b3bd90a70..5dfaf8265 100644 --- a/public/about/index.html +++ b/public/about/index.html @@ -1,47 +1,858 @@ -About systemPipe Project | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

About systemPipe Project

+ + + +
+ + + + + +
+ + +
+
+ systemPipe Workflow Environment +
+

+
+ + + +
+
+ Our Team +
+

+
+ + + +
+
+ Publications +
+

+
+ + + +
+
+ Acknowledgement +
+

+
+ + + +
+
+ Contact +
+

+
+ + + + + +
+ + + +
Last modified 2021-05-05: offline search;no_render (7d8d025a) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/about/index.xml b/public/about/index.xml index c30cb55f4..4a595356d 100644 --- a/public/about/index.xml +++ b/public/about/index.xml @@ -1 +1,17 @@ -sysPipe – About systemPipe Project/about/Recent content in About systemPipe Project on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – About systemPipe Project + /about/ + Recent content in About systemPipe Project on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/about/overview/index.html b/public/about/overview/index.html index e288a3d13..36c9c8f05 100644 --- a/public/about/overview/index.html +++ b/public/about/overview/index.html @@ -1,65 +1,884 @@ -systemPipe Workflow Environment | sysPipe + + + + + + + + + + + + + + + + + +systemPipe Workflow Environment | sysPipe + + + + + + + + + + + + + + +

systemPipe Workflow Environment

systemPipeR and systemPipeShiny full documentation!

systemPipe (SP) is a generic toolkit for designing and running reproducible data + systemPipeShiny (SPS) integrates a graphical user interface for managing workflows and visualizing results interactively."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

systemPipe Workflow Environment

+ + + + +
+

systemPipeR and systemPipeShiny full documentation!

+ +
+ +

systemPipe (SP) is a generic toolkit for designing and running reproducible data analysis workflows. The environment consists of three major modules implemented -as R/Bioconductor packages.

  • systemPipeR (SPR) provides core functionalities for defining workflows, +as R/Bioconductor packages.

    +

    +
      +
    • +

      systemPipeR (SPR) provides core functionalities for defining workflows, interacting with command-line software, and executing both R and/or command-line -software, as well as generating publication-quality analysis reports.

    • systemPipeShiny (SPS) integrates a graphical user interface for managing -workflows and visualizing results interactively.

    • systemPipeWorkflow (SPW) offers a collection of pre-configured workflow templates.

    Availability

    All the packages are freely available for all common operating systems from -Bioconductor.

    Acknowledgement

    This project is funded by NSF award ABI-1661152.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/about/publications/index.html b/public/about/publications/index.html index a865b7743..d9268ed70 100644 --- a/public/about/publications/index.html +++ b/public/about/publications/index.html @@ -1,50 +1,1037 @@ -Publications | sysPipe

Publications

Publications of this project

Journal publications

  • Duan Y, Evans DS, Miller RA, Schork NJ, Cummings SR, Girke T. signatureSearch: environment for gene expression signature searching and functional interpretation. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):e124. Available from: http://dx.doi.org/10.1093/nar/gkaa878 PMCID: PMC7708038{blk}

  • Lombard DB, Kohler WJ, Guo AH, Gendron C, Han M, Ding W, Lyu Y, Ching T-T, Wang F-Y, Chakraborty TS, Nikolovska-Coleska Z, Duan Y, Girke T, Hsu A-L, Pletcher SD, Miller RA. High-throughput small molecule screening reveals Nrf2-dependent and -independent pathways of cellular stress resistance. Sci Adv [Internet]. 2020 Oct;6(40). Available from: http://dx.doi.org/10.1126/sciadv.aaz7628 PMCID: PMC7852388{blk}

  • Hamilton MJ, Young M, Jang K, Sauer S, Neang VE, King AT, Girke T, Martinez E. HOTAIRM1 lncRNA is downregulated in clear cell renal cell carcinoma and inhibits the hypoxia pathway. Cancer Lett [Internet]. 2020 Mar 1;472:50–58. Available from: http://dx.doi.org/10.1016/j.canlet.2019.12.022 PMCID: PMC6992348{blk}

  • Pozuelos GL, Kagda MS, Schick S, Girke T, Volz DC, Talbot P. Experimental Acute Exposure to Thirdhand Smoke and Changes in the Human Nasal Epithelial Transcriptome: A Randomized Clinical Trial. JAMA Netw Open [Internet]. 2019 Jun 5;2(6):e196362. Available from: http://dx.doi.org/10.1001/jamanetworkopen.2019.6362 PMCID: PMC6604097{blk}

  • Hamilton MJ, Girke T, Martinez E. Global isoform-specific transcript alterations and deregulated networks in clear cell renal cell carcinoma. Oncotarget [Internet]. 2018 May 4;9(34):23670–23680. Available from: http://dx.doi.org/10.18632/oncotarget.25330 PMCID: PMC5955119{blk}

  • Teixeira MA, Sela N, Atamian HS, Bao E, Chaudhary R, MacWilliams J, He J, Mantelin S, Girke T, Kaloshian I. Sequence analysis of the potato aphid Macrosiphum euphorbiae transcriptome identified two new viruses. PLoS One [Internet]. Public Library of Science; 2018 Mar 29 [cited 2021 Apr 26];13(3):e0193239. Available from: https://journals.plos.org/plosone/article/file?id=10.1371/journal.pone.0193239&type=printable PMCID: PMC5875755{blk}

  • Zillikens MC, et al. Large meta-analysis of genome-wide association studies identifies five loci for lean body mass. Nat Commun [Internet]. Nature Publishing Group; 2017 Jul 19 [cited 2021 Apr 26];8(1):1–13. Available from: https://www.nature.com/articles/s41467-017-00031-7 PMCID: 29116125

  • Zhang X, Aksoy E, Girke T, Raikhel AS, Karginov FV. Transcriptome-wide microRNA and target dynamics in the fat body during the gonadotrophic cycle of Aedes aegypti. Proc Natl Acad Sci U S A [Internet]. 2017 Mar 7;114(10):E1895–E1903. Available from: http://dx.doi.org/10.1073/pnas.1701474114 PMCID: PMC5347622{blk}

  • H Backman TW, Girke T. systemPipeR: NGS workflow and report generation environment. BMC Bioinformatics [Internet]. 2016 Sep 20;17:388. Available from: http://dx.doi.org/10.1186/s12859-016-1241-0 PMCID: PMC5029110{blk}

[ PubMed ] - [ Google Scholar ]

  • Chen Y, Liu M, Dong Z. Preferential Ribosome Loading on the Stress-Upregulated mRNA Pool Shapes the Selective Translation under Stress Conditions. Plants [Internet]. 2021 Feb 5;10(2). Available from: http://dx.doi.org/10.3390/plants10020304 PMCID: PMC7915710{blk}

  • Lima TS, Mallya S, Jankeel A, Messaoudi I, Lodoen MB. Toxoplasma gondii Extends the Life Span of Infected Human Neutrophils by Inducing Cytosolic PCNA and Blocking Activation of Apoptotic Caspases. MBio [Internet]. 2021 Jan 26;12(1). Available from: http://dx.doi.org/10.1128/mBio.02031-20 PMCID: PMC7858050{blk}

  • Furuyama W, Shifflett K, Pinski AN, Griffin AJ, Feldmann F, Okumura A, Gourdine T, Jankeel A, Lovaglio J, Hanley PW, Thomas T, Clancy CS, Messaoudi I, O’Donnell KL, Marzi A. Rapid protection from COVID-19 in nonhuman primates vaccinated intramuscularly but not intranasally with a single dose of a recombinant vaccine. bioRxiv [Internet]. 2021 Jan 19; Available from: http://dx.doi.org/10.1101/2021.01.19.426885 PMCID: PMC7836117{blk}

  • Procida T, Friedrich T, Jack APM, Peritore M, Bönisch C, Eberl HC, Daus N, Kletenkov K, Nist A, Stiewe T, Borggrefe T, Mann M, Bartkuhn M, Hake SB. JAZF1, A Novel p400/TIP60/NuA4 Complex Member, Regulates H2A.Z Acetylation at Regulatory Regions. Int J Mol Sci [Internet]. 2021 Jan 12;22(2). Available from: http://dx.doi.org/10.3390/ijms22020678 PMCID: PMC7826843{blk}

  • Chen L, Walker AR, Burne RA, Zeng L. Amino Sugars Reshape Interactions between Streptococcus mutans and Streptococcus gordonii. Appl Environ Microbiol [Internet]. 2020 Dec 17;87(1). Available from: http://dx.doi.org/10.1128/AEM.01459-20 PMCID: PMC7755246{blk}

  • Duan Y, Evans DS, Miller RA, Schork NJ, Cummings SR, Girke T. signatureSearch: environment for gene expression signature searching and functional interpretation. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):e124. Available from: http://dx.doi.org/10.1093/nar/gkaa878 PMCID: PMC7708038{blk}

  • Li K, Hope CM, Wang XA, Wang J-P. RiboDiPA: a novel tool for differential pattern analysis in Ribo-seq data. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):12016–12029. Available from: http://dx.doi.org/10.1093/nar/gkaa1049 PMCID: PMC7708064{blk}

  • Berg JA, Hermans FWK, Beenders F, Lou L, Vriezen WH, Visser RGF, Bai Y, Schouten HJ. Analysis of QTL DM4.1 for Downy Mildew Resistance in Cucumber Reveals Multiple subQTL: A Novel RLK as Candidate Gene for the Most Important subQTL. Front Plant Sci [Internet]. 2020 Oct 22;11:569876. Available from: http://dx.doi.org/10.3389/fpls.2020.569876 PMCID: PMC7649820{blk}

  • Kagda MS, Martínez-Soto D, Ah-Fong AMV, Judelson HS. Invertases in Phytophthora infestans Localize to Haustoria and Are Programmed for Infection-Specific Expression. MBio [Internet]. 2020 Oct 13;11(5). Available from: http://dx.doi.org/10.1128/mBio.01251-20 PMCID: PMC7554665{blk}

  • Lou B, Boger M, Bennewitz K, Sticht C, Kopf S, Morgenstern J, Fleming T, Hell R, Yuan Z, Nawroth PP, Kroll J. Elevated 4-hydroxynonenal induces hyperglycaemia via Aldh3a1 loss in zebrafish and associates with diabetes progression in humans. Redox Biol [Internet]. 2020 Oct;37:101723. Available from: http://dx.doi.org/10.1016/j.redox.2020.101723 PMCID: PMC7519378{blk}

  • Iwanami N, Lawir D-F, Sikora K, O Meara C, Takeshita K, Schorpp M, Boehm T. Transgenerational inheritance of impaired larval T cell development in zebrafish. Nat Commun [Internet]. 2020 Sep 9;11(1):4505. Available from: http://dx.doi.org/10.1038/s41467-020-18289-9 PMCID: PMC7481223{blk}

  • Akbarzadeh A, Houde ALS, Sutherland BJG, Günther OP, Miller KM. Identification of Hypoxia-Specific Biomarkers in Salmonids Using RNA-Sequencing and Validation Using High-Throughput qPCR. G3 [Internet]. 2020 Sep 2;10(9):3321–3336. Available from: http://dx.doi.org/10.1534/g3.120.401487 PMCID: PMC7466982{blk}

  • Li F, Xing X, Xiao Z, Xu G, Yang X. RiboMiner: a toolset for mining multi-dimensional features of the translatome with ribosome profiling data. BMC Bioinformatics [Internet]. 2020 Aug 1;21(1):340. Available from: http://dx.doi.org/10.1186/s12859-020-03670-8 PMCID: PMC7430821{blk}

  • Fernández-Calero T, Davyt M, Perelmuter K, Chalar C, Bampi G, Persson H, Tosar JP, Hafstað V, Naya H, Rovira C, Bollati-Fogolín M, Ehrlich R, Flouriot G, Ignatova Z, Marín M. Fine-tuning the metabolic rewiring and adaptation of translational machinery during an epithelial-mesenchymal transition in breast cancer cells. Cancer Metab [Internet]. 2020 Jul 19;8:8. Available from: http://dx.doi.org/10.1186/s40170-020-00216-7 PMCID: PMC7368990{blk}

  • Liu Q, Shvarts T, Sliz P, Gregory RI. RiboToolkit: an integrated platform for analysis and annotation of ribosome profiling data to decode mRNA translation at codon resolution. Nucleic Acids Res [Internet]. 2020 Jul 2;48(W1):W218–W229. Available from: http://dx.doi.org/10.1093/nar/gkaa395 PMCID: PMC7319539{blk}

  • Alam R, Hummel M, Yeung E, Locke AM, Ignacio JCI, Baltazar MD, Jia Z, Ismail AM, Septiningsih EM, Bailey-Serres J. Flood resilience loci SUBMERGENCE 1 and ANAEROBIC GERMINATION 1 interact in seedlings established underwater. Plant Direct [Internet]. 2020 Jul;4(7):e00240. Available from: http://dx.doi.org/10.1002/pld3.240 PMCID: PMC7403837{blk}

  • Ehrary A, Rosas M, Carpinelli S, Davalos O, Cowling C, Fernandez F, Escobar M. Glutaredoxin AtGRXS8 represses transcriptional and developmental responses to nitrate in Arabidopsis thaliana roots. Plant Direct [Internet]. 2020 Jun;4(6):e00227. Available from: http://dx.doi.org/10.1002/pld3.227 PMCID: PMC7287413{blk}

  • Jankeel A, Menicucci AR, Woolsey C, Fenton KA, Mendoza N, Versteeg K, Cross RW, Geisbert TW, Messaoudi I. Early Transcriptional Changes within Liver, Adrenal Gland, and Lymphoid Tissues Significantly Contribute to Ebola Virus Pathogenesis in Cynomolgus Macaques. J Virol [Internet]. 2020 May 18;94(11). Available from: http://dx.doi.org/10.1128/JVI.00250-20 PMCID: PMC7269430{blk}

  • Gómez-Martín C, Capel C, González AM, Lebrón R, Yuste-Lisbona FJ, Hackenberg M, Oliver JL, Santalla M, Lozano R. Transcriptional Dynamics and Candidate Genes Involved in Pod Maturation of Common Bean (Phaseolus vulgaris L.). Plants [Internet]. 2020 Apr 22;9(4). Available from: http://dx.doi.org/10.3390/plants9040545 PMCID: PMC7238275{blk}

  • Lee SC, Ernst E, Berube B, Borges F, Parent J-S, Ledon P, Schorn A, Martienssen RA. Arabidopsis retrotransposon virus-like particles and their regulation by epigenetically activated small RNA. Genome Res [Internet]. 2020 Apr;30(4):576–588. Available from: http://dx.doi.org/10.1101/gr.259044.119 PMCID: PMC7197481{blk}

  • Hamilton MJ, Young M, Jang K, Sauer S, Neang VE, King AT, Girke T, Martinez E. HOTAIRM1 lncRNA is downregulated in clear cell renal cell carcinoma and inhibits the hypoxia pathway. Cancer Lett [Internet]. 2020 Mar 1;472:50–58. Available from: http://dx.doi.org/10.1016/j.canlet.2019.12.022 PMCID: PMC6992348{blk}

  • Bjorbækmo MFM, Evenstad A, Røsæg LL, Krabberød AK, Logares R. The planktonic protist interactome: where do we stand after a century of research? ISME J [Internet]. 2020 Feb;14(2):544–559. Available from: http://dx.doi.org/10.1038/s41396-019-0542-5 PMCID: PMC6976576{blk}

  • Meng H, Feng J, Bai T, Jian Z, Chen Y, Wu G. Genome-wide analysis of short interspersed nuclear elements provides insight into gene and genome evolution in citrus. DNA Res [Internet]. 2020 Feb 1;27(1). Available from: http://dx.doi.org/10.1093/dnares/dsaa004 PMCID: PMC7315354{blk}

  • Irigoyen ML, Garceau DC, Bohorquez-Chaux A, Lopez-Lavalle LAB, Perez-Fons L, Fraser PD, Walling LL. Genome-wide analyses of cassava Pathogenesis-related (PR) gene families reveal core transcriptome responses to whitefly infestation, salicylic acid and jasmonic acid. BMC Genomics [Internet]. 2020 Jan 29;21(1):93. Available from: http://dx.doi.org/10.1186/s12864-019-6443-1 PMCID: PMC6990599{blk}

  • Franklin-Murray AL, Mallya S, Jankeel A, Sureshchandra S, Messaoudi I, Lodoen MB. Toxoplasma gondii Dysregulates Barrier Function and Mechanotransduction Signaling in Human Endothelial Cells. mSphere [Internet]. 2020 Jan 29;5(1). Available from: http://dx.doi.org/10.1128/mSphere.00550-19 PMCID: PMC6992369{blk}

  • Berg JA, Belyeu JR, Morgan JT, Ouyang Y, Bott AJ, Quinlan AR, Gertz J, Rutter J. XPRESSyourself: Enhancing, standardizing, and automating ribosome profiling computational analyses yields improved insight into data. PLoS Comput Biol [Internet]. 2020 Jan;16(1):e1007625. Available from: http://dx.doi.org/10.1371/journal.pcbi.1007625 PMCID: PMC7015430{blk}

  • Zhao C, Rispe C, Nabity PD. Secretory RING finger proteins function as effectors in a grapevine galling insect. BMC Genomics [Internet]. 2019 Dec 3;20(1):923. Available from: http://dx.doi.org/10.1186/s12864-019-6313-x PMCID: PMC6892190{blk}

  • Dhahbi J, Nunez Lopez YO, Schneider A, Victoria B, Saccon T, Bharat K, McClatchey T, Atamna H, Scierski W, Golusinski P, Golusinski W, Masternak MM. Profiling of tRNA Halves and YRNA Fragments in Serum and Tissue From Oral Squamous Cell Carcinoma Patients Identify Key Role of 5’ tRNA-Val-CAC-2-1 Half. Front Oncol [Internet]. 2019 Sep 26;9:959. Available from: http://dx.doi.org/10.3389/fonc.2019.00959 PMCID: PMC6775249{blk}

  • Woolsey C, Menicucci AR, Cross RW, Luthra P, Agans KN, Borisevich V, Geisbert JB, Mire CE, Fenton KA, Jankeel A, Anand S, Ebihara H, Geisbert TW, Messaoudi I, Basler CF. A VP35 Mutant Ebola Virus Lacks Virulence but Can Elicit Protective Immunity to Wild-Type Virus Challenge. Cell Rep [Internet]. 2019 Sep 17;28(12):3032–3046.e6. Available from: http://dx.doi.org/10.1016/j.celrep.2019.08.047 PMCID: PMC6886687{blk}

  • Smestad JA, Maher LJ 3rd. Master regulator analysis of paragangliomas carrying SDHx, VHL, or MAML3 genetic alterations. BMC Cancer [Internet]. 2019 Jun 24;19(1):619. Available from: http://dx.doi.org/10.1186/s12885-019-5813-z PMCID: PMC6591808{blk}

  • Perkins P, Mazzoni-Putman S, Stepanova A, Alonso J, Heber S. RiboStreamR: a web application for quality control, analysis, and visualization of Ribo-seq data. BMC Genomics [Internet]. 2019 Jun 6;20(Suppl 5):422. Available from: http://dx.doi.org/10.1186/s12864-019-5700-7 PMCID: PMC6551240{blk}

  • Pozuelos GL, Kagda MS, Schick S, Girke T, Volz DC, Talbot P. Experimental Acute Exposure to Thirdhand Smoke and Changes in the Human Nasal Epithelial Transcriptome: A Randomized Clinical Trial. JAMA Netw Open [Internet]. 2019 Jun 5;2(6):e196362. Available from: http://dx.doi.org/10.1001/jamanetworkopen.2019.6362 PMCID: PMC6604097{blk}

  • Barr T, Lewis SA, Sureshchandra S, Doratt B, Grant KA, Messaoudi I. Chronic ethanol consumption alters lamina propria leukocyte response to stimulation in a region-dependent manner. FASEB J [Internet]. 2019 Jun;33(6):7767–7777. Available from: http://dx.doi.org/10.1096/fj.201802780R PMCID: PMC6529332{blk}

  • Menicucci AR, Jankeel A, Feldmann H, Marzi A, Messaoudi I. Antiviral Innate Responses Induced by VSV-EBOV Vaccination Contribute to Rapid Protection. MBio [Internet]. 2019 May 28;10(3). Available from: http://dx.doi.org/10.1128/mBio.00597-19 PMCID: PMC6538780{blk}

  • Babarinde IA, Li Y, Hutchins AP. Computational Methods for Mapping, Assembly and Quantification for Coding and Non-coding Transcripts. Comput Struct Biotechnol J [Internet]. 2019 May 7;17:628–637. Available from: http://dx.doi.org/10.1016/j.csbj.2019.04.012 PMCID: PMC6526290{blk}

  • Karginov FV. HuR controls apoptosis and activation response without effects on cytokine 3’ UTRs. RNA Biol [Internet]. 2019 May;16(5):686–695. Available from: http://dx.doi.org/10.1080/15476286.2019.1582954 PMCID: PMC6546391{blk}

  • Blair EJ, Bonnot T, Hummel M, Hay E, Marzolino JM, Quijada IA, Nagel DH. Contribution of time of day and the circadian clock to the heat stress responsive transcriptome in Arabidopsis. Sci Rep [Internet]. 2019 Mar 18;9(1):4814. Available from: http://dx.doi.org/10.1038/s41598-019-41234-w PMCID: PMC6423321{blk}

  • Joo T, Choi J-H, Lee J-H, Park SE, Jeon Y, Jung SH, Woo HG. SEQprocess: a modularized and customizable pipeline framework for NGS processing in R package. BMC Bioinformatics [Internet]. 2019 Feb 20;20(1):90. Available from: http://dx.doi.org/10.1186/s12859-019-2676-x PMCID: PMC6383233{blk}

  • Nunez Lopez YO, Retnakaran R, Zinman B, Pratley RE, Seyhan AA. Predicting and understanding the response to short-term intensive insulin therapy in people with early type 2 diabetes. Mol Metab [Internet]. 2019 Feb;20:63–78. Available from: http://dx.doi.org/10.1016/j.molmet.2018.11.003 PMCID: PMC6358589{blk}

  • Shultzaberger RK, Abrams RE, Sullivan CJ, Schmitt AD, Thompson TWJ, Dresios J. Agnostic detection of genomic alterations by holistic DNA structural interrogation. PLoS One [Internet]. 2018 Nov 29;13(11):e0208054. Available from: http://dx.doi.org/10.1371/journal.pone.0208054 PMCID: PMC6264503{blk}

  • Gongol B, Sari I, Bryant T, Rosete G, Marin T. AMPK: An Epigenetic Landscape Modulator. Int J Mol Sci [Internet]. 2018 Oct 19;19(10). Available from: http://dx.doi.org/10.3390/ijms19103238 PMCID: PMC6214086{blk}

  • Jacobsen MD, Beynon RJ, Gethings LA, Claydon AJ, Langridge JI, Vissers JPC, Brown AJP, Hammond DE. Specificity of the osmotic stress response in Candida albicans highlighted by quantitative proteomics. Sci Rep [Internet]. 2018 Sep 27;8(1):14492. Available from: http://dx.doi.org/10.1038/s41598-018-32792-6 PMCID: PMC6160413{blk}

  • Mazzoni-Putman SM, Stepanova AN. A Plant Biologist’s Toolbox to Study Translation. Front Plant Sci [Internet]. 2018 Jul 2;9:873. Available from: http://dx.doi.org/10.3389/fpls.2018.00873 PMCID: PMC6036148{blk}

  • Hamilton MJ, Girke T, Martinez E. Global isoform-specific transcript alterations and deregulated networks in clear cell renal cell carcinoma. Oncotarget [Internet]. 2018 May 4;9(34):23670–23680. Available from: http://dx.doi.org/10.18632/oncotarget.25330 PMCID: PMC5955119{blk}

  • Eastman G, Smircich P, Sotelo-Silveira JR. Following Ribosome Footprints to Understand Translation at a Genome Wide Level. Comput Struct Biotechnol J [Internet]. 2018 May 1;16:167–176. Available from: http://dx.doi.org/10.1016/j.csbj.2018.04.001 PMCID: PMC6066590{blk}

  • Smestad J, Hamidi O, Wang L, Holte MN, Khazal FA, Erber L, Chen Y, Maher LJ 3rd. Characterization and metabolic synthetic lethal testing in a new model of SDH-loss familial pheochromocytoma and paraganglioma. Oncotarget [Internet]. 2018 Jan 19;9(5):6109–6127. Available from: http://dx.doi.org/10.18632/oncotarget.23639 PMCID: PMC5814199{blk}

  • Marzi A, Menicucci AR, Engelmann F, Callison J, Horne EJ, Feldmann F, Jankeel A, Feldmann H, Messaoudi I. Protection Against Marburg Virus Using a Recombinant VSV-Vaccine Depends on T and B Cell Activation. Front Immunol [Internet]. 2018;9:3071. Available from: http://dx.doi.org/10.3389/fimmu.2018.03071 PMCID: PMC6350103{blk}

  • Abrahamian M, Kagda M, Ah-Fong AMV, Judelson HS. Rethinking the evolution of eukaryotic metabolism: novel cellular partitioning of enzymes in stramenopiles links serine biosynthesis to glycolysis in mitochondria. BMC Evol Biol [Internet]. 2017 Dec 4;17(1):241. Available from: http://dx.doi.org/10.1186/s12862-017-1087-8 PMCID: PMC5715807{blk}

  • Bazin J, Baerenfaller K, Gosai SJ, Gregory BD, Crespi M, Bailey-Serres J. Global analysis of ribosome-associated noncoding RNAs unveils new modes of translational regulation. Proc Natl Acad Sci U S A [Internet]. 2017 Nov 14;114(46):E10018–E10027. Available from: http://dx.doi.org/10.1073/pnas.1708433114 PMCID: PMC5699049{blk}

  • Weisberg AJ, Kim G, Westwood JH, Jelesko JG. Sequencing and De Novo Assembly of the Toxicodendron radicans (Poison Ivy) Transcriptome. Genes [Internet]. 2017 Nov 10;8(11). Available from: http://dx.doi.org/10.3390/genes8110317 PMCID: PMC5704230{blk}

  • Menicucci AR, Versteeg K, Woolsey C, Mire CE, Geisbert JB, Cross RW, Agans KN, Jankeel A, Geisbert TW, Messaoudi I. Transcriptome Analysis of Circulating Immune Cell Subsets Highlight the Role of Monocytes in Zaire Ebola Virus Makona Pathogenesis. Front Immunol [Internet]. 2017 Oct 26;8:1372. Available from: http://dx.doi.org/10.3389/fimmu.2017.01372 PMCID: PMC5662559{blk}

  • Versteeg K, Menicucci AR, Woolsey C, Mire CE, Geisbert JB, Cross RW, Agans KN, Jeske D, Messaoudi I, Geisbert TW. Infection with the Makona variant results in a delayed and distinct host immune response compared to previous Ebola virus variants. Sci Rep [Internet]. 2017 Aug 29;7(1):9730. Available from: http://dx.doi.org/10.1038/s41598-017-09963-y PMCID: PMC5574898{blk}

  • Arnold N, Meyer C, Engelmann F, Messaoudi I. Robust gene expression changes in the ganglia following subclinical reactivation in rhesus macaques infected with simian varicella virus. J Neurovirol [Internet]. 2017 Aug;23(4):520–538. Available from: http://dx.doi.org/10.1007/s13365-017-0522-3 PMCID: PMC5607069{blk}

  • Arnold N, Messaoudi I. Simian varicella virus causes robust transcriptional changes in T cells that support viral replication. Virus Res [Internet]. 2017 Jun 15;238:226–235. Available from: http://dx.doi.org/10.1016/j.virusres.2017.07.004 PMCID: PMC7114558{blk}

  • Menicucci AR, Sureshchandra S, Marzi A, Feldmann H, Messaoudi I. Transcriptomic analysis reveals a previously unknown role for CD8+ T-cells in rVSV-EBOV mediated protection. Sci Rep [Internet]. 2017 Apr 20;7(1):919. Available from: http://dx.doi.org/10.1038/s41598-017-01032-8 PMCID: PMC5430516{blk}

  • Barr T, Girke T, Sureshchandra S, Nguyen C, Grant K, Messaoudi I. Alcohol Consumption Modulates Host Defense in Rhesus Macaques by Altering Gene Expression in Circulating Leukocytes. J Immunol [Internet]. 2016 Jan 1;196(1):182–195. Available from: http://dx.doi.org/10.4049/jimmunol.1501527 PMCID: PMC4685011{blk}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Publications

+ + +

Publications of this project

+

Journal publications

+
    +
  • +

    Duan Y, Evans DS, Miller RA, Schork NJ, Cummings SR, Girke T. signatureSearch: environment for gene expression signature searching and functional interpretation. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):e124. Available from: http://dx.doi.org/10.1093/nar/gkaa878 PMCID: PMC7708038{blk}

    +
  • +
  • +

    Lombard DB, Kohler WJ, Guo AH, Gendron C, Han M, Ding W, Lyu Y, Ching T-T, Wang F-Y, Chakraborty TS, Nikolovska-Coleska Z, Duan Y, Girke T, Hsu A-L, Pletcher SD, Miller RA. High-throughput small molecule screening reveals Nrf2-dependent and -independent pathways of cellular stress resistance. Sci Adv [Internet]. 2020 Oct;6(40). Available from: http://dx.doi.org/10.1126/sciadv.aaz7628 PMCID: PMC7852388{blk}

    +
  • +
  • +

    Hamilton MJ, Young M, Jang K, Sauer S, Neang VE, King AT, Girke T, Martinez E. HOTAIRM1 lncRNA is downregulated in clear cell renal cell carcinoma and inhibits the hypoxia pathway. Cancer Lett [Internet]. 2020 Mar 1;472:50–58. Available from: http://dx.doi.org/10.1016/j.canlet.2019.12.022 PMCID: PMC6992348{blk}

    +
  • +
  • +

    Pozuelos GL, Kagda MS, Schick S, Girke T, Volz DC, Talbot P. Experimental Acute Exposure to Thirdhand Smoke and Changes in the Human Nasal Epithelial Transcriptome: A Randomized Clinical Trial. JAMA Netw Open [Internet]. 2019 Jun 5;2(6):e196362. Available from: http://dx.doi.org/10.1001/jamanetworkopen.2019.6362 PMCID: PMC6604097{blk}

    +
  • +
  • +

    Hamilton MJ, Girke T, Martinez E. Global isoform-specific transcript alterations and deregulated networks in clear cell renal cell carcinoma. Oncotarget [Internet]. 2018 May 4;9(34):23670–23680. Available from: http://dx.doi.org/10.18632/oncotarget.25330 PMCID: PMC5955119{blk}

    +
  • +
  • +

    Teixeira MA, Sela N, Atamian HS, Bao E, Chaudhary R, MacWilliams J, He J, Mantelin S, Girke T, Kaloshian I. Sequence analysis of the potato aphid Macrosiphum euphorbiae transcriptome identified two new viruses. PLoS One [Internet]. Public Library of Science; 2018 Mar 29 [cited 2021 Apr 26];13(3):e0193239. Available from: https://journals.plos.org/plosone/article/file?id=10.1371/journal.pone.0193239&type=printable PMCID: PMC5875755{blk}

    +
  • +
  • +

    Zillikens MC, et al. Large meta-analysis of genome-wide association studies identifies five loci for lean body mass. Nat Commun [Internet]. Nature Publishing Group; 2017 Jul 19 [cited 2021 Apr 26];8(1):1–13. Available from: https://www.nature.com/articles/s41467-017-00031-7 PMCID: 29116125

    +
  • +
  • +

    Zhang X, Aksoy E, Girke T, Raikhel AS, Karginov FV. Transcriptome-wide microRNA and target dynamics in the fat body during the gonadotrophic cycle of Aedes aegypti. Proc Natl Acad Sci U S A [Internet]. 2017 Mar 7;114(10):E1895–E1903. Available from: http://dx.doi.org/10.1073/pnas.1701474114 PMCID: PMC5347622{blk}

    +
  • +
  • +

    H Backman TW, Girke T. systemPipeR: NGS workflow and report generation environment. BMC Bioinformatics [Internet]. 2016 Sep 20;17:388. Available from: http://dx.doi.org/10.1186/s12859-016-1241-0 PMCID: PMC5029110{blk}

    +
  • +
+ +

[ PubMed ] - [ Google Scholar ]

+
    +
  • +

    Chen Y, Liu M, Dong Z. Preferential Ribosome Loading on the Stress-Upregulated mRNA Pool Shapes the Selective Translation under Stress Conditions. Plants [Internet]. 2021 Feb 5;10(2). Available from: http://dx.doi.org/10.3390/plants10020304 PMCID: PMC7915710{blk}

    +
  • +
  • +

    Lima TS, Mallya S, Jankeel A, Messaoudi I, Lodoen MB. Toxoplasma gondii Extends the Life Span of Infected Human Neutrophils by Inducing Cytosolic PCNA and Blocking Activation of Apoptotic Caspases. MBio [Internet]. 2021 Jan 26;12(1). Available from: http://dx.doi.org/10.1128/mBio.02031-20 PMCID: PMC7858050{blk}

    +
  • +
  • +

    Furuyama W, Shifflett K, Pinski AN, Griffin AJ, Feldmann F, Okumura A, Gourdine T, Jankeel A, Lovaglio J, Hanley PW, Thomas T, Clancy CS, Messaoudi I, O’Donnell KL, Marzi A. Rapid protection from COVID-19 in nonhuman primates vaccinated intramuscularly but not intranasally with a single dose of a recombinant vaccine. bioRxiv [Internet]. 2021 Jan 19; Available from: http://dx.doi.org/10.1101/2021.01.19.426885 PMCID: PMC7836117{blk}

    +
  • +
  • +

    Procida T, Friedrich T, Jack APM, Peritore M, Bönisch C, Eberl HC, Daus N, Kletenkov K, Nist A, Stiewe T, Borggrefe T, Mann M, Bartkuhn M, Hake SB. JAZF1, A Novel p400/TIP60/NuA4 Complex Member, Regulates H2A.Z Acetylation at Regulatory Regions. Int J Mol Sci [Internet]. 2021 Jan 12;22(2). Available from: http://dx.doi.org/10.3390/ijms22020678 PMCID: PMC7826843{blk}

    +
  • +
  • +

    Chen L, Walker AR, Burne RA, Zeng L. Amino Sugars Reshape Interactions between Streptococcus mutans and Streptococcus gordonii. Appl Environ Microbiol [Internet]. 2020 Dec 17;87(1). Available from: http://dx.doi.org/10.1128/AEM.01459-20 PMCID: PMC7755246{blk}

    +
  • +
  • +

    Duan Y, Evans DS, Miller RA, Schork NJ, Cummings SR, Girke T. signatureSearch: environment for gene expression signature searching and functional interpretation. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):e124. Available from: http://dx.doi.org/10.1093/nar/gkaa878 PMCID: PMC7708038{blk}

    +
  • +
  • +

    Li K, Hope CM, Wang XA, Wang J-P. RiboDiPA: a novel tool for differential pattern analysis in Ribo-seq data. Nucleic Acids Res [Internet]. 2020 Dec 2;48(21):12016–12029. Available from: http://dx.doi.org/10.1093/nar/gkaa1049 PMCID: PMC7708064{blk}

    +
  • +
  • +

    Berg JA, Hermans FWK, Beenders F, Lou L, Vriezen WH, Visser RGF, Bai Y, Schouten HJ. Analysis of QTL DM4.1 for Downy Mildew Resistance in Cucumber Reveals Multiple subQTL: A Novel RLK as Candidate Gene for the Most Important subQTL. Front Plant Sci [Internet]. 2020 Oct 22;11:569876. Available from: http://dx.doi.org/10.3389/fpls.2020.569876 PMCID: PMC7649820{blk}

    +
  • +
  • +

    Kagda MS, Martínez-Soto D, Ah-Fong AMV, Judelson HS. Invertases in Phytophthora infestans Localize to Haustoria and Are Programmed for Infection-Specific Expression. MBio [Internet]. 2020 Oct 13;11(5). Available from: http://dx.doi.org/10.1128/mBio.01251-20 PMCID: PMC7554665{blk}

    +
  • +
  • +

    Lou B, Boger M, Bennewitz K, Sticht C, Kopf S, Morgenstern J, Fleming T, Hell R, Yuan Z, Nawroth PP, Kroll J. Elevated 4-hydroxynonenal induces hyperglycaemia via Aldh3a1 loss in zebrafish and associates with diabetes progression in humans. Redox Biol [Internet]. 2020 Oct;37:101723. Available from: http://dx.doi.org/10.1016/j.redox.2020.101723 PMCID: PMC7519378{blk}

    +
  • +
  • +

    Iwanami N, Lawir D-F, Sikora K, O Meara C, Takeshita K, Schorpp M, Boehm T. Transgenerational inheritance of impaired larval T cell development in zebrafish. Nat Commun [Internet]. 2020 Sep 9;11(1):4505. Available from: http://dx.doi.org/10.1038/s41467-020-18289-9 PMCID: PMC7481223{blk}

    +
  • +
  • +

    Akbarzadeh A, Houde ALS, Sutherland BJG, Günther OP, Miller KM. Identification of Hypoxia-Specific Biomarkers in Salmonids Using RNA-Sequencing and Validation Using High-Throughput qPCR. G3 [Internet]. 2020 Sep 2;10(9):3321–3336. Available from: http://dx.doi.org/10.1534/g3.120.401487 PMCID: PMC7466982{blk}

    +
  • +
  • +

    Li F, Xing X, Xiao Z, Xu G, Yang X. RiboMiner: a toolset for mining multi-dimensional features of the translatome with ribosome profiling data. BMC Bioinformatics [Internet]. 2020 Aug 1;21(1):340. Available from: http://dx.doi.org/10.1186/s12859-020-03670-8 PMCID: PMC7430821{blk}

    +
  • +
  • +

    Fernández-Calero T, Davyt M, Perelmuter K, Chalar C, Bampi G, Persson H, Tosar JP, Hafstað V, Naya H, Rovira C, Bollati-Fogolín M, Ehrlich R, Flouriot G, Ignatova Z, Marín M. Fine-tuning the metabolic rewiring and adaptation of translational machinery during an epithelial-mesenchymal transition in breast cancer cells. Cancer Metab [Internet]. 2020 Jul 19;8:8. Available from: http://dx.doi.org/10.1186/s40170-020-00216-7 PMCID: PMC7368990{blk}

    +
  • +
  • +

    Liu Q, Shvarts T, Sliz P, Gregory RI. RiboToolkit: an integrated platform for analysis and annotation of ribosome profiling data to decode mRNA translation at codon resolution. Nucleic Acids Res [Internet]. 2020 Jul 2;48(W1):W218–W229. Available from: http://dx.doi.org/10.1093/nar/gkaa395 PMCID: PMC7319539{blk}

    +
  • +
  • +

    Alam R, Hummel M, Yeung E, Locke AM, Ignacio JCI, Baltazar MD, Jia Z, Ismail AM, Septiningsih EM, Bailey-Serres J. Flood resilience loci SUBMERGENCE 1 and ANAEROBIC GERMINATION 1 interact in seedlings established underwater. Plant Direct [Internet]. 2020 Jul;4(7):e00240. Available from: http://dx.doi.org/10.1002/pld3.240 PMCID: PMC7403837{blk}

    +
  • +
  • +

    Ehrary A, Rosas M, Carpinelli S, Davalos O, Cowling C, Fernandez F, Escobar M. Glutaredoxin AtGRXS8 represses transcriptional and developmental responses to nitrate in Arabidopsis thaliana roots. Plant Direct [Internet]. 2020 Jun;4(6):e00227. Available from: http://dx.doi.org/10.1002/pld3.227 PMCID: PMC7287413{blk}

    +
  • +
  • +

    Jankeel A, Menicucci AR, Woolsey C, Fenton KA, Mendoza N, Versteeg K, Cross RW, Geisbert TW, Messaoudi I. Early Transcriptional Changes within Liver, Adrenal Gland, and Lymphoid Tissues Significantly Contribute to Ebola Virus Pathogenesis in Cynomolgus Macaques. J Virol [Internet]. 2020 May 18;94(11). Available from: http://dx.doi.org/10.1128/JVI.00250-20 PMCID: PMC7269430{blk}

    +
  • +
  • +

    Gómez-Martín C, Capel C, González AM, Lebrón R, Yuste-Lisbona FJ, Hackenberg M, Oliver JL, Santalla M, Lozano R. Transcriptional Dynamics and Candidate Genes Involved in Pod Maturation of Common Bean (Phaseolus vulgaris L.). Plants [Internet]. 2020 Apr 22;9(4). Available from: http://dx.doi.org/10.3390/plants9040545 PMCID: PMC7238275{blk}

    +
  • +
  • +

    Lee SC, Ernst E, Berube B, Borges F, Parent J-S, Ledon P, Schorn A, Martienssen RA. Arabidopsis retrotransposon virus-like particles and their regulation by epigenetically activated small RNA. Genome Res [Internet]. 2020 Apr;30(4):576–588. Available from: http://dx.doi.org/10.1101/gr.259044.119 PMCID: PMC7197481{blk}

    +
  • +
  • +

    Hamilton MJ, Young M, Jang K, Sauer S, Neang VE, King AT, Girke T, Martinez E. HOTAIRM1 lncRNA is downregulated in clear cell renal cell carcinoma and inhibits the hypoxia pathway. Cancer Lett [Internet]. 2020 Mar 1;472:50–58. Available from: http://dx.doi.org/10.1016/j.canlet.2019.12.022 PMCID: PMC6992348{blk}

    +
  • +
  • +

    Bjorbækmo MFM, Evenstad A, Røsæg LL, Krabberød AK, Logares R. The planktonic protist interactome: where do we stand after a century of research? ISME J [Internet]. 2020 Feb;14(2):544–559. Available from: http://dx.doi.org/10.1038/s41396-019-0542-5 PMCID: PMC6976576{blk}

    +
  • +
  • +

    Meng H, Feng J, Bai T, Jian Z, Chen Y, Wu G. Genome-wide analysis of short interspersed nuclear elements provides insight into gene and genome evolution in citrus. DNA Res [Internet]. 2020 Feb 1;27(1). Available from: http://dx.doi.org/10.1093/dnares/dsaa004 PMCID: PMC7315354{blk}

    +
  • +
  • +

    Irigoyen ML, Garceau DC, Bohorquez-Chaux A, Lopez-Lavalle LAB, Perez-Fons L, Fraser PD, Walling LL. Genome-wide analyses of cassava Pathogenesis-related (PR) gene families reveal core transcriptome responses to whitefly infestation, salicylic acid and jasmonic acid. BMC Genomics [Internet]. 2020 Jan 29;21(1):93. Available from: http://dx.doi.org/10.1186/s12864-019-6443-1 PMCID: PMC6990599{blk}

    +
  • +
  • +

    Franklin-Murray AL, Mallya S, Jankeel A, Sureshchandra S, Messaoudi I, Lodoen MB. Toxoplasma gondii Dysregulates Barrier Function and Mechanotransduction Signaling in Human Endothelial Cells. mSphere [Internet]. 2020 Jan 29;5(1). Available from: http://dx.doi.org/10.1128/mSphere.00550-19 PMCID: PMC6992369{blk}

    +
  • +
  • +

    Berg JA, Belyeu JR, Morgan JT, Ouyang Y, Bott AJ, Quinlan AR, Gertz J, Rutter J. XPRESSyourself: Enhancing, standardizing, and automating ribosome profiling computational analyses yields improved insight into data. PLoS Comput Biol [Internet]. 2020 Jan;16(1):e1007625. Available from: http://dx.doi.org/10.1371/journal.pcbi.1007625 PMCID: PMC7015430{blk}

    +
  • +
  • +

    Zhao C, Rispe C, Nabity PD. Secretory RING finger proteins function as effectors in a grapevine galling insect. BMC Genomics [Internet]. 2019 Dec 3;20(1):923. Available from: http://dx.doi.org/10.1186/s12864-019-6313-x PMCID: PMC6892190{blk}

    +
  • +
  • +

    Dhahbi J, Nunez Lopez YO, Schneider A, Victoria B, Saccon T, Bharat K, McClatchey T, Atamna H, Scierski W, Golusinski P, Golusinski W, Masternak MM. Profiling of tRNA Halves and YRNA Fragments in Serum and Tissue From Oral Squamous Cell Carcinoma Patients Identify Key Role of 5’ tRNA-Val-CAC-2-1 Half. Front Oncol [Internet]. 2019 Sep 26;9:959. Available from: http://dx.doi.org/10.3389/fonc.2019.00959 PMCID: PMC6775249{blk}

    +
  • +
  • +

    Woolsey C, Menicucci AR, Cross RW, Luthra P, Agans KN, Borisevich V, Geisbert JB, Mire CE, Fenton KA, Jankeel A, Anand S, Ebihara H, Geisbert TW, Messaoudi I, Basler CF. A VP35 Mutant Ebola Virus Lacks Virulence but Can Elicit Protective Immunity to Wild-Type Virus Challenge. Cell Rep [Internet]. 2019 Sep 17;28(12):3032–3046.e6. Available from: http://dx.doi.org/10.1016/j.celrep.2019.08.047 PMCID: PMC6886687{blk}

    +
  • +
  • +

    Smestad JA, Maher LJ 3rd. Master regulator analysis of paragangliomas carrying SDHx, VHL, or MAML3 genetic alterations. BMC Cancer [Internet]. 2019 Jun 24;19(1):619. Available from: http://dx.doi.org/10.1186/s12885-019-5813-z PMCID: PMC6591808{blk}

    +
  • +
  • +

    Perkins P, Mazzoni-Putman S, Stepanova A, Alonso J, Heber S. RiboStreamR: a web application for quality control, analysis, and visualization of Ribo-seq data. BMC Genomics [Internet]. 2019 Jun 6;20(Suppl 5):422. Available from: http://dx.doi.org/10.1186/s12864-019-5700-7 PMCID: PMC6551240{blk}

    +
  • +
  • +

    Pozuelos GL, Kagda MS, Schick S, Girke T, Volz DC, Talbot P. Experimental Acute Exposure to Thirdhand Smoke and Changes in the Human Nasal Epithelial Transcriptome: A Randomized Clinical Trial. JAMA Netw Open [Internet]. 2019 Jun 5;2(6):e196362. Available from: http://dx.doi.org/10.1001/jamanetworkopen.2019.6362 PMCID: PMC6604097{blk}

    +
  • +
  • +

    Barr T, Lewis SA, Sureshchandra S, Doratt B, Grant KA, Messaoudi I. Chronic ethanol consumption alters lamina propria leukocyte response to stimulation in a region-dependent manner. FASEB J [Internet]. 2019 Jun;33(6):7767–7777. Available from: http://dx.doi.org/10.1096/fj.201802780R PMCID: PMC6529332{blk}

    +
  • +
  • +

    Menicucci AR, Jankeel A, Feldmann H, Marzi A, Messaoudi I. Antiviral Innate Responses Induced by VSV-EBOV Vaccination Contribute to Rapid Protection. MBio [Internet]. 2019 May 28;10(3). Available from: http://dx.doi.org/10.1128/mBio.00597-19 PMCID: PMC6538780{blk}

    +
  • +
  • +

    Babarinde IA, Li Y, Hutchins AP. Computational Methods for Mapping, Assembly and Quantification for Coding and Non-coding Transcripts. Comput Struct Biotechnol J [Internet]. 2019 May 7;17:628–637. Available from: http://dx.doi.org/10.1016/j.csbj.2019.04.012 PMCID: PMC6526290{blk}

    +
  • +
  • +

    Karginov FV. HuR controls apoptosis and activation response without effects on cytokine 3’ UTRs. RNA Biol [Internet]. 2019 May;16(5):686–695. Available from: http://dx.doi.org/10.1080/15476286.2019.1582954 PMCID: PMC6546391{blk}

    +
  • +
  • +

    Blair EJ, Bonnot T, Hummel M, Hay E, Marzolino JM, Quijada IA, Nagel DH. Contribution of time of day and the circadian clock to the heat stress responsive transcriptome in Arabidopsis. Sci Rep [Internet]. 2019 Mar 18;9(1):4814. Available from: http://dx.doi.org/10.1038/s41598-019-41234-w PMCID: PMC6423321{blk}

    +
  • +
  • +

    Joo T, Choi J-H, Lee J-H, Park SE, Jeon Y, Jung SH, Woo HG. SEQprocess: a modularized and customizable pipeline framework for NGS processing in R package. BMC Bioinformatics [Internet]. 2019 Feb 20;20(1):90. Available from: http://dx.doi.org/10.1186/s12859-019-2676-x PMCID: PMC6383233{blk}

    +
  • +
  • +

    Nunez Lopez YO, Retnakaran R, Zinman B, Pratley RE, Seyhan AA. Predicting and understanding the response to short-term intensive insulin therapy in people with early type 2 diabetes. Mol Metab [Internet]. 2019 Feb;20:63–78. Available from: http://dx.doi.org/10.1016/j.molmet.2018.11.003 PMCID: PMC6358589{blk}

    +
  • +
  • +

    Shultzaberger RK, Abrams RE, Sullivan CJ, Schmitt AD, Thompson TWJ, Dresios J. Agnostic detection of genomic alterations by holistic DNA structural interrogation. PLoS One [Internet]. 2018 Nov 29;13(11):e0208054. Available from: http://dx.doi.org/10.1371/journal.pone.0208054 PMCID: PMC6264503{blk}

    +
  • +
  • +

    Gongol B, Sari I, Bryant T, Rosete G, Marin T. AMPK: An Epigenetic Landscape Modulator. Int J Mol Sci [Internet]. 2018 Oct 19;19(10). Available from: http://dx.doi.org/10.3390/ijms19103238 PMCID: PMC6214086{blk}

    +
  • +
  • +

    Jacobsen MD, Beynon RJ, Gethings LA, Claydon AJ, Langridge JI, Vissers JPC, Brown AJP, Hammond DE. Specificity of the osmotic stress response in Candida albicans highlighted by quantitative proteomics. Sci Rep [Internet]. 2018 Sep 27;8(1):14492. Available from: http://dx.doi.org/10.1038/s41598-018-32792-6 PMCID: PMC6160413{blk}

    +
  • +
  • +

    Mazzoni-Putman SM, Stepanova AN. A Plant Biologist’s Toolbox to Study Translation. Front Plant Sci [Internet]. 2018 Jul 2;9:873. Available from: http://dx.doi.org/10.3389/fpls.2018.00873 PMCID: PMC6036148{blk}

    +
  • +
  • +

    Hamilton MJ, Girke T, Martinez E. Global isoform-specific transcript alterations and deregulated networks in clear cell renal cell carcinoma. Oncotarget [Internet]. 2018 May 4;9(34):23670–23680. Available from: http://dx.doi.org/10.18632/oncotarget.25330 PMCID: PMC5955119{blk}

    +
  • +
  • +

    Eastman G, Smircich P, Sotelo-Silveira JR. Following Ribosome Footprints to Understand Translation at a Genome Wide Level. Comput Struct Biotechnol J [Internet]. 2018 May 1;16:167–176. Available from: http://dx.doi.org/10.1016/j.csbj.2018.04.001 PMCID: PMC6066590{blk}

    +
  • +
  • +

    Smestad J, Hamidi O, Wang L, Holte MN, Khazal FA, Erber L, Chen Y, Maher LJ 3rd. Characterization and metabolic synthetic lethal testing in a new model of SDH-loss familial pheochromocytoma and paraganglioma. Oncotarget [Internet]. 2018 Jan 19;9(5):6109–6127. Available from: http://dx.doi.org/10.18632/oncotarget.23639 PMCID: PMC5814199{blk}

    +
  • +
  • +

    Marzi A, Menicucci AR, Engelmann F, Callison J, Horne EJ, Feldmann F, Jankeel A, Feldmann H, Messaoudi I. Protection Against Marburg Virus Using a Recombinant VSV-Vaccine Depends on T and B Cell Activation. Front Immunol [Internet]. 2018;9:3071. Available from: http://dx.doi.org/10.3389/fimmu.2018.03071 PMCID: PMC6350103{blk}

    +
  • +
  • +

    Abrahamian M, Kagda M, Ah-Fong AMV, Judelson HS. Rethinking the evolution of eukaryotic metabolism: novel cellular partitioning of enzymes in stramenopiles links serine biosynthesis to glycolysis in mitochondria. BMC Evol Biol [Internet]. 2017 Dec 4;17(1):241. Available from: http://dx.doi.org/10.1186/s12862-017-1087-8 PMCID: PMC5715807{blk}

    +
  • +
  • +

    Bazin J, Baerenfaller K, Gosai SJ, Gregory BD, Crespi M, Bailey-Serres J. Global analysis of ribosome-associated noncoding RNAs unveils new modes of translational regulation. Proc Natl Acad Sci U S A [Internet]. 2017 Nov 14;114(46):E10018–E10027. Available from: http://dx.doi.org/10.1073/pnas.1708433114 PMCID: PMC5699049{blk}

    +
  • +
  • +

    Weisberg AJ, Kim G, Westwood JH, Jelesko JG. Sequencing and De Novo Assembly of the Toxicodendron radicans (Poison Ivy) Transcriptome. Genes [Internet]. 2017 Nov 10;8(11). Available from: http://dx.doi.org/10.3390/genes8110317 PMCID: PMC5704230{blk}

    +
  • +
  • +

    Menicucci AR, Versteeg K, Woolsey C, Mire CE, Geisbert JB, Cross RW, Agans KN, Jankeel A, Geisbert TW, Messaoudi I. Transcriptome Analysis of Circulating Immune Cell Subsets Highlight the Role of Monocytes in Zaire Ebola Virus Makona Pathogenesis. Front Immunol [Internet]. 2017 Oct 26;8:1372. Available from: http://dx.doi.org/10.3389/fimmu.2017.01372 PMCID: PMC5662559{blk}

    +
  • +
  • +

    Versteeg K, Menicucci AR, Woolsey C, Mire CE, Geisbert JB, Cross RW, Agans KN, Jeske D, Messaoudi I, Geisbert TW. Infection with the Makona variant results in a delayed and distinct host immune response compared to previous Ebola virus variants. Sci Rep [Internet]. 2017 Aug 29;7(1):9730. Available from: http://dx.doi.org/10.1038/s41598-017-09963-y PMCID: PMC5574898{blk}

    +
  • +
  • +

    Arnold N, Meyer C, Engelmann F, Messaoudi I. Robust gene expression changes in the ganglia following subclinical reactivation in rhesus macaques infected with simian varicella virus. J Neurovirol [Internet]. 2017 Aug;23(4):520–538. Available from: http://dx.doi.org/10.1007/s13365-017-0522-3 PMCID: PMC5607069{blk}

    +
  • +
  • +

    Arnold N, Messaoudi I. Simian varicella virus causes robust transcriptional changes in T cells that support viral replication. Virus Res [Internet]. 2017 Jun 15;238:226–235. Available from: http://dx.doi.org/10.1016/j.virusres.2017.07.004 PMCID: PMC7114558{blk}

    +
  • +
  • +

    Menicucci AR, Sureshchandra S, Marzi A, Feldmann H, Messaoudi I. Transcriptomic analysis reveals a previously unknown role for CD8+ T-cells in rVSV-EBOV mediated protection. Sci Rep [Internet]. 2017 Apr 20;7(1):919. Available from: http://dx.doi.org/10.1038/s41598-017-01032-8 PMCID: PMC5430516{blk}

    +
  • +
  • +

    Barr T, Girke T, Sureshchandra S, Nguyen C, Grant K, Messaoudi I. Alcohol Consumption Modulates Host Defense in Rhesus Macaques by Altering Gene Expression in Circulating Leukocytes. J Immunol [Internet]. 2016 Jan 1;196(1):182–195. Available from: http://dx.doi.org/10.4049/jimmunol.1501527 PMCID: PMC4685011{blk}

    +
  • +
+ + + +
Last modified 2021-05-05: offline search;no_render (7d8d025a) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/about/team/index.html b/public/about/team/index.html index 48805d8ad..8a490aa3e 100644 --- a/public/about/team/index.html +++ b/public/about/team/index.html @@ -1,65 +1,856 @@ -Our Team | sysPipe + + + + + + + + + + + + + + + + + +Our Team | sysPipe + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Our Team

+ + +

Principal Investigator (PI)

+

Thomas Girke, Ph.D.

+

image

+
+

Current Members

+

Daniela Cassol, Ph.D., Postdoc

+

image

+

Le Zhang, Graduate Student in GGB

+

image

+

Ponmathi Ramasamy, Undergraduate Student in Bioengineering

+

image

+ + + +
Last modified 2021-05-05: offline search;no_render (7d8d025a) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/community/index.html b/public/community/index.html index 28b3f069f..04e32e0e3 100644 --- a/public/community/index.html +++ b/public/community/index.html @@ -1,35 +1,656 @@ -Community | sysPipe

Join the sysPipe community

sysPipe is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved.

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

Join the sysPipe community

+ +

sysPipe is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved. + +

+
+ + + + + + + +
+ + +
+ + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/community/index.xml b/public/community/index.xml index d56d079e6..82b5c536e 100644 --- a/public/community/index.xml +++ b/public/community/index.xml @@ -1 +1,17 @@ -sysPipe – Community/community/Recent content in Community on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Community + /community/ + Recent content in Community on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png b/public/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png new file mode 100644 index 000000000..d9a97b435 Binary files /dev/null and b/public/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png differ diff --git a/public/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png b/public/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png new file mode 100644 index 000000000..ba1e36690 Binary files /dev/null and b/public/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png differ diff --git a/public/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png b/public/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png new file mode 100644 index 000000000..c168cc72f Binary files /dev/null and b/public/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png differ diff --git a/public/en/sp/spr/steps_files/figure-html/vennplot-1.png b/public/en/sp/spr/steps_files/figure-html/vennplot-1.png new file mode 100644 index 000000000..25813bec3 Binary files /dev/null and b/public/en/sp/spr/steps_files/figure-html/vennplot-1.png differ diff --git a/public/index.html b/public/index.html index a337fd6ff..b0a024ce3 100644 --- a/public/index.html +++ b/public/index.html @@ -1,39 +1,762 @@ -sysPipe

systemPipe Workflow Environment



Learn More Bioconductor 3.14 New Features

A workflow design, report generation, and visualization framework for data analysis

systemPipe Project

The systemPipe project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.

Bioconductor

Download a stable release from Bioconductor of -systemPipeR, -systemPipeShiny, -systemPipeTools -systemPipeRdata.

Contributions welcome!

Get the lastest version, submit issues and pull requests.

Read more …

systemPipeShiny Demo

Try an interactive demo and tutorial.

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

systemPipe Workflow Environment

+ +
+ + + + + + +

+
+ + Learn More + + + Bioconductor 3.14 + + + New Features + +

A workflow design, report generation, and visualization framework for data analysis

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

systemPipe Project

+

The systemPipe project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.

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

Bioconductor

+

Download a stable release from Bioconductor of +systemPipeR, +systemPipeShiny, +systemPipeTools +systemPipeRdata.

+

+ +
+ + + + +
+
+ +
+

Contributions welcome!

+

Get the lastest version, submit issues and pull requests.

+

+

Read more …

+
+ + + + +
+
+ +
+

systemPipeShiny Demo

+

Try an interactive demo and tutorial.

+

+ +
+ + + + +
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/index.xml b/public/index.xml index d06eef595..e56011f88 100644 --- a/public/index.xml +++ b/public/index.xml @@ -1 +1,16 @@ -sysPipe – systemPipe/Recent content in systemPipe on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – systemPipe + / + Recent content in systemPipe on sysPipe + Hugo -- gohugo.io + + + + + + + + + + diff --git a/public/news/index.html b/public/news/index.html index e4d7964af..4635a63f5 100644 --- a/public/news/index.html +++ b/public/news/index.html @@ -1,44 +1,814 @@ -News | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

News

+ + + + +
+

Stay tuned for all sytemPipe project news!

+ +
+ + +
+ + + + + +
+ + +
+
+ Bioconductor 3.13 +
+

+
+ + + +
+
+ Bioconductor 3.12 +
+

+
+ + + + + +
+ + + +
Last modified 2021-03-01: pg_build (34d44b41) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/news/index.xml b/public/news/index.xml index 39c066f65..b3fa14744 100644 --- a/public/news/index.xml +++ b/public/news/index.xml @@ -1 +1,17 @@ -sysPipe – News/news/Recent content in News on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – News + /news/ + Recent content in News on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/news/release_3_12/index.html b/public/news/release_3_12/index.html index 6016344de..ae5295989 100644 --- a/public/news/release_3_12/index.html +++ b/public/news/release_3_12/index.html @@ -1,50 +1,832 @@ -Bioconductor 3.12 | sysPipe + + + + + + + + + + + + + + + + + +Bioconductor 3.12 | sysPipe + + + + + + + + + + + + + + +

Bioconductor 3.12

systemPipeR 1.24 is available

image

OVERVIEW

The following enhancements have been added to systemPipeR.

  • With the upgrades provided in this release, systemPipeR has become a much more generic data analysis workflow environment that is no longer limited to analyzing just NGS data. Now it can be efficiently used for data analysis tasks in many omics areas, including genomics, proteomics, metabolomics and drug discovery.

  • A workflow control class (SYSargsList) has been added allowing users to manage multiple-step workflows from a single container. This way one can select and execute multiple workflow steps with standard R subsetting syntax, e.g. runWF[1:3].

  • Various improvements have been added to systemPipeR’s new command-line interface including the recently introduced SYSargs2 class that supports the Common Workflow Language (CWL). Utilities have been added to visualize workflow designs and topologies with different graphical layouts.

  • Improvements have been added to monitor the run status of workflows, as well as tracking of warning and error messages. This includes the generation of both scientific and technical status reports.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Bioconductor 3.12

+ + +

systemPipeR 1.24 is available

+

image

+

OVERVIEW

+

The following enhancements have been added to systemPipeR.

+
    +
  • +

    With the upgrades provided in this release, systemPipeR has become a much more generic data analysis workflow environment that is no longer limited to analyzing just NGS data. Now it can be efficiently used for data analysis tasks in many omics areas, including genomics, proteomics, metabolomics and drug discovery.

    +
  • +
  • +

    A workflow control class (SYSargsList) has been added allowing users to manage multiple-step workflows from a single container. This way one can select and execute multiple workflow steps with standard R subsetting syntax, e.g. runWF[1:3].

    +
  • +
  • +

    Various improvements have been added to systemPipeR’s new command-line interface including the recently introduced SYSargs2 class that supports the Common Workflow Language (CWL). Utilities have been added to visualize workflow designs and topologies with different graphical layouts.

    +
  • +
  • +

    Improvements have been added to monitor the run status of workflows, as well as tracking of warning and error messages. This includes the generation of both scientific and technical status reports. +

    +
  • +
+ + + + +
Last modified 2021-08-06: no_render (171d9df8) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/news/release_3_13/index.html b/public/news/release_3_13/index.html index e511c0629..d2fe060df 100644 --- a/public/news/release_3_13/index.html +++ b/public/news/release_3_13/index.html @@ -1,44 +1,1146 @@ -Bioconductor 3.13 | sysPipe

Bioconductor 3.13

systemPipeShiny 1.0.0 is available

systemPipeTools package extends the widely used systemPipeR (SPR) workflow environment with an enhanced toolkit for data visualization, including utilities to automate the data visualization for analysis of differentially expressed genes (DEGs). systemPipeTools provides data transformation and data exploration functions via scatterplots, hierarchical clustering heatMaps, principal component analysis, multidimensional scaling, generalized principal components, t-Distributed Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. All these utilities can be integrated with the modular design of the systemPipeR environment that allows users to easily substitute any of these features and/or custom with alternatives.

systemPipeShiny 1.2 is available

systemPipeShiny 1.1.40

Major change

  • Add is_demo option: only affect workflow module right now. Lock users inside a temp folder when using the WF module and give users a new temp folder every time they refresh. This will prevent directory exist problem if many users are using a same deploy instance.

  • Add welcome_guide option: whether to enable the welcome guide which highlights the guide dropdown menu.

  • Rewrite welcome tab with a gallery to show all SPS features.

  • loadDF, dynamicFile and dynamicFileServer added back to this mainframe work package instead of spsComps, because these dependencies have already been using in SPS. Leave these functions in spsComps will introduce extra dependencies, and these functions are not too frequently used outside the framework.

Minor change

  • Option warning_toast now also checks if you are on “local” mode.

  • Deleted some unwanted entries in reference generating yaml file.

  • Fix some typos.

  • More informative error message when the config file cannot be found for spsOptions

  • Add some .onLoad methods so users can use the spsOption to get default values on package load.

  • Updated essquise functions

  • Add more guides.

  • Removed the scroll to top button by shinyDashboardPlus, we have our own “go top” button.

  • Add assertions to spsInit.

  • Add some screenshots to readme.

Bug fix

  • Fix a bug when that loads the server twice
  • Fix some default option values
  • Fix a bug on addResourcePath when the working directory and app directory is not the same.
  • Fix links not working caused by website change
  • Fix code in spsInit overwrite all current SPS options.
  • Fix errors on admin page when server stats cannot be found, better text and warning messages
  • Fix new version of essquise introduced errors
  • Fix a warning in vroom due to the column type problem

systemPipeShiny 1.1.35

Major change

  • Login feature added:

    • Users can choose whether to enable the login or not in global.RSPS options.

    • There are also the login loading screen feature which can be turned on and off.

    • There are 3 different login loading screens right now and users can interact with them.

  • Website updated. https://systempipe.org/sps

  • Updates on the admin panel:

    • App information: added live charts for CPU, temperature, and RAM

    • User control: admins now can add/delete/change users directly from this tab, instead of only from command line.

Minor change

  • Addtarget="_blank" to all external links in the app, so when they are clicked, it will open in a new tab.

Bug fix

  • FIx bugs due to login page caused server not loading

  • Add 1s delay in javascript after login to resize the page so the dashboard can be displayed normal.

  • Fix a table rendering bug in workflow cwl step markdown text.

systemPipeShiny 1.1.30

Major change

  • new spsAccount class. This class is associated with login management , which allows users to create/delete user/admin accounts, change password, change roles.

  • Deprecated the spsPlotContainer class since we rewrite the Canvas feature and move to a separate package {drawer}.

  • New spsCoreTabReplace, which allows users to overwrite the default core tabs.

  • A lot more SPS options.

    • Users can now choose whether to load or not load certain tabs on start, even for default core tabs. Combining the spsCoreTabReplace function, now users can customize everything of the original app.

    • Users can change the app title, and logo image.

  • Admin panel added to app. Users now can visit the admin panel by adding “?user_definded_string” to the end of the url. Default is “admin”. Login with an admin account is required. Users can use the spsAccount class to add/change an admin account before starting the app.

    • App information: a tab displays current SPS app server information, like CPU, RAM, size, etc.

    • User control: a tab to see account information of current SPS app.

  • Changed the way to install modules. Default modules, workflow, RNAseq and quick ggplot dependency packages are not installed by default, unless you use dependency = TRUE in installation command. It means all these dependencies are moved from Imports to the Suggests class. This helps to save quite some time on SPS package installation. Users install these packages based on their needs. When users loads these modules but depend packages are not fully installed, app will not crash, instead, a warning message with install instructions will be displayed on both console and app UI.

  • Based on the module installation change, module loading methods are also changed. Module server functions are only called if users set the option to load them. In previous versions, the server functions are still loaded, just hide the unloaded module UI. This saves a lot of time on app starting time, roughly from > 10s to < 3s if none of the default modules are loaded.

Bug fix

systemPipeShiny 1.1.20

Major change

  • 3 default modules complete: workflow, RNAseq,quick ggplot. Details of these modules updated in our website: <https://systempipe.org/sps>{.uri}.

  • Separation of SPS smaller functions into 3 different packages. We hope these packages can help people in their own Shiny app, or other R projects.

    • {spsComps}: SPS components, all new Shiny custom components and utility functions that are used in Shiny server side.

    • {drawer}: the redesign of Canvas, purely front-end image editing tool.

    • {spsUtil}: SPS utilities, general useful utility functions that can be used with/without Shiny.

  • Redesigned the new tab feature. Now users use spsNewTab function to create their new custom visualization tab. The old newSpsTab function is deprecated. Easier syntax and templates are used. By default it will use the “simple” template which wraps 90% of the shiny code from users so they can focus on the plotting code. There is also the “full” template which expose all the Shiny code to users.

    • New spsEzUI and spsEzServer functions are used in the “simple” template to wrap complex Shiny code.
  • New spsOptDefaults, which prints out all the default SPS options and current values of these options on console.

  • New notification system. Developers can write some notifications which stores in a remote location and when app starts, it will try to download and parse this file to notifications messages to broadcast to users. This way, developers can send messages to users often without re-deploy the app. The notification will appear on the top right corner.

  • The interactive guide is back. After a few versions of tests, we added the guide system back. This time, developers can customize their own guides. A guide_content.R file is created when a SPS project initialize. It is stored in R of folder relate to the project root. The guide will also be displayed on the app top right corner.

Minor change

  • updated all unit test to testthat v3 format.

Bug fix

  • fix bugs due to shiny updates to 1.6.0

  • Fix all bugs caused by {shinydashboardPlus} v2.0 updates.

systemPipeShiny 1.1.10

Changes made from 1.1.0 to 1.1.05

Workflow module R session

  • Now workflow module R session uses a background child R process, which runs independently to the parent R session which runs shiny.
  • So the shiny will be not blocked while code is running in the background (you can still click other buttons when the child session is busy) – synchronous and non-blocking. A child indicator is also placed in the UI, updates every second.
  • The UI design of R session is similar to Rstudio. Four panels, source code, console, log (specific to SPR), and plots.
  • Standard out/error and plots are captured in the workflow folder. Users can download them in the bundle on step 5 Workflow Run.
  • Plots will be displayed on the plots panel. Now supports plots that opens R device (base and ggplot), html widget plots are not supported as this moment.
  • A new shiny disconnection popup for SPS. Besides the gray layer on shiny disconnection, a panel will be displayed to users to indicate the problem. Similar to what shows on a shiny server, but more informative and also works locally.
  • Results of this session can be downloaded by closing the session and go back to step 5 of workflow module and there is a button to download all in a zipped file.

RNAseq module

  • redesigned the UI and server logic. Plots for DEG analysis and Canvas connections.
  • {SummarizedExperiment} supports. Now it returns SummarizedExperiment objects to global environment once the normalization or DEG calculation is done.

General UI

  • Added a “Go Top” button on the right bottom corner, clicking on this button will automatically scroll to the top of the page. This button only shows up when client has > 50px scroll height.

Workflow module CWL tab

  • Now the CWL file and CWL input file can be be edited. The edits will be imported to CWL parser every one second. Now this is a very useful place to test or write new CWL scripts.
  • Now this tab has a dynamically rendered dropdown panel which allows users to choose which column for the targets table to map to the variables in CWL input file.

Workflow module fully functioning

  • Now you can run a full example workflow in SPS by choosing the “Example” option on workflow setup step.

  • Other systemPipeR preconfiged workflows will cause problems because formatting issues that will cause errors in systemPipeR::runWF function, not introduced by SPS. Please wait the updates on systemPipeR to fix this. You can still use SPS to prepare files for all workflows. That means, step 1-4 will work, step 5 will give you errors if you choose a workflow which is not “Example”.

Rework on the workflow part

  • All 3 tabs merged into the main tab

  • changed config tab to CWL tab

  • added support for the running wf as a sub tab

  • Now the main tab has 5 subtabs, they are all connected.

  • Better guidelines for users, step-like usage, can’t reach other steps if a previous step is not completed.

  • Original snapshot management drop down page changed to running workflow session. This session will lock users to a unique page, they can’t interactive other app parts on the page(working directory changed), to prevent app crash due to wd change.

Other changes

  • A new UI component spsTimeline : horizontal timeline UI unit, has status, can be updated on server by updateSpsTimeline.

  • A new UI bsHoverPopover: enhanced high level function of bsPlus::HoverPopover, additional JS used to make the popover work on buttons as well.

  • Fixed some link problems in renderDesc. Better links in renderDesc, enlarged and spacing animation for links.

  • Change on about page

    • The news is now rendered on about tab in the app

    • reduced developer content on about page.

    • changed developer emails to github links.

Change on visualization

  • RNAseq part is now only in one tab as big module: users upload the targets file and a raw count table, and make different plots in subtabs.

    • This introduced a lot of dependencies, will decide later if we keep as it is or separate it to spsBio.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

Bioconductor 3.13

+ + +

systemPipeShiny 1.0.0 is available

+

systemPipeTools package extends the widely used systemPipeR (SPR) workflow environment with an enhanced toolkit for data visualization, including utilities to automate the data visualization for analysis of differentially expressed genes (DEGs). systemPipeTools provides data transformation and data exploration functions via scatterplots, hierarchical clustering heatMaps, principal component analysis, multidimensional scaling, generalized principal components, t-Distributed Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. All these utilities can be integrated with the modular design of the systemPipeR environment that allows users to easily substitute any of these features and/or custom with alternatives.

+

systemPipeShiny 1.2 is available

+

systemPipeShiny 1.1.40

+

Major change

+
    +
  • +

    Add is_demo option: only affect workflow module right now. Lock users inside a temp folder when using the WF module and give users a new temp folder every time they refresh. This will prevent directory exist problem if many users are using a same deploy instance.

    +
  • +
  • +

    Add welcome_guide option: whether to enable the welcome guide which highlights the guide dropdown menu.

    +
  • +
  • +

    Rewrite welcome tab with a gallery to show all SPS features.

    +
  • +
  • +

    loadDF, dynamicFile and dynamicFileServer added back to this mainframe work package instead of spsComps, because these dependencies have already been using in SPS. Leave these functions in spsComps will introduce extra dependencies, and these functions are not too frequently used outside the framework.

    +
  • +
+

Minor change

+
    +
  • +

    Option warning_toast now also checks if you are on “local” mode.

    +
  • +
  • +

    Deleted some unwanted entries in reference generating yaml file.

    +
  • +
  • +

    Fix some typos.

    +
  • +
  • +

    More informative error message when the config file cannot be found for spsOptions

    +
  • +
  • +

    Add some .onLoad methods so users can use the spsOption to get default values on package load.

    +
  • +
  • +

    Updated essquise functions

    +
  • +
  • +

    Add more guides.

    +
  • +
  • +

    Removed the scroll to top button by shinyDashboardPlus, we have our own “go top” button.

    +
  • +
  • +

    Add assertions to spsInit.

    +
  • +
  • +

    Add some screenshots to readme.

    +
  • +
+

Bug fix

+
    +
  • Fix a bug when that loads the server twice
  • +
  • Fix some default option values
  • +
  • Fix a bug on addResourcePath when the working directory and app directory is not the same.
  • +
  • Fix links not working caused by website change
  • +
  • Fix code in spsInit overwrite all current SPS options.
  • +
  • Fix errors on admin page when server stats cannot be found, better text and warning messages
  • +
  • Fix new version of essquise introduced errors
  • +
  • Fix a warning in vroom due to the column type problem
  • +
+

systemPipeShiny 1.1.35

+

Major change

+
    +
  • +

    Login feature added:

    +
      +
    • +

      Users can choose whether to enable the login or not in global.RSPS options.

      +
    • +
    • +

      There are also the login loading screen feature which can be turned on and off.

      +
    • +
    • +

      There are 3 different login loading screens right now and users can interact with them.

      +
    • +
    +
  • +
  • +

    Website updated. https://systempipe.org/sps

    +
  • +
  • +

    Updates on the admin panel:

    +
      +
    • +

      App information: added live charts for CPU, temperature, and RAM

      +
    • +
    • +

      User control: admins now can add/delete/change users directly from this tab, instead of only from command line.

      +
    • +
    +
  • +
+

Minor change

+
    +
  • Addtarget="_blank" to all external links in the app, so when they are clicked, it will open in a new tab.
  • +
+

Bug fix

+
    +
  • +

    FIx bugs due to login page caused server not loading

    +
  • +
  • +

    Add 1s delay in javascript after login to resize the page so the dashboard can be displayed normal.

    +
  • +
  • +

    Fix a table rendering bug in workflow cwl step markdown text.

    +
  • +
+

systemPipeShiny 1.1.30

+

Major change

+
    +
  • +

    new spsAccount class. This class is associated with login management , which allows users to create/delete user/admin accounts, change password, change roles.

    +
  • +
  • +

    Deprecated the spsPlotContainer class since we rewrite the Canvas feature and move to a separate package {drawer}.

    +
  • +
  • +

    New spsCoreTabReplace, which allows users to overwrite the default core tabs.

    +
  • +
  • +

    A lot more SPS options.

    +
      +
    • +

      Users can now choose whether to load or not load certain tabs on start, even for default core tabs. Combining the spsCoreTabReplace function, now users can customize everything of the original app.

      +
    • +
    • +

      Users can change the app title, and logo image.

      +
    • +
    +
  • +
  • +

    Admin panel added to app. Users now can visit the admin panel by adding “?user_definded_string” to the end of the url. Default is “admin”. Login with an admin account is required. Users can use the spsAccount class to add/change an admin account before starting the app.

    +
      +
    • +

      App information: a tab displays current SPS app server information, like CPU, RAM, size, etc.

      +
    • +
    • +

      User control: a tab to see account information of current SPS app.

      +
    • +
    +
  • +
  • +

    Changed the way to install modules. Default modules, workflow, RNAseq and quick ggplot dependency packages are not installed by default, unless you use dependency = TRUE in installation command. It means all these dependencies are moved from Imports to the Suggests class. This helps to save quite some time on SPS package installation. Users install these packages based on their needs. When users loads these modules but depend packages are not fully installed, app will not crash, instead, a warning message with install instructions will be displayed on both console and app UI.

    +
  • +
  • +

    Based on the module installation change, module loading methods are also changed. Module server functions are only called if users set the option to load them. In previous versions, the server functions are still loaded, just hide the unloaded module UI. This saves a lot of time on app starting time, roughly from > 10s to < 3s if none of the default modules are loaded.

    +
  • +
+

Bug fix

+ +

systemPipeShiny 1.1.20

+

Major change

+
    +
  • +

    3 default modules complete: workflow, RNAseq,quick ggplot. Details of these modules updated in our website: <https://systempipe.org/sps>{.uri}.

    +
  • +
  • +

    Separation of SPS smaller functions into 3 different packages. We hope these packages can help people in their own Shiny app, or other R projects.

    +
      +
    • +

      {spsComps}: SPS components, all new Shiny custom components and utility functions that are used in Shiny server side.

      +
    • +
    • +

      {drawer}: the redesign of Canvas, purely front-end image editing tool.

      +
    • +
    • +

      {spsUtil}: SPS utilities, general useful utility functions that can be used with/without Shiny.

      +
    • +
    +
  • +
  • +

    Redesigned the new tab feature. Now users use spsNewTab function to create their new custom visualization tab. The old newSpsTab function is deprecated. Easier syntax and templates are used. By default it will use the “simple” template which wraps 90% of the shiny code from users so they can focus on the plotting code. There is also the “full” template which expose all the Shiny code to users.

    +
      +
    • New spsEzUI and spsEzServer functions are used in the “simple” template to wrap complex Shiny code.
    • +
    +
  • +
  • +

    New spsOptDefaults, which prints out all the default SPS options and current values of these options on console.

    +
  • +
  • +

    New notification system. Developers can write some notifications which stores in a remote location and when app starts, it will try to download and parse this file to notifications messages to broadcast to users. This way, developers can send messages to users often without re-deploy the app. The notification will appear on the top right corner.

    +
  • +
  • +

    The interactive guide is back. After a few versions of tests, we added the guide system back. This time, developers can customize their own guides. A guide_content.R file is created when a SPS project initialize. It is stored in R of folder relate to the project root. The guide will also be displayed on the app top right corner.

    +
  • +
+

Minor change

+
    +
  • updated all unit test to testthat v3 format.
  • +
+

Bug fix

+
    +
  • +

    fix bugs due to shiny updates to 1.6.0

    +
  • +
  • +

    Fix all bugs caused by {shinydashboardPlus} v2.0 updates.

    +
  • +
+

systemPipeShiny 1.1.10

+

Changes made from 1.1.0 to 1.1.05

+

Workflow module R session

+
    +
  • Now workflow module R session uses a background child R process, which runs independently to the parent R session which runs shiny.
  • +
  • So the shiny will be not blocked while code is running in the background (you can still click other buttons when the child session is busy) – synchronous and non-blocking. A child indicator is also placed in the UI, updates every second.
  • +
  • The UI design of R session is similar to Rstudio. Four panels, source code, console, log (specific to SPR), and plots.
  • +
  • Standard out/error and plots are captured in the workflow folder. Users can download them in the bundle on step 5 Workflow Run.
  • +
  • Plots will be displayed on the plots panel. Now supports plots that opens R device (base and ggplot), html widget plots are not supported as this moment.
  • +
  • A new shiny disconnection popup for SPS. Besides the gray layer on shiny disconnection, a panel will be displayed to users to indicate the problem. Similar to what shows on a shiny server, but more informative and also works locally.
  • +
  • Results of this session can be downloaded by closing the session and go back to step 5 of workflow module and there is a button to download all in a zipped file.
  • +
+

RNAseq module

+
    +
  • redesigned the UI and server logic. Plots for DEG analysis and Canvas connections.
  • +
  • {SummarizedExperiment} supports. Now it returns SummarizedExperiment objects to global environment once the normalization or DEG calculation is done.
  • +
+

General UI

+
    +
  • Added a “Go Top” button on the right bottom corner, clicking on this button will automatically scroll to the top of the page. This button only shows up when client has > 50px scroll height.
  • +
+

Workflow module CWL tab

+
    +
  • Now the CWL file and CWL input file can be be edited. The edits will be imported to CWL parser every one second. Now this is a very useful place to test or write new CWL scripts.
  • +
  • Now this tab has a dynamically rendered dropdown panel which allows users to choose which column for the targets table to map to the variables in CWL input file.
  • +
+

Workflow module fully functioning

+
    +
  • +

    Now you can run a full example workflow in SPS by choosing the “Example” option on workflow setup step.

    +
  • +
  • +

    Other systemPipeR preconfiged workflows will cause problems because formatting issues that will cause errors in systemPipeR::runWF function, not introduced by SPS. Please wait the updates on systemPipeR to fix this. You can still use SPS to prepare files for all workflows. That means, step 1-4 will work, step 5 will give you errors if you choose a workflow which is not “Example”.

    +
  • +
+

Rework on the workflow part

+
    +
  • +

    All 3 tabs merged into the main tab

    +
  • +
  • +

    changed config tab to CWL tab

    +
  • +
  • +

    added support for the running wf as a sub tab

    +
  • +
  • +

    Now the main tab has 5 subtabs, they are all connected.

    +
  • +
  • +

    Better guidelines for users, step-like usage, can’t reach other steps if a previous step is not completed.

    +
  • +
  • +

    Original snapshot management drop down page changed to running workflow session. This session will lock users to a unique page, they can’t interactive other app parts on the page(working directory changed), to prevent app crash due to wd change.

    +
  • +
+

Other changes

+
    +
  • +

    A new UI component spsTimeline : horizontal timeline UI unit, has status, can be updated on server by updateSpsTimeline.

    +
  • +
  • +

    A new UI bsHoverPopover: enhanced high level function of bsPlus::HoverPopover, additional JS used to make the popover work on buttons as well.

    +
  • +
  • +

    Fixed some link problems in renderDesc. Better links in renderDesc, enlarged and spacing animation for links.

    +
  • +
  • +

    Change on about page

    +
      +
    • +

      The news is now rendered on about tab in the app

      +
    • +
    • +

      reduced developer content on about page.

      +
    • +
    • +

      changed developer emails to github links.

      +
    • +
    +
  • +
+

Change on visualization

+
    +
  • +

    RNAseq part is now only in one tab as big module: users upload the targets file and a raw count table, and make different plots in subtabs.

    +
      +
    • This introduced a lot of dependencies, will decide later if we keep as it is or separate it to spsBio.
    • +
    +
  • +
+ + + +
Last modified 2021-08-06: no_render (171d9df8) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/offline-search-index.832c3775e1b4aa33da233554cb9cc81d.json b/public/offline-search-index.832c3775e1b4aa33da233554cb9cc81d.json new file mode 100644 index 000000000..5a90e1575 --- /dev/null +++ b/public/offline-search-index.832c3775e1b4aa33da233554cb9cc81d.json @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[{"body":"systemPipeShiny 1.0.0 is available systemPipeTools package extends the widely used systemPipeR (SPR) workflow environment with an enhanced toolkit for data visualization, including utilities to automate the data visualization for analysis of differentially expressed genes (DEGs). systemPipeTools provides data transformation and data exploration functions via scatterplots, hierarchical clustering heatMaps, principal component analysis, multidimensional scaling, generalized principal components, t-Distributed Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. All these utilities can be integrated with the modular design of the systemPipeR environment that allows users to easily substitute any of these features and/or custom with alternatives.\nsystemPipeShiny 1.2 is available systemPipeShiny 1.1.40 Major change Add is_demo option: only affect workflow module right now. Lock users inside a temp folder when using the WF module and give users a new temp folder every time they refresh. This will prevent directory exist problem if many users are using a same deploy instance.\n Add welcome_guide option: whether to enable the welcome guide which highlights the guide dropdown menu.\n Rewrite welcome tab with a gallery to show all SPS features.\n loadDF, dynamicFile and dynamicFileServer added back to this mainframe work package instead of spsComps, because these dependencies have already been using in SPS. Leave these functions in spsComps will introduce extra dependencies, and these functions are not too frequently used outside the framework.\n Minor change Option warning_toast now also checks if you are on “local” mode.\n Deleted some unwanted entries in reference generating yaml file.\n Fix some typos.\n More informative error message when the config file cannot be found for spsOptions\n Add some .onLoad methods so users can use the spsOption to get default values on package load.\n Updated essquise functions\n Add more guides.\n Removed the scroll to top button by shinyDashboardPlus, we have our own “go top” button.\n Add assertions to spsInit.\n Add some screenshots to readme.\n Bug fix Fix a bug when that loads the server twice Fix some default option values Fix a bug on addResourcePath when the working directory and app directory is not the same. Fix links not working caused by website change Fix code in spsInit overwrite all current SPS options. Fix errors on admin page when server stats cannot be found, better text and warning messages Fix new version of essquise introduced errors Fix a warning in vroom due to the column type problem systemPipeShiny 1.1.35 Major change Login feature added:\n Users can choose whether to enable the login or not in global.RSPS options.\n There are also the login loading screen feature which can be turned on and off.\n There are 3 different login loading screens right now and users can interact with them.\n Website updated. https://systempipe.org/sps\n Updates on the admin panel:\n App information: added live charts for CPU, temperature, and RAM\n User control: admins now can add/delete/change users directly from this tab, instead of only from command line.\n Minor change Addtarget=\"_blank\" to all external links in the app, so when they are clicked, it will open in a new tab. Bug fix FIx bugs due to login page caused server not loading\n Add 1s delay in javascript after login to resize the page so the dashboard can be displayed normal.\n Fix a table rendering bug in workflow cwl step markdown text.\n systemPipeShiny 1.1.30 Major change new spsAccount class. This class is associated with login management , which allows users to create/delete user/admin accounts, change password, change roles.\n Deprecated the spsPlotContainer class since we rewrite the Canvas feature and move to a separate package {drawer}.\n New spsCoreTabReplace, which allows users to overwrite the default core tabs.\n A lot more SPS options.\n Users can now choose whether to load or not load certain tabs on start, even for default core tabs. Combining the spsCoreTabReplace function, now users can customize everything of the original app.\n Users can change the app title, and logo image.\n Admin panel added to app. Users now can visit the admin panel by adding “?user_definded_string” to the end of the url. Default is “admin”. Login with an admin account is required. Users can use the spsAccount class to add/change an admin account before starting the app.\n App information: a tab displays current SPS app server information, like CPU, RAM, size, etc.\n User control: a tab to see account information of current SPS app.\n Changed the way to install modules. Default modules, workflow, RNAseq and quick ggplot dependency packages are not installed by default, unless you use dependency = TRUE in installation command. It means all these dependencies are moved from Imports to the Suggests class. This helps to save quite some time on SPS package installation. Users install these packages based on their needs. When users loads these modules but depend packages are not fully installed, app will not crash, instead, a warning message with install instructions will be displayed on both console and app UI.\n Based on the module installation change, module loading methods are also changed. Module server functions are only called if users set the option to load them. In previous versions, the server functions are still loaded, just hide the unloaded module UI. This saves a lot of time on app starting time, roughly from \u003e 10s to \u003c 3s if none of the default modules are loaded.\n Bug fix update all links to our new website: https://systempipe.org/sps\n Fix some bugs in the guide system\n systemPipeShiny 1.1.20 Major change 3 default modules complete: workflow, RNAseq,quick ggplot. Details of these modules updated in our website: \u003chttps://systempipe.org/sps\u003e{.uri}.\n Separation of SPS smaller functions into 3 different packages. We hope these packages can help people in their own Shiny app, or other R projects.\n {spsComps}: SPS components, all new Shiny custom components and utility functions that are used in Shiny server side.\n {drawer}: the redesign of Canvas, purely front-end image editing tool.\n {spsUtil}: SPS utilities, general useful utility functions that can be used with/without Shiny.\n Redesigned the new tab feature. Now users use spsNewTab function to create their new custom visualization tab. The old newSpsTab function is deprecated. Easier syntax and templates are used. By default it will use the “simple” template which wraps 90% of the shiny code from users so they can focus on the plotting code. There is also the “full” template which expose all the Shiny code to users.\n New spsEzUI and spsEzServer functions are used in the “simple” template to wrap complex Shiny code. New spsOptDefaults, which prints out all the default SPS options and current values of these options on console.\n New notification system. Developers can write some notifications which stores in a remote location and when app starts, it will try to download and parse this file to notifications messages to broadcast to users. This way, developers can send messages to users often without re-deploy the app. The notification will appear on the top right corner.\n The interactive guide is back. After a few versions of tests, we added the guide system back. This time, developers can customize their own guides. A guide_content.R file is created when a SPS project initialize. It is stored in R of folder relate to the project root. The guide will also be displayed on the app top right corner.\n Minor change updated all unit test to testthat v3 format. Bug fix fix bugs due to shiny updates to 1.6.0\n Fix all bugs caused by {shinydashboardPlus} v2.0 updates.\n systemPipeShiny 1.1.10 Changes made from 1.1.0 to 1.1.05 Workflow module R session Now workflow module R session uses a background child R process, which runs independently to the parent R session which runs shiny. So the shiny will be not blocked while code is running in the background (you can still click other buttons when the child session is busy) – synchronous and non-blocking. A child indicator is also placed in the UI, updates every second. The UI design of R session is similar to Rstudio. Four panels, source code, console, log (specific to SPR), and plots. Standard out/error and plots are captured in the workflow folder. Users can download them in the bundle on step 5 Workflow Run. Plots will be displayed on the plots panel. Now supports plots that opens R device (base and ggplot), html widget plots are not supported as this moment. A new shiny disconnection popup for SPS. Besides the gray layer on shiny disconnection, a panel will be displayed to users to indicate the problem. Similar to what shows on a shiny server, but more informative and also works locally. Results of this session can be downloaded by closing the session and go back to step 5 of workflow module and there is a button to download all in a zipped file. RNAseq module redesigned the UI and server logic. Plots for DEG analysis and Canvas connections. {SummarizedExperiment} supports. Now it returns SummarizedExperiment objects to global environment once the normalization or DEG calculation is done. General UI Added a “Go Top” button on the right bottom corner, clicking on this button will automatically scroll to the top of the page. This button only shows up when client has \u003e 50px scroll height. Workflow module CWL tab Now the CWL file and CWL input file can be be edited. The edits will be imported to CWL parser every one second. Now this is a very useful place to test or write new CWL scripts. Now this tab has a dynamically rendered dropdown panel which allows users to choose which column for the targets table to map to the variables in CWL input file. Workflow module fully functioning Now you can run a full example workflow in SPS by choosing the “Example” option on workflow setup step.\n Other systemPipeR preconfiged workflows will cause problems because formatting issues that will cause errors in systemPipeR::runWF function, not introduced by SPS. Please wait the updates on systemPipeR to fix this. You can still use SPS to prepare files for all workflows. That means, step 1-4 will work, step 5 will give you errors if you choose a workflow which is not “Example”.\n Rework on the workflow part All 3 tabs merged into the main tab\n changed config tab to CWL tab\n added support for the running wf as a sub tab\n Now the main tab has 5 subtabs, they are all connected.\n Better guidelines for users, step-like usage, can’t reach other steps if a previous step is not completed.\n Original snapshot management drop down page changed to running workflow session. This session will lock users to a unique page, they can’t interactive other app parts on the page(working directory changed), to prevent app crash due to wd change.\n Other changes A new UI component spsTimeline : horizontal timeline UI unit, has status, can be updated on server by updateSpsTimeline.\n A new UI bsHoverPopover: enhanced high level function of bsPlus::HoverPopover, additional JS used to make the popover work on buttons as well.\n Fixed some link problems in renderDesc. Better links in renderDesc, enlarged and spacing animation for links.\n Change on about page\n The news is now rendered on about tab in the app\n reduced developer content on about page.\n changed developer emails to github links.\n Change on visualization RNAseq part is now only in one tab as big module: users upload the targets file and a raw count table, and make different plots in subtabs.\n This introduced a lot of dependencies, will decide later if we keep as it is or separate it to spsBio. ","categories":"","description":"","excerpt":"systemPipeShiny 1.0.0 is available systemPipeTools package extends the …","ref":"/news/release_3_13/","tags":"","title":"Bioconductor 3.13"},{"body":"SPS has many options you can change. These options will determine how the app behaves.\n Config SPS Let us start by creating an example SPS project. For demo purpose, we are using the /tmp folder but one should use a regular location instead of the temp in a real case.\nsuppressPackageStartupMessages(library(systemPipeShiny)) spsInit(app_path = tempdir(), project_name = \"config_demo\", overwrite = TRUE, change_wd = FALSE) ## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-25 19:43:24 Key md5 ee81377a81fdb757fbbbb6af38644756 ## [SPS-INFO] 2021-04-25 19:43:24 SPS project setup done! ## save project path (sps_dir \u003c- file.path(tempdir(), \"config_demo\")) ## [1] \"/tmp/RtmphrNOOX/config_demo\" To reproduce code locally, run the following chunk instead.\nlibrary(systemPipeShiny) spsInit() sps_dir \u003c- normalizePath(\".\") PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em}; SPS structure SPS_xx/ ├── server.R | ├── global.R | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit ├── ui.R | ├── deploy.R | Deploy helper file ├── config | Important app config files. Do not edit them if you don't know │ ├── sps.db | SPS database │ ├── sps_options.yaml | SPS default option list │ └── tabs.csv | SPS tab registration information ├── data | App example data files │ ├── xx.csv ├── R | All SPS custom tab files and helper R function files │ ├── tab_xx.R ├── README.md ├── results | To store data generated from the app, like the workflow module │ └── README.md └── www | Internet resources ├── css | CSS files │ └── sps.css ├── img | App image resources │ └── xx.png ├── js | Javascripts │ └── xx.js ├── loading_themes | Loading screen files │ └── xx.html └── plot_list | Image files for plot gallery └── plot_xx.jpg This is a reminder of what you will get when a SPS project is initiated with spsInit().\n For most users, the global.R file is the only file that one needs to make change. The second important files are the files inside config folder. For normal users, these files are controlled by SPS functions. No need to make any modification. For advanced users, deep customization is possible. sps_options.yaml stores all default and valid values for SPS, details are listed below tabs.csv all SPS tab registration information. Read Manage tabs sps.db A SQLite database to store data generated in SPS. Read SPS database for more information. R folder stores all custom tab files, your helper functions. This .R or .r files under this folder will be automatically sourced when SPS starts. This is discussed in Manage tabs. www folder is where you add the internet resources, like images you want to show in the app, css style sheets to attach. Read more here. App options View/Set all options App options in SPS are controlled by “SPS options”. These options can change app appearance, debugging level, server behaviors, etc. The valid options can be found and change on the global.R file. They are similar to Shiny options, but unlike shiny options that are single values, SPS options are passed using the Option(sps = list(...)) function in global.R as a group. To view all options and their default, valid values('*' means any value is okay) see global.R from the line starting with ## SPS options. We provided some comments below that line to generally describe what each option is and valid values for options. Use function spsOptDefaults to see the default and other valid options.\nspsOptDefaults(app_path = sps_dir) ## title: ## Default: systemPipeShiny ## Other: * ## title_logo: ## Default: img/sps_small.png ## Other: * ## mode: ## Default: local ## Other: server ## login_screen: ## Default: FALSE ## Other: TRUE ## login_theme: ## Default: random ## Other: * ## use_crayon: ## Default: TRUE ## Other: FALSE ## verbose: ## Default: FALSE ## Other: TRUE ## admin_page: ## Default: TRUE ## Other: FALSE ## admin_url: ## Default: admin ## Other: * ## warning_toast: ## Default: FALSE ## Other: TRUE ## module_wf: ## Default: TRUE ## Other: FALSE ## module_rnaseq: ## Default: TRUE ## Other: FALSE ## module_ggplot: ## Default: TRUE ## Other: FALSE ## tab_welcome: ## Default: TRUE ## Other: FALSE ## tab_vs_main: ## Default: TRUE ## Other: FALSE ## tab_canvas: ## Default: TRUE ## Other: FALSE ## tab_about: ## Default: TRUE ## Other: FALSE ## note_url: ## Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml ## Other: * ## traceback: ## Default: FALSE ## Other: TRUE ## is_demo: ## Default: FALSE ## Other: TRUE ## welcome_guide: ## Default: TRUE ## Other: FALSE ## * means any value will be accepted After the app has started once, you can use spsOptions() to see all current settings.\nspsOptions(app_path = sps_dir) ## Current project option settings: ## title: ## systemPipeShiny ## title_logo: ## img/sps_small.png ## mode: ## local ## login_screen: ## FALSE ## login_theme: ## random ## use_crayon: ## TRUE ## verbose: ## FALSE ## admin_page: ## TRUE ## admin_url: ## admin ## warning_toast: ## FALSE ## module_wf: ## TRUE ## module_rnaseq: ## TRUE ## module_ggplot: ## TRUE ## tab_welcome: ## TRUE ## tab_vs_main: ## TRUE ## tab_canvas: ## TRUE ## tab_about: ## TRUE ## note_url: ## https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml ## traceback: ## FALSE ## is_demo: ## FALSE ## welcome_guide: ## TRUE ## ******** ## Option legend: ## known options Hidden/custom options* and values+ ## Value legend: ## same as default values different from defaults+ A copy of options in global.R:\noptions(sps = list( title = \"systemPipeShiny\", title_logo = \"img/sps_small.png\", mode = \"local\", warning_toast = FALSE, login_screen = FALSE, login_theme = \"random\", use_crayon = TRUE, verbose = FALSE, admin_page = TRUE, admin_url = \"admin\", note_url = 'https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml', tab_welcome = TRUE, tab_vs_main = TRUE, tab_canvas = TRUE, tab_about = TRUE, module_wf = TRUE, module_rnaseq = TRUE, module_ggplot = TRUE, traceback = FALSE, is_demo = FALSE, welcome_guide = TRUE )) Note: Do not worry if you set some invalid values, on app start, `sps()` will check all SPS options, ignore unknown values and set invalid values back to default. You will see warning messages on console to tell you specifically what is wrong with your options.\n Option Description Default Other mode running mode “local” “server” title App title “systemPipeShiny” any string title_logo App logo to display on browser tab “img/sps_small.png” any path warning_toast show security warnings? TRUE FALSE login_screen add login screen? TRUE FALSE login_theme login screen theme “random” see details use_crayon colorful console message? TRUE FALSE verbose more details for SPS functions? FALSE TRUE admin_page enable admin page? FALSE TRUE admin_url admin_page query url “admin” any string warning_toast for internal test only TRUE FALSE module_wf load workflow module? TRUE FALSE module_rnaseq load RNAseq module? TRUE FALSE module_ggplot load quick ggplot module? TRUE FALSE tab_welcome load welcome tab? TRUE FALSE tab_vs_main load custom visualization main tab? TRUE FALSE tab_canvas load Canvas tab? TRUE FALSE tab_about load about tab? TRUE FALSE note_url SPS notification remote URL see code above any URL is_demo useful if deploy the app as a demo FALSE TRUE welcome_guide enable the welcome guide TRUE FALSE app_path hidden, automatically added N.A. N.A. Details mode: see [App security] this option will change how the upload files are selected. title \u0026 title_logo: see [Other customizations] warning_toast: see [App security], A toast pop-up message to help you check pre-deploy for security problems. login_screen \u0026 login_theme \u0026 admin_page \u0026 admin_url: see [Accounts, Login and Admin]. verbose: Give you more information on debugging. Most SPS core functions has this option. If it is on, more debugging information will be printed on console. See [Debugging] module_xx – tab_xx: see [Toggle tabs] for loading and unloading tabs. tab_xx: see [Overwrite tabs] for customizing core SPS default tabs. note_url: see [Notification system] for customizing SPS notifications. is_demo: see [Workflow module]. welcome_guide: whether to enable the welcome guide on app start, see first image on SPS guide. app_path: a hidden option. This will be added after the app starts. If not specified in sps(), use current working directory. View/Set a single option SPS values are globally set, which means you can get/change the these options at inside any R code, R functions and while the app is running (change options after app started is not recommended).\nTo view a single option value, use spsOption(opt = \"OPTION_NAME\"); to overwrite a single option, use spsOption(opt = \"OPTION_NAME\", value = \"NEW_VALUE\").\nspsOption(opt = \"mode\") ## [1] \"local\" To overwrite the “mode” option:\nspsOption(opt = \"mode\", \"local\") Check again, the value has changed to “local”:\nspsOption(opt = \"mode\") ## [1] \"local\" If any option does not exist, or the value is “empty” or 0, when getting the value spsOption will return FALSE. Common “empty” values:\n NA NULL length(value) == 0 \"\" (empty string) Read the help file of ?emptyIsFalse for more information.\nspsOption(opt = \"random_opt\") ## [1] FALSE However, these “empty” values can be meaningful in some cases, so use empty_is_false = FALSE to return the original value instead of FALSE\nspsOption(opt = \"random_opt\", empty_is_false = FALSE) ## NULL Add your own options SPS is very flexible which allows you to add your own options. To do so, you need to edit the “config/sps_options.yaml” file under your project root.\nYou can use other options as templates to add more. There are two required entries:\n default: will be used as default when you load SPS package. other: Other valid options. If your user provided a value that is other than the default or the other, SPS will show warnings and use default instead. You can write \"*\" as the other value. It means any value will be accepted. SPS will skip to check other valid values for this option. Currently, the default value can only be length of 1 but other value can be a yaml array, which use [] to define: [value1, value2, ...].\nFor example, we can add some but opening the file with a text editor, here we do it programmatically:\nnew_options \u003c- ' my_opt1: default: true other: [false] my_opt2: default: \"a\" other: [\"*\"] ' write(x = new_options, file = file.path(sps_dir, \"config\", \"sps_options.yaml\"), append = TRUE) Then we can use spsOptDefaults to check\nspsOptDefaults(app_path = sps_dir) ## title: ## Default: systemPipeShiny ## Other: * ## title_logo: ## Default: img/sps_small.png ## Other: * ## mode: ## Default: local ## Other: server ## login_screen: ## Default: FALSE ## Other: TRUE ## login_theme: ## Default: random ## Other: * ## use_crayon: ## Default: TRUE ## Other: FALSE ## verbose: ## Default: FALSE ## Other: TRUE ## admin_page: ## Default: TRUE ## Other: FALSE ## admin_url: ## Default: admin ## Other: * ## warning_toast: ## Default: FALSE ## Other: TRUE ## module_wf: ## Default: TRUE ## Other: FALSE ## module_rnaseq: ## Default: TRUE ## Other: FALSE ## module_ggplot: ## Default: TRUE ## Other: FALSE ## tab_welcome: ## Default: TRUE ## Other: FALSE ## tab_vs_main: ## Default: TRUE ## Other: FALSE ## tab_canvas: ## Default: TRUE ## Other: FALSE ## tab_about: ## Default: TRUE ## Other: FALSE ## note_url: ## Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml ## Other: * ## traceback: ## Default: FALSE ## Other: TRUE ## is_demo: ## Default: FALSE ## Other: TRUE ## welcome_guide: ## Default: TRUE ## Other: FALSE ## my_opt1: ## Default: TRUE ## Other: FALSE ## my_opt2: ## Default: a ## Other: * ## * means any value will be accepted You can see the my_opt1 and my_opt2 have been added to SPS options.\n","categories":"","description":"","excerpt":"SPS has many options you can change. These options will determine how …","ref":"/sps/adv_features/config/","tags":"","title":"Configuration"},{"body":" pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Data Visualization with systemPipeR systemPipeTools package extends the widely used systemPipeR (SPR) (H Backman and Girke 2016) workflow environment with enhanced toolkit for data visualization, including utilities to automate the analysis of differentially expressed genes (DEGs). systemPipeTools provides functions for data transformation and data exploration via scatterplots, hierarchical clustering heatMaps, principal component analysis, multidimensional scaling, generalized principal components, t-Distributed Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. All these utilities can be integrated with the modular design of the systemPipeR environment that allows users to easily substitute any of these features and/or custom with alternatives.\nMetadata and Reads Counting Information The first step is importing the targets file and raw reads counting table.\n The targets file defines all FASTQ files and sample comparisons of the analysis workflow. The raw reads counting table represents all the reads that map to gene (row) for each sample (columns). ## Targets file targetspath \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") targets \u003c- read.delim(targetspath, comment = \"#\") cmp \u003c- systemPipeR::readComp(file = targetspath, format = \"matrix\", delim = \"-\") ## Count table file countMatrixPath \u003c- system.file(\"extdata\", \"countDFeByg.xls\", package = \"systemPipeR\") countMatrix \u003c- read.delim(countMatrixPath, row.names = 1) showDT(countMatrix) {\"x\":{\"filter\":\"none\",\"extensions\":[\"FixedColumns\",\"Scroller\"],\"data\":[[\"AT1G01010\",\"AT1G01020\",\"AT1G01030\",\"AT1G01040\",\"AT1G01050\",\"AT1G01060\",\"AT1G01070\",\"AT1G01073\",\"AT1G01080\",\"AT1G01090\",\"AT1G01100\",\"AT1G01110\",\"AT1G01115\",\"AT2G01008\",\"AT2G01021\",\"AT2G01023\",\"AT3G01010\",\"AT3G01015\",\"AT3G01020\",\"AT3G01030\",\"AT3G01040\",\"AT3G01050\",\"AT3G01060\",\"AT3G01070\",\"AT3G01080\",\"AT3G01085\",\"AT3G01090\",\"AT3G01100\",\"AT3G01120\",\"AT3G01130\",\"AT3G01140\",\"AT3G01150\",\"AT3G01160\",\"AT3G01170\",\"AT4G00005\",\"AT4G00020\",\"AT4G00026\",\"AT4G00030\",\"AT4G00040\",\"AT4G00050\",\"AT4G00060\",\"AT4G00070\",\"AT4G00080\",\"AT4G00090\",\"AT4G00100\",\"AT4G00110\",\"AT4G00120\",\"AT4G00124\",\"AT4G00130\",\"AT4G00140\",\"AT5G01010\",\"AT5G01015\",\"AT5G01020\",\"AT5G01030\",\"AT5G01040\",\"AT5G01050\",\"AT5G01060\",\"AT5G01070\",\"AT5G01075\",\"AT5G01080\",\"AT5G01090\",\"AT5G01100\",\"AT5G01110\",\"AT5G01120\",\"AT5G01130\",\"AT5G01140\",\"AT5G01150\",\"AT5G01160\",\"ATCG00020\",\"ATCG00040\",\"ATCG00050\",\"ATCG00070\",\"ATCG00080\",\"ATCG00120\",\"ATCG00130\",\"ATCG00140\",\"ATCG00150\",\"ATCG00160\",\"ATCG00170\",\"ATCG00180\",\"ATCG00190\",\"ATCG00210\",\"ATCG00220\",\"ATCG00270\",\"ATCG00280\",\"ATCG00300\",\"ATCG00330\",\"ATCG00340\",\"ATCG00350\",\"ATCG00360\",\"ATCG00380\",\"ATCG00420\",\"ATCG00430\",\"ATCG00440\",\"ATCG00470\",\"ATCG00480\",\"ATCG00490\",\"ATCG00500\",\"ATCG00510\",\"ATMG00010\",\"ATMG00030\",\"ATMG00040\",\"ATMG00050\",\"ATMG00060\",\"ATMG00070\",\"ATMG00080\",\"ATMG00090\",\"ATMG00110\",\"ATMG00120\",\"ATMG00130\",\"ATMG00140\",\"ATMG00150\",\"ATMG00160\",\"ATMG00170\",\"ATMG00180\",\"ATMG00200\"],[57,23,41,180,60,26,0,0,98,331,230,6,0,28,6267,0,0,0,0,0,93,31,235,0,30,0,70,38,709,54,0,37,33,33,0,4,19,69,61,12,48,0,0,21,186,22,0,0,6,8,143,16,87,31,49,4,0,0,1,0,17,162,2,0,0,0,0,28,1917,9,0,5,15,52,34,36,17,7,7,5,37,6,3,105,283,4,52,147,192,1,2,7,21,12,54,180,856,8,10,2,60,11,0,0,8,7,5,6,3,1,0,0,5,3,18,0],[244,93,98,684,127,264,0,0,379,1027,432,10,0,68,3061,14,0,0,0,0,454,121,801,8,29,0,274,132,2358,140,14,126,238,131,0,25,89,106,176,138,359,0,0,59,384,78,0,0,9,6,442,26,227,170,125,7,0,4,28,0,103,1002,26,2,0,0,0,124,1696,28,3,23,50,210,127,46,53,8,39,49,145,5,83,300,723,34,103,412,480,6,21,97,312,44,339,1191,1029,13,1,0,40,56,0,3,18,18,72,27,0,4,7,1,31,15,59,3],[201,69,73,522,102,59,2,0,179,779,516,11,0,61,7559,6,0,0,0,0,364,108,553,6,151,0,315,87,2031,149,4,186,123,161,0,6,60,255,189,20,162,0,0,89,402,75,0,0,32,30,542,11,184,91,179,5,0,0,9,0,41,754,6,0,0,0,0,119,970,10,1,14,13,113,37,60,22,3,14,22,49,1,5,165,293,5,56,222,191,6,8,18,45,12,92,369,793,4,5,0,79,38,0,4,5,20,30,7,0,0,0,0,25,5,44,1],[169,126,58,664,166,56,1,0,456,1343,458,5,0,33,2203,10,0,1,0,0,578,167,674,2,14,0,373,126,2222,131,39,170,329,212,0,66,75,121,147,117,381,0,0,88,432,147,0,0,4,11,646,17,207,219,103,3,0,0,23,0,121,1185,27,2,0,0,0,127,661,19,1,59,53,190,167,42,88,14,94,68,208,16,75,212,641,45,135,530,520,10,24,147,347,34,423,1501,871,10,1,7,35,50,0,3,47,31,120,34,14,1,5,0,72,17,62,4],[365,107,94,585,125,8,6,0,287,647,468,4,0,48,3125,0,0,0,0,0,375,104,226,5,56,0,334,100,1674,242,2,138,133,110,0,16,41,127,158,23,275,0,0,56,403,81,0,0,28,30,606,4,165,97,150,7,0,0,2,0,62,819,11,2,0,0,0,103,2258,12,0,23,34,160,74,44,26,12,22,32,95,10,25,126,403,10,50,313,366,4,10,26,36,24,102,403,977,2,15,2,43,45,0,2,19,16,25,13,0,1,2,3,26,14,24,1],[229,88,156,680,303,26,6,0,538,1831,849,17,0,53,1168,3,0,1,0,0,735,146,366,6,97,0,349,203,2310,254,0,380,126,296,0,49,43,193,282,19,406,0,0,138,966,131,0,0,16,21,1031,8,463,106,427,10,2,0,5,1,89,2267,41,4,0,0,0,238,1232,6,0,24,56,277,66,33,54,11,55,61,186,3,29,250,375,23,58,509,455,1,10,63,112,15,347,984,1161,10,2,3,35,39,0,7,21,19,41,15,1,3,2,1,46,13,58,3],[41,18,9,162,116,5,2,0,102,350,522,3,0,39,12653,0,0,0,0,0,46,43,8,0,15,0,92,28,780,84,14,45,51,51,0,5,56,73,102,63,70,0,0,42,360,42,0,0,3,7,230,15,153,22,2,0,0,0,11,0,23,24,6,0,0,0,0,60,1677,4,0,5,4,37,8,41,2,0,1,11,18,2,4,63,186,2,19,121,116,0,0,7,8,2,19,73,592,0,2,1,89,19,0,2,4,8,11,5,0,1,0,0,8,6,27,2],[38,25,13,163,180,2,4,0,211,524,634,3,0,38,12386,1,0,0,0,0,76,55,59,0,25,0,139,50,1217,116,14,95,80,54,0,11,66,124,114,45,119,3,0,66,440,40,0,0,2,13,334,58,221,27,2,0,0,0,11,0,36,99,8,0,0,0,0,76,1184,6,0,1,7,42,20,18,16,1,6,15,22,2,2,59,190,4,13,152,168,0,3,11,9,1,30,163,681,2,1,0,35,37,0,4,9,4,9,3,0,1,2,0,16,8,26,2],[152,20,8,249,139,0,5,0,79,323,926,5,0,97,9799,0,0,0,0,0,80,52,13,0,72,0,148,74,1176,160,21,67,92,73,0,11,93,157,185,151,122,0,0,78,656,48,0,0,3,20,461,2,260,57,11,0,0,0,8,0,39,188,4,0,0,0,0,83,1201,0,0,1,11,41,7,23,5,0,6,2,15,2,0,56,132,2,23,75,122,0,2,4,10,4,22,93,475,4,0,0,117,31,0,5,1,5,12,7,2,1,3,0,19,9,33,0],[46,5,6,66,37,0,2,0,42,140,183,2,0,23,10386,1,0,0,0,0,23,21,1,0,7,0,48,19,270,27,7,14,20,22,0,1,12,21,48,8,43,0,0,22,113,12,0,0,1,3,109,10,50,29,2,3,0,0,1,0,13,42,0,0,0,0,0,33,1261,4,0,2,3,42,15,26,4,0,4,5,4,6,1,65,138,9,17,106,126,2,4,6,4,0,12,54,749,6,1,0,30,4,0,0,0,2,3,1,0,0,0,0,2,0,7,0],[294,88,36,697,236,0,5,0,150,600,1333,1,0,82,9414,3,0,2,0,0,162,112,14,0,57,0,236,126,1737,341,15,126,178,132,0,23,146,209,317,158,210,0,0,191,1005,46,0,0,12,22,731,0,423,100,7,0,0,0,12,0,68,277,5,0,0,0,0,128,1192,1,0,2,9,52,9,28,8,3,1,7,22,2,3,83,172,4,25,112,112,1,0,11,14,6,29,110,446,2,4,3,101,56,0,5,10,9,20,14,0,1,1,0,36,9,44,2],[405,151,147,1060,679,4,13,0,551,1693,2401,16,0,112,3265,4,0,0,0,0,260,292,41,2,33,0,468,280,2768,376,50,299,278,112,0,36,175,337,471,169,463,2,0,334,1831,107,0,0,12,13,1229,53,903,127,12,3,0,0,32,0,168,146,33,0,0,0,0,266,398,6,0,4,11,75,26,18,18,3,17,11,67,2,3,71,176,7,28,163,186,2,7,18,23,4,52,345,493,0,4,0,43,88,0,8,25,18,39,14,4,11,4,0,54,20,53,2],[117,43,32,338,362,89,9,0,250,800,762,7,0,142,6908,6,0,0,0,0,143,53,103,0,27,0,257,128,1998,110,52,130,65,95,0,19,38,245,362,472,298,0,0,74,703,51,0,0,5,23,449,6,732,62,2,0,0,0,12,0,46,42,2,2,0,0,0,157,1406,8,0,11,6,51,13,9,5,0,5,13,28,2,2,100,126,2,2,128,194,1,3,12,30,2,63,270,445,2,0,0,64,6,0,1,9,18,6,7,0,0,5,1,21,7,25,1],[139,74,29,604,746,203,43,0,612,1662,1805,38,0,230,3676,2,0,0,0,0,131,211,178,4,34,0,390,194,1861,323,81,191,125,93,0,28,132,397,598,499,414,1,0,166,1319,117,0,0,11,29,861,65,1008,100,2,0,0,2,29,0,128,80,35,0,0,0,0,274,473,0,0,3,16,91,32,23,13,0,5,19,51,2,7,65,167,1,26,121,132,1,0,8,23,1,65,346,377,0,0,0,75,49,0,2,20,16,23,25,1,5,7,0,29,10,26,0],[132,33,12,360,194,118,8,0,78,281,761,4,0,85,11154,2,0,0,0,0,79,87,39,2,88,0,176,121,781,184,19,74,59,80,0,11,52,164,203,239,176,0,0,91,600,37,0,0,6,13,599,2,265,70,0,0,0,0,5,0,41,85,0,0,0,0,0,91,1136,0,0,6,11,34,12,38,10,0,2,9,9,2,2,48,135,3,15,88,108,1,0,2,6,3,25,82,429,2,0,0,114,23,0,5,6,4,10,2,0,4,0,0,16,6,17,0],[64,18,9,80,50,24,0,0,26,122,102,0,0,18,3301,0,0,0,0,0,34,25,6,0,13,0,32,24,219,51,13,20,26,19,0,1,13,22,37,12,48,0,0,20,106,10,0,0,1,2,121,1,95,21,2,0,0,0,3,0,14,33,0,0,0,0,0,38,1860,8,0,3,4,40,26,13,0,0,1,4,1,5,0,61,259,1,28,147,176,2,3,21,11,0,17,84,662,2,2,1,23,15,0,2,9,3,1,3,1,1,0,0,5,0,8,0],[230,43,70,203,214,62,9,0,78,391,627,0,0,100,9421,5,0,0,0,0,105,43,52,0,56,0,127,79,734,97,18,70,28,61,0,4,33,92,112,178,140,0,0,93,565,17,0,0,1,5,331,4,283,29,0,0,0,0,9,0,33,155,4,0,0,0,0,118,1336,0,0,8,4,27,5,8,8,6,2,10,7,1,4,52,112,1,10,81,106,1,0,8,19,3,37,140,440,2,2,0,66,10,0,7,7,5,13,7,0,3,6,1,16,0,28,2],[120,31,85,171,181,32,1,0,55,273,476,4,0,46,8486,2,0,0,0,0,55,24,24,0,33,0,76,45,291,98,12,42,39,29,0,4,26,57,69,59,62,0,0,51,362,17,0,0,1,5,207,3,195,28,1,0,0,0,4,0,17,67,3,0,0,0,0,86,1236,3,0,1,5,39,14,31,12,0,2,2,18,5,1,48,172,0,14,118,118,0,7,0,8,1,19,116,529,4,0,0,46,18,0,3,3,4,5,6,0,0,2,2,12,2,10,0]],\"container\":\"\\n \\n \\n \\n M1A\\n M1B\\n A1A\\n A1B\\n V1A\\n V1B\\n M6A\\n M6B\\n A6A\\n A6B\\n V6A\\n V6B\\n M12A\\n M12B\\n A12A\\n A12B\\n V12A\\n V12B\\n \\n \\n\",\"options\":{\"scrollX\":true,\"fixedColumns\":true,\"deferRender\":true,\"scrollY\":200,\"scroller\":true,\"columnDefs\":[{\"className\":\"dt-right\",\"targets\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]},{\"orderable\":false,\"targets\":0}],\"order\":[],\"autoWidth\":false,\"orderClasses\":false}},\"evals\":[],\"jsHooks\":[]} Data Transformation For gene differential expression, raw counts are required, however for data visualization or clustering, it can be useful to work with transformed count data. exploreDDS function is convenience wrapper to transform raw read counts using the DESeq2 package transformations methods. The input file has to contain all the genes, not just differentially expressed ones. Supported methods include variance stabilizing transformation (vst) (Anders and Huber (2010)), and regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).\nexploredds \u003c- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, transformationMethod = \"rlog\") exploredds ## class: DESeqTransform ## dim: 116 18 ## metadata(1): version ## assays(1): '' ## rownames(116): AT1G01010 AT1G01020 ... ATMG00180 ATMG00200 ## rowData names(51): baseMean baseVar ... dispFit rlogIntercept ## colnames(18): M1A M1B ... V12A V12B ## colData names(2): condition sizeFactor Users are strongly encouraged to consult the DESeq2 vignette for more detailed information on this topic and how to properly run DESeq2 on data sets with more complex experimental designs.\nScatterplot To decide which transformation to choose, we can visualize the transformation effect comparing two samples or a grid of all samples, as follows:\nexploreDDSplot(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, samples = c(\"M12A\", \"M12A\", \"A12A\", \"A12A\"), scattermatrix = TRUE) ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. The scatterplots are created using the log2 transform normalized reads count, variance stabilizing transformation (VST) (Anders and Huber (2010)), and regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).\nHierarchical Clustering Dendrogram The following computes the sample-wise correlation coefficients using the stats::cor() function from the transformed expression values. After transformation to a distance matrix, hierarchical clustering is performed with the stats::hclust function and the result is plotted as a dendrogram, as follows:\nhclustplot(exploredds, method = \"spearman\") The function provides the utility to save the plot automatically.\nHierarchical Clustering HeatMap This function performs hierarchical clustering on the transformed expression matrix generated within the DESeq2 package. It uses, by default, a Pearson correlation-based distance measure and complete linkage for cluster join. If samples selected in the clust argument, it will be applied the stats::dist() function to the transformed count matrix to get sample-to-sample distances. Also, it is possible to generate the pheatmap or plotly plot format.\n## Samples plot heatMaplot(exploredds, clust = \"samples\", plotly = TRUE) {\"x\":{\"visdat\":{\"34341250a552\":[\"function () \",\"plotlyVisDat\"]},\"cur_data\":\"34341250a552\",\"attrs\":{\"34341250a552\":{\"x\":[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],\"y\":[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],\"z\":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],\"alpha_stroke\":1,\"sizes\":[10,100],\"spans\":[1,20],\"type\":\"heatmap\"}},\"layout\":{\"margin\":{\"b\":40,\"l\":60,\"t\":25,\"r\":10},\"xaxis\":{\"domain\":[0,1],\"automargin\":true,\"title\":[]},\"yaxis\":{\"domain\":[0,1],\"automargin\":true,\"title\":[]},\"scene\":{\"zaxis\":{\"title\":[]}},\"hovermode\":\"closest\",\"showlegend\":false,\"legend\":{\"yanchor\":\"top\",\"y\":0.5}},\"source\":\"A\",\"config\":{\"showSendToCloud\":false},\"data\":[{\"colorbar\":{\"title\":\"\",\"ticklen\":2,\"len\":0.5,\"lenmode\":\"fraction\",\"y\":1,\"yanchor\":\"top\"},\"colorscale\":[[\"0\",\"rgba(68,1,84,1)\"],[\"0.0416666666666667\",\"rgba(70,19,97,1)\"],[\"0.0833333333333333\",\"rgba(72,32,111,1)\"],[\"0.125\",\"rgba(71,45,122,1)\"],[\"0.166666666666667\",\"rgba(68,58,128,1)\"],[\"0.208333333333333\",\"rgba(64,70,135,1)\"],[\"0.25\",\"rgba(60,82,138,1)\"],[\"0.291666666666667\",\"rgba(56,93,140,1)\"],[\"0.333333333333333\",\"rgba(49,104,142,1)\"],[\"0.375\",\"rgba(46,114,142,1)\"],[\"0.416666666666667\",\"rgba(42,123,142,1)\"],[\"0.458333333333333\",\"rgba(38,133,141,1)\"],[\"0.5\",\"rgba(37,144,140,1)\"],[\"0.541666666666667\",\"rgba(33,154,138,1)\"],[\"0.583333333333333\",\"rgba(39,164,133,1)\"],[\"0.625\",\"rgba(47,174,127,1)\"],[\"0.666666666666667\",\"rgba(53,183,121,1)\"],[\"0.708333333333333\",\"rgba(79,191,110,1)\"],[\"0.75\",\"rgba(98,199,98,1)\"],[\"0.791666666666667\",\"rgba(119,207,85,1)\"],[\"0.833333333333333\",\"rgba(147,214,70,1)\"],[\"0.875\",\"rgba(172,220,52,1)\"],[\"0.916666666666667\",\"rgba(199,225,42,1)\"],[\"0.958333333333333\",\"rgba(226,228,40,1)\"],[\"1\",\"rgba(253,231,37,1)\"]],\"showscale\":true,\"x\":[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],\"y\":[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],\"z\":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],\"type\":\"heatmap\",\"xaxis\":\"x\",\"yaxis\":\"y\",\"frame\":null}],\"highlight\":{\"on\":\"plotly_click\",\"persistent\":false,\"dynamic\":false,\"selectize\":false,\"opacityDim\":0.2,\"selected\":{\"opacity\":1},\"debounce\":0},\"shinyEvents\":[\"plotly_hover\",\"plotly_click\",\"plotly_selected\",\"plotly_relayout\",\"plotly_brushed\",\"plotly_brushing\",\"plotly_clickannotation\",\"plotly_doubleclick\",\"plotly_deselect\",\"plotly_afterplot\",\"plotly_sunburstclick\"],\"base_url\":\"https://plot.ly\"},\"evals\":[],\"jsHooks\":[]} If ind selected in the clust argument, it is necessary to provide the list of differentially expressed genes for the exploredds subset.\n## Individuals genes identified in DEG analysis DEG analysis with `systemPipeR` degseqDF \u003c- systemPipeR::run_DESeq2(countDF = countMatrix, targets = targets, cmp = cmp[[1]], independent = FALSE) DEG_list \u003c- systemPipeR::filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10)) ### Plot heatMaplot(exploredds, clust = \"ind\", DEGlist = unique(as.character(unlist(DEG_list[[1]])))) The function provides the utility to save the plot automatically.\nPrincipal Component Analysis This function plots a Principal Component Analysis (PCA) from transformed expression matrix. This plot shows samples variation based on the expression values and identifies batch effects.\nPCAplot(exploredds, plotly = FALSE) The function provides the utility to save the plot automatically.\nMultidimensional scaling with MDSplot This function computes and plots multidimensional scaling analysis for dimension reduction of count expression matrix. Internally, it is applied the stats::dist() function to the transformed count matrix to get sample-to-sample distances.\nMDSplot(exploredds, plotly = FALSE) The function provides the utility to save the plot automatically.\nDimension Reduction with GLMplot This function computes and plots generalized principal components analysis for dimension reduction of count expression matrix.\nexploredds_r \u003c- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, transformationMethod = \"raw\") GLMplot(exploredds_r, plotly = FALSE) The function provides the utility to save the plot automatically.\nMA plot This function plots log2 fold changes (y-axis) versus the mean of normalized counts (on the x-axis). Statistically significant features are colored.\nMAplot(degseqDF, comparison = \"M12-A12\", filter = c(Fold = 1, FDR = 20), genes = \"ATCG00280\") The function provides the utility to save the plot automatically.\nt-Distributed Stochastic Neighbor embedding with tSNEplot This function computes and plots t-Distributed Stochastic Neighbor embedding (t-SNE) analysis for unsupervised nonlinear dimensionality reduction of count expression matrix. Internally, it is applied the Rtsne::Rtsne() (Krijthe 2015) function, using the exact t-SNE computing with theta=0.0.\ntSNEplot(countMatrix, targets, perplexity = 5) Volcano plot A simple function that shows statistical significance (p-value) versus magnitude of change (log2 fold change).\nvolcanoplot(degseqDF, comparison = \"M12-A12\", filter = c(Fold = 1, FDR = 20), genes = \"ATCG00280\") Version information sessionInfo() ## R Under development (unstable) (2021-02-04 r79940) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS ## ## Matrix products: default ## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-devel/lib/libRlapack.so ## ## locale: ## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C ## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 ## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 ## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C ## [9] LC_ADDRESS=C LC_TELEPHONE=C ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C ## ## attached base packages: ## [1] stats4 parallel stats graphics grDevices utils datasets ## [8] methods base ## ## other attached packages: ## [1] systemPipeR_1.25.11 ShortRead_1.49.2 ## [3] GenomicAlignments_1.27.2 SummarizedExperiment_1.21.3 ## [5] Biobase_2.51.0 MatrixGenerics_1.3.1 ## [7] matrixStats_0.58.0 BiocParallel_1.25.5 ## [9] Rsamtools_2.7.2 Biostrings_2.59.2 ## [11] XVector_0.31.1 GenomicRanges_1.43.4 ## [13] GenomeInfoDb_1.27.11 IRanges_2.25.9 ## [15] S4Vectors_0.29.15 BiocGenerics_0.37.2 ## [17] systemPipeTools_0.9.1 BiocStyle_2.19.2 ## ## loaded via a namespace (and not attached): ## [1] backports_1.2.1 BiocFileCache_1.99.6 plyr_1.8.6 ## [4] lazyeval_0.2.2 splines_4.1.0 crosstalk_1.1.1 ## [7] ggplot2_3.3.3 digest_0.6.27 htmltools_0.5.1.1 ## [10] fansi_0.4.2 magrittr_2.0.1 checkmate_2.0.0 ## [13] memoise_2.0.0 BSgenome_1.59.2 base64url_1.4 ## [16] limma_3.47.12 annotate_1.69.2 prettyunits_1.1.1 ## [19] jpeg_0.1-8.1 colorspace_2.0-0 blob_1.2.1 ## [22] rappdirs_0.3.3 ggrepel_0.9.1 xfun_0.22 ## [25] dplyr_1.0.5 crayon_1.4.1 RCurl_1.98-1.3 ## [28] jsonlite_1.7.2 genefilter_1.73.1 VariantAnnotation_1.37.1 ## [31] brew_1.0-6 survival_3.2-10 ape_5.4-1 ## [34] glue_1.4.2 gtable_0.3.0 zlibbioc_1.37.0 ## [37] DelayedArray_0.17.10 V8_3.4.0 scales_1.1.1 ## [40] pheatmap_1.0.12 DBI_1.1.1 GGally_2.1.1 ## [43] edgeR_3.33.3 Rcpp_1.0.6 viridisLite_0.4.0 ## [46] xtable_1.8-4 progress_1.2.2 tidytree_0.3.3 ## [49] bit_4.0.4 rsvg_2.1.1 DT_0.18 ## [52] htmlwidgets_1.5.3 httr_1.4.2 RColorBrewer_1.1-2 ## [55] ellipsis_0.3.1 farver_2.1.0 pkgconfig_2.0.3 ## [58] reshape_0.8.8 XML_3.99-0.6 dbplyr_2.1.1 ## [61] sass_0.3.1 locfit_1.5-9.4 utf8_1.2.1 ## [64] labeling_0.4.2 later_1.1.0.1 tidyselect_1.1.0 ## [67] rlang_0.4.10 AnnotationDbi_1.53.1 munsell_0.5.0 ## [70] tools_4.1.0 cachem_1.0.4 generics_0.1.0 ## [73] RSQLite_2.2.7 evaluate_0.14 stringr_1.4.0 ## [76] fastmap_1.1.0 yaml_2.2.1 ggtree_2.5.2 ## [79] knitr_1.32 bit64_4.0.5 purrr_0.3.4 ## [82] KEGGREST_1.31.1 nlme_3.1-152 mime_0.10 ## [85] formatR_1.9 aplot_0.0.6 biomaRt_2.47.7 ## [88] compiler_4.1.0 filelock_1.0.2 plotly_4.9.3 ## [91] curl_4.3 png_0.1-7 treeio_1.15.7 ## [94] tibble_3.1.1 geneplotter_1.69.0 bslib_0.2.4 ## [97] stringi_1.5.3 highr_0.9 blogdown_1.3 ## [100] GenomicFeatures_1.43.8 lattice_0.20-41 Matrix_1.3-2 ## [103] glmpca_0.2.0 vctrs_0.3.7 pillar_1.6.0 ## [106] lifecycle_1.0.0 BiocManager_1.30.12 jquerylib_0.1.3 ## [109] data.table_1.14.0 bitops_1.0-6 httpuv_1.5.5 ## [112] rtracklayer_1.51.5 patchwork_1.1.1 BiocIO_1.1.2 ## [115] R6_2.5.0 latticeExtra_0.6-29 hwriter_1.3.2 ## [118] promises_1.2.0.1 bookdown_0.22 codetools_0.2-18 ## [121] MASS_7.3-53.1 assertthat_0.2.1 rjson_0.2.20 ## [124] DESeq2_1.31.18 withr_2.4.2 batchtools_0.9.15 ## [127] GenomeInfoDbData_1.2.4 hms_1.0.0 grid_4.1.0 ## [130] tidyr_1.1.3 DOT_0.1 rmarkdown_2.7.12 ## [133] rvcheck_0.1.8 Rtsne_0.15 shiny_1.6.0 ## [136] restfulr_0.0.13 Funding This project is funded by NSF award ABI-1661152.\nReferences Anders, Simon, and Wolfgang Huber. 2010. “Differential Expression Analysis for Sequence Count Data.” Genome Biol. 11 (10): R106.\n H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.\n Krijthe, Jesse H. 2015. Rtsne: T-Distributed Stochastic Neighbor Embedding Using Barnes-Hut Implementation. https://github.com/jkrijthe/Rtsne.\n Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-seq Data with DESeq2.” Genome Biol. 15 (12): 550. https://doi.org/10.1186/s13059-014-0550-8.\n ","categories":"","description":"","excerpt":" pre code { white-space: pre !important; overflow-x: …","ref":"/sp/spt/systempipetools/","tags":"","title":"Data Visualizations"},{"body":"document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Note: if you use systemPipeR in published research, please cite: Backman, T.W.H and Girke, T. (2016). systemPipeR: NGS Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.\nIntroduction systemPipeR provides flexible utilities for designing, building, and running automated nd-to-end analysis workflows for a wide range of research applications, including next-generation sequencing (NGS) experiments (H Backman and Girke 2016). Important features include a uniform workflow interface across different data analysis applications, automated report generation, and support for running both R and command-line software, on local computers or compute clusters (see Figure 1). The latter supports interactive job submissions and batch submissions to queuing systems of clusters.\nIt has been designed to improve the reproducibility of large-scale data analysis projects while substantially reducing the time it takes to analyze complex omics data sets. Its unique features include a uniform workflow interface and management system that allows the user to run selected steps, customize, and design entirely new workflows. Also, the package features take advantage of central community S4 classes of the Bioconductor ecosystem and command-line-based software support.\nThe main motivation and advantages of using systemPipeR for complex data analysis tasks are:\n Facilitates the design of complex workflows involving multiple R/Bioconductor packages Common workflow interface for different applications Makes analysis with Bioconductor utilities more accessible to new users Simplifies usage of command-line software from within R Reduces the complexity of using compute clusters for R and command-line software Accelerates runtime of workflows via parallelization on computer systems with multiple CPU cores and/or multiple compute nodes Improves reproducibility by automating analyses and generation of analysis reports Figure 1: Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A \u0026 B). Examples of *systemPipeR’s* visualization functionalities are given under (C). A central concept for designing workflows within the systemPipeR environment is the use of workflow management containers. Workflow management containers allow the automation of design, build, run and scale different steps and tools in data analysis. systemPipeR adopted the widely used community standard Common Workflow Language (CWL) (Amstutz et al. 2016) for describing parameters analysis workflows in a generic and reproducible manner. Using this community standard in systemPipeR has many advantages. For instance, the integration of CWL allows running systemPipeR workflows from a single specification instance either entirely from within R, from various command-line wrappers (e.g., cwl-runner) or from other languages (, e.g., Bash or Python). systemPipeR includes support for both command-line and R/Bioconductor software as well as resources for containerization, parallel evaluations on computer clusters along with the automated generation of interactive analysis reports.\nAn important feature of systemPipeR's CWL interface is that it provides two options to run command-line tools and workflows based on CWL. First, one can run CWL in its native way via an R-based wrapper utility for cwl-runner or cwl-tools (CWL-based approach). Second, one can run workflows using CWL’s command-line and workflow instructions from within R (R-based approach). In the latter case the same CWL workflow definition files (e.g. *.cwl and *.yml) are used but rendered and executed entirely with R functions defined by systemPipeR, and thus use CWL mainly as a command-line and workflow definition format rather than software to run workflows. In this regard systemPipeR also provides several convenience functions that are useful for designing and debugging workflows, such as a command-line rendering function to retrieve the exact command-line strings for each data set and processing step prior to running a command-line.\nThis overview introduces the design of a workflow management container, an S4 class in systemPipeR, as well as the custom command-line interface, combined with the overview of all the common analysis steps of NGS experiments.\nNew workflow management interface systemPipeR allows creation (multi-step analyses) and execution of workflow entirely for R, with control, flexibility, and scalability of the all process. The execution of the workflow can be sent to a HPC, can be parallelizes, accelerating results acquisition.\nThe flexibility of systemPipeR's new interface workflow management class is the driving factor behind the use of as many steps necessary for the analysis, as well as the connection between command-line- or R-based software. The connectivity among all workflow steps is achieved by the SYSargsList workflow management class.\nSYSargsList S4 class is a list-like container where each instance stores all the input/output paths and parameter components required for a particular data analysis step (see Figure 2).\nThe SYSargsList constructor function will generate the instances, using as data input initial targets files, as well as two-parameter files (for details, see below). When running preconfigured workflows, the only input the user needs to provide is the initial targets file containing the paths to the input files (e.g., FASTQ) along with unique sample labels. Subsequent targets instances are created automatically, based on the connectivity establish between the steps. The parameters required for running command-line software is provided by the parameter (*.cwl and *.yml)) files described below.\nThe class store one or multiple steps, allowing central control for running, checking status, and monitor complex workflows from start to finish. This design enhances the systemPipeR workflow framework with a generalized, flexible, and robust design.\nFigure 2: Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container. Reference Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. https://doi.org/10.6084/m9.figshare.3115156.v2.\n H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.\n ","categories":"","description":"","excerpt":"document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/introduction/","tags":"","title":"Introduction"},{"body":" Main functionalities Currently, SPS includes 3 main functional categories (Fig 1):\n Some pre-defined modules (tabs) include: a. A workbench for designing and configuring data analysis workflows, b. Downstream analysis and visualization tools for RNA-Seq, and c. A space to make quick ggplots. A section with user custom tabs: users define their own shiny tabs. An image editing tab “Canvas” which allows users to edit plots made from the previous two categories. Besides, SPS provides many functions to extend the default Shiny development, like more UI components, server functions. Also, SPS has some useful general R ulitlies like error catching, logging, and more.\n Figure 1. Design of SPS\nThe framework provides an interactive web interface for workflow management and data visualization.\nSPS tabs Within the functional categories, SPS functions are modularized into sub-components, here referred to as SPS tabs that are similar to menu tabs in other GUI applications that organize related and inter-connected functionalies into groups. On the backend, SPS tabs are based on Shiny modules, that are stored in separate files. This modular structure is highly extensible and greatly simplifies the design of new SPS tabs by both users and/or developers. Details about extending existing tabs and designing new ones are provided in Manage tabs section on our website.\n","categories":"","description":"","excerpt":" Main functionalities Currently, SPS includes 3 main functional …","ref":"/sps/intro/","tags":"","title":"Introduction"},{"body":"SPS Components package systemPipeShiny Components (spsComps) package is a collection of custom UI and server components that are used in SPS main framework. If you see a component in SPS but want to outside the SPS framework, like in your own Shiny apps, take a look at these components.\nDemos Demo type source code shiny{blk} shinyapps.io Github{blk} Rmd Rmarkdown rendered Raw{blk} table {font-size: 1.5rem} Installation Read the developer tools main page, not repeating here.\nCategory {spsComps} can be divided into two major categories: UI and server.\n UI: Shiny or HTML UI components, for example, a box, a gallery, a button, etc. With these most of components, you do NOT need a server, so they are compatible with R markdown documents. See the UI page and its source code how we use the components in a Rmd doucment. However, some UI components has server side functions, mostly like updateXXX functions. Mainly these functions are used to update/change the UI based on user behaviors. It is totally okay to use the UI functions without the server functions (you will get static UI). server: can only be run in the Shiny server. These functions are designed to make back-end progress easier, extensions of original shiny Server functions. Functions reference manual In documents, we only highlight some important functions. Please read the reference manuals for details of every function.\nsome screenshots of spsComps Animations Loaders Buttons Code display button Go top button Input buttons Button groups Table of buttons Gallery Logos Progress tracking Porgress panel Timeline Tooltips Popovers Colorful titles Colorful divider lines ","categories":"","description":"","excerpt":"SPS Components package systemPipeShiny Components (spsComps) package …","ref":"/sps/dev/spscomps/","tags":"","title":"spsComps"},{"body":"","categories":"","description":"","excerpt":"","ref":"/sp/spr/","tags":"","title":"systemPipeR"},{"body":" For most of the UI components, you can view them in the online Shiny demo{blk}. Most but not all UI components work in a Rmarkdown document. Here we demostrate how you could use some of them in a Rmarkdown doc. The source code of this document is on Github{blk}.\nload package To start to use spsComps, load it in your Shiny app file or Rmarkdown file\nlibrary(spsComps) ## Loading required package: shiny library(magrittr) So you can see it depends on shiny and spsUtil. When you load it, there is no need to additionally load shiny or spsUtil.\nspsGoTop A go top button.\nspsGoTop() It will not be display inline of the Rmd, just simply call it and maybe change the style as you want. By default, a “go to top” button will be created on the bottom-right corner. Now scroll this page, and you should see it (the rocket button).\ngallery texts \u003c- c(\"p1\", \"p2\", \"\", \"p4\", \"p5\") hrefs \u003c- c(\"https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true\", \"\", \"https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true\") images \u003c- c(\"https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/3.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true\", \"https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true\") gallery( texts = texts, hrefs = hrefs, images = images, enlarge = TRUE, enlarge_method = \"modal\" ) Gallery\np1\n p2\n  \n p4\n p5\n X fixGalHeight(\"gallery6448598\") You can show a gallery of plots you make in the Rmd and when people click it, it will be enlarged. You can also specify a link for each image.\nLogos a single one with hexLogo hexLogo( \"logo\", \"Logo\", hex_img = \"https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg\", hex_link = \"https://www.google.com\", footer = \"Footer\", footer_link = \"https://www.google.com\" ) Logo\n Footer a panel of logos with hexPanel hexPanel( \"demo1\", \"\" , rep(\"https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg\", 2) ) Buttons Some colorful buttons hrefTab hrefTab( title = \"Different background and text colors\", label_texts = c(\"Go top\", \"Disabled\", \"Email me\"), hrefs = c(\"#\", \"\", \"mailto:xxx@abc.com\"), bg_colors = c(\"green\", \"#eee\", \"orange\"), text_colors = c(\"#caffc1\", \"black\", \"blue\") ) Different background and text colors\nGo top Disabled Email me A table colorful buttons hrefTable hrefTable( title = \"Change button color and text color\", item_titles = c(\"workflow 1\", \"No links\"), item_labels = list(c(\"tab 1\"), c(\"tab 3\", \"tab 4\")), item_hrefs = list(c(\"https://www.google.com/\"), c(\"\", \"\")), item_bg_colors = list(c(\"blue\"), c(\"red\", \"orange\")), item_text_colors = list(c(\"black\"), c(\"yellow\", \"green\")), style = \"display: table;\" ) Change button color and text color Category Options workflow 1 tab 1 No links tab 3 tab 4 hrefTable( title = \"Change row name colors and width\", item_titles = c(\"Green\", \"Red\", \"Orange\"), item_labels = list(c(\"tab 1\"), c(\"tab 3\", \"tab 4\"), c(\"tab 5\", \"tab 6\", \"tab 7\")), item_hrefs = list( c(\"https://www.google.com/\"), c(\"\", \"\"), c(\"https://www.google.com/\", \"https://www.google.com/\", \"\") ), item_title_colors = c(\"green\", \"red\", \"orange\"), style = \"display: table;\" ) Change row name colors and width Category Options Green tab 1 Red tab 3 tab 4 Orange tab 5 tab 6 tab 7 The table caption is on top in Shiny but on bottom in Rmd. You may also want to add the style = \"display: table;\" in Rmd to make the table occupy full length of the document in R markdown.\nAnimations animateUI Add animations to existing components with animateUI\nTo buttons tags$button(id = \"btn1\", \"random button\") random button\nanimateUI(\"btn1\", animation = \"ring\") addSpsAnimation(\"#btn1\", \"sps-animation faa-ring animated \") To some text p(id = \"mytext\", class = \"text-red\", \"some move text\") some move text\nanimateUI(\"mytext\", animation = \"horizontal\", speed = \"fast\") addSpsAnimation(\"#mytext\", \"sps-animation faa-horizontal animated faa-fast\") On hover, move mouse on the red thumb tags$button( id = \"btn2\", icon(id = \"myicon\", \"thumbs-o-up\"), style = \"color: red; boarder: initial; border-color: transparent;\" ) animateUI(\"btn2\", animation = \"bounce\", speed = \"fast\", hover = TRUE) addSpsAnimation(\"#btn2\", \"sps-animation faa-bounce animated-hover faa-fast\") Inline animation You can add animations to inline Rmarkdown text by giving it a HTML tag and id, like following:\nsome text some text \u003cspan id=\"some-text\" style=\"display: inline-block\"\u003esome text\u003c/span\u003e some text some text some text some text some text some text some text\nanimateUI(selector = \"some-text\", animation = \"ring\") addSpsAnimation(\"#some-text\", \"sps-animation faa-ring animated \") Most animations required the target tag to have CSS display “block” or “inline-block”, you can append this by adding style=\"display: inline-block\" to the tag as shown above or check examples below.\n animateAppend Add animations with pipe %\u003e% by animateAppend\nicon(\"home\") %\u003e% animateAppend(\"ring\") \ntags$p(\"Append animation\", class = \"text-primary\", style=\"display: inline-block\") %\u003e% animateAppend(\"pulse\") Append animation\n animateAppendNested Apply multiple animations to the same component\ntags$b(\"Nested animations\", class = \"text-primary\") %\u003e% animateAppendNested(\"ring\") %\u003e% animateAppendNested(\"pulse\") %\u003e% animateAppendNested(\"passing\") Nested animations tags$b(\"Nested animations display changed\", class = \"text-primary\") %\u003e% animateAppendNested(\"ring\") %\u003e% animateAppendNested(\"pulse\", display = \"block\", style = \"width: 30%\") Nested animations display changed animateIcon Here is a convenient function that allows you to create font-awesome icons with animations and customize, color, size, etc, an enhanced version of original shiny::icon and can also be used in Rmarkdown.\nDefault Default is the same as original icon\nanimateIcon(\"home\") \nAnimation and color animateIcon(name = \"home\", animation = \"horizontal\", speed = \"slow\", color =\"red\") \nAdd to a button tags$button(animateIcon(\"spinner\", \"spin\", \"fast\"), \"A button\") A button on hover animateIcon(name = \"wrench\", animation = \"wrench\", hover = TRUE, color =\"green\") \nChange size animateIcon(\"home\", size = \"xs\") \nanimateIcon(\"home\", size = \"sm\") \nanimateIcon(\"home\", size = \"lg\") \nanimateIcon(\"home\", size = \"2x\") \nanimateIcon(\"home\", size = \"3x\") \nanimateIcon(\"home\", size = \"5x\") \nanimateIcon(\"home\", size = \"7x\") \nanimateIcon(\"home\", size = \"10x\") \n Loaders Add loaders to indicate busy status. Most cases, loaders are added by a backend server to show the busy processing status and are removed when the process is done. Rmarkdown documents does not have a server, but you can still add some loaders.\ncssLoader Default loaders There are 12 different default loaders: “circle,” “dual-ring,” “facebook,” “heart,” “ring,” “roller,” “default,” “ellipsis,” “grid,” “hourglass,” “ripple,” “spinner.”\ncssLoader(height = \"100px\") $(function(){ $(\"#spsloader-913278546\").prepend(chooseLoader(\"spsloader-913278546\", \"default\", \"\", \"#337ab7\", \"100px\", \"100px\")); }); customize it:\ncssLoader(type = \"grid\", height = \"150px\", color = \"orange\") $(function(){ $(\"#spsloader-298435617\").prepend(chooseLoader(\"spsloader-298435617\", \"grid\", \"\", \"orange\", \"150px\", \"150px\")); }); Add to a button:\ntags$button( ## `inline = TRUE` is important if you want loader and ## text in the same line. cssLoader(is_icon = TRUE, inline = TRUE, color = \"#3a7bd5\"), \"A button\" ) $(function(){ $(\"#spsloader-934216857\").prepend(chooseLoader(\"spsloader-934216857\", \"default\", \"\", \"#3a7bd5\", \"1.5rem\", \"1.5rem\")); }); A button Your own loaders You can choose a gif to be a your loader\ncssLoader(type = \"gif\", src = \"https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true\", height = \"100px\") $(function(){ $(\"#spsloader-697124358\").prepend(chooseLoader(\"spsloader-697124358\", \"gif\", \"https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true\", \"#337ab7\", \"100px\", \"100px\")); }); cssLoader(type = \"gif\", src = \"https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true\", height = \"150px\") $(function(){ $(\"#spsloader-692571438\").prepend(chooseLoader(\"spsloader-692571438\", \"gif\", \"https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true\", \"#337ab7\", \"150px\", \"150px\")); }); bsTooltip and bsTip Add tooltips to the documents with bsTooltip\nactionButton(\"\", \"Tooltip on the left\") %\u003e% bsTooltip(\"Tooltip on the left\", \"left\") Tooltip on the left bsTooltip( \"bsTooltip51201388\", \"left\", \"Tooltip on the left\", \"black\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"Tooltip on the top\") %\u003e% bsTooltip(\"Tooltip on the top\", \"top\") Tooltip on the top bsTooltip( \"bsTooltip75760883\", \"top\", \"Tooltip on the top\", \"black\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"Tooltip on the right\") %\u003e% bsTooltip(\"Tooltip on the right\", \"right\") Tooltip on the right bsTooltip( \"bsTooltip87272588\", \"right\", \"Tooltip on the right\", \"black\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"Tooltip on the bottom\") %\u003e% bsTooltip(\"Tooltip on the bottom\", \"bottom\") Tooltip on the bottom bsTooltip( \"bsTooltip19999567\", \"bottom\", \"Tooltip on the bottom\", \"black\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) or use the higher leveler convenient function bsTip\nactionButton(\"\", \"primary\") %\u003e% bsTip(\"primary\", status = \"primary\") primary bsTooltip( \"bsTooltip41302842\", \"top\", \"primary\", \"#0275d8\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"info\") %\u003e% bsTip(\"info\", status = \"info\") info bsTooltip( \"bsTooltip17592348\", \"top\", \"info\", \"#5bc0de\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"success\") %\u003e% bsTip(\"success\", status = \"success\") success bsTooltip( \"bsTooltip70458981\", \"top\", \"success\", \"#5cb85c\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"warning\") %\u003e% bsTip(\"warning\", status = \"warning\") warning bsTooltip( \"bsTooltip38241728\", \"top\", \"warning\", \"#f0ad4e\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) actionButton(\"\", \"danger\") %\u003e% bsTip(\"danger\", status = \"danger\") danger bsTooltip( \"bsTooltip58127777\", \"top\", \"danger\", \"#d9534f\", \"white\", \"12px\", \"hover focus\", \"400\", \"1\", false ) Titles with spsTitle You can use {spsComps} to add colorful titles in Rmarkdown\nspsTitle(\"primary\", status = \"primary\") primary spsTitle(\"info\", status = \"info\") info spsTitle(\"success\", status = \"success\") success spsTitle(\"warning\", status = \"warning\") warning spsTitle(\"danger\", status = \"danger\") danger Or you own colors\nspsTitle(\"purple\", other_color = \"purple\") purple spsTitle(\"pink\", other_color = \"pink\") pink Add horizontal divider lines with spsHr spsHr(\"info\") spsHr(\"primary\") spsHr(\"success\") spsHr(\"warning\") spsHr(\"danger\") Other components Other components are either performed the best in a Shiny app or requires a server. Please see the demo\n","categories":"","description":"","excerpt":" For most of the UI components, you can …","ref":"/sps/dev/spscomps/ui/","tags":"","title":"UI components"},{"body":"Workflow management The workflow management module in SPS allows one to modify or create the configuration files required for running data analysis workflows in systemPipeR (SPR). This includes three types of important files: a sample metadata (targets) file, a workflow file (in R Markdown format) defining the workflow steps, and workflow running files in Common Workflow Language (CWL){blk} format. In SPS, one can easily create these files under the “Workflow Management” module, located in navigation bar on the left of the dashboard.\nThe current version of SPS allows to:\n create a workflow environment; create and/or check the format of targets / workflow / CWL files; download the prepared workflow files to run elsewhere, like a cluster; directly execute the workflow from SPS. 1. setup a workflow Figure 3. A. Workflow Management - Targets File\n In the workflow module, read the instructions and choose step 1. Step 1 should be automatically opened for you on start. Choose a folder where you want to create the workflow environment. Choose a workflow template. These are SPR workflows and mainly are next-generation sequencing workflows. Click “Gen workflow” to create the workflow project. You should see a pop-up saying about the project path and other information. Clicking the pop-up will jump you to the step 2. The status tracker and banner for step 1 should all turn green. 2. Prepare the targets file The targets file defines all input file paths and other sample information of analysis workflows. To better undertand the structure of this file, one can consult the “Structure of targets file” section in the SPR vignette. Essentially, this is the tabular file representation of the colData slot in an SummarizedExperiment object which stores sample IDs and other meta information.\nThe following step-by-step instructions explain how to create and/or modify targets files using RNA-Seq as an example (Fig.3 A):\n Your project targets file is loaded for you, but you can choose to upload a different one. You can edit, right click to add/remove rows/columns (The first row is treated as column names). SPR target file includes a header block, that can also be edited in the SPS app. Each headers needs to start with a “#”. Header is useful for workflows with DEG analysis in current SPR. You can define sample comparison groups here. Leave it as default for other projects. The section on the left provides sample statistics and information whether files exist inside the workflow project’s data directory. Choose any column you want from the dropdown to check and watch the statistics bar change in this section. statistic status bar. Clicking on “Add to task” can help you to check if your target file has any formatting problem. You should see a green success pop-up if everything is right. Now your target file is ready and you can click “save” to download it and later use in other SPR projects. Figure 3. A. Workflow Management - Targets File\n3. Prepare a workflow object In SPR, workflows are defined in Rmarkdown files, you can read details and obtain them here.\nNow let us follow the order below to see how SPS helps you to prepare a workflow file for a RNAseq project (Fig.3 B):\n The left panal is the workflow designer. All steps from the template from your choosen workflow will be displayed here. The arrows indicates the execution order of the entire workflow. All the steps are draggable. Drag and place steps to a different place to change the order. Note: if you change the order, it may break the dependency. SPS will check this for you. After changing orders, steps marked in pink mean these steps are broken. You need to fix the dependency before you can save it. To config a step, such as, changing name, fixing dependency. Click the button next to each step, a modal will show up and you can make changes there. To add a step, click the button. There, you will have more options to choose which will be explained in the next figure. History is enabled in this designer, you can undo or redo anytime you want. Current SPS stores max 100 steps of history for you. To delete a step, simply drag it to the trash can. After you are done with all edits, click here to save the workflow so we can run or download it in the next major step. On the right side is the workflow dependency plot. This plot shows how each step is connected and the expected execution order. It does not mean the the workflow will be run in the same order. The order is determined by the order you have in the left-side designer. Enlarge the left or right panel. If you have a small monitor screen, this can help. Figure 3. B.1 Workflow Management - Workflow Designer\n R step and sysArgs step On the designer there are two types of workflow steps. One is R step, which only has R code. Then it is the time to run these R steps, they will be run in the same R session as the Shiny app and in a separate environment different than your global environment. In other words, all R steps are in the same environment, they can communicate with each other, meaning you can define a variable in one step and use it in other R steps.\nsysArgs steps, on the other hand, is different, as its name suggest, it will invoke system commands (like bash) when run. Details of how to create these steps will be discussed on Fig 3.B.5, Fig 3.B.6.\nView and modify steps Current SPS allows users to view some basic information of R steps like, step name, select dependency(ies). Besides, users are welcome to change the R code they want in the second sub-tab (Fig 3.B.2).\n Figure 3. B.2 Workflow Management - config R\n Modification of sysArgs steps is limited to step name and dependency. However, this kind steps will provide more information to view, like the files that were used to create this step, raw commandline code that will be run, targets (metadata) and output dataframes. This information is distributed in different subtabs (Fig 3.B.3).\n Figure 3. B.3 Workflow Management - config sysArgs\n Create a new step After clicking the button in Fig 3.B.1, you would need to choose whether to create an R or sysArgs step (Figure 3. B.5).\n Figure 3. B.5 Workflow Management - Choose new step type\n Create a new R step\nCreate a new R step is simple. In the modal, type the step name, R code, and select dependency (Fig 3. B.6).\n Figure 3. B.6 Workflow Management - New R step\n Create a new sysArgs step\nBasic info for sysArgs step is simialr to R step (Fig 3. B.7).\n Figure 3. B.7 Workflow Management - New sysArgs step\n To generate some commandline line, there are three items need to be prepared: targets, CWL file, CWL yaml file (Fig.3. B.8).\n targets: metadata that will populate the basecommand sample-wisely. Columns in targets will be injected into CWL yaml and then, yaml file will replace variables in parsed CWL base command. CWL file: provide the base command. CWL yaml file: provides CWL variables. Choose the targets source. Targets in SPR workflow steps can come from either a fresh file or inherit from a previous sysArg step(s) (output from a previous step can become input of the next(s)). If you choose from a previous step(s), select the steps from here. If a new file, upload here. Then, the targets or inherited targets table is displayed here for you to take a look. Later we will use these column to replace CWL yaml variables. Choose the CWL and CWL yaml file you want to use. All .cwl and .yaml or .yml files inside your workflow project param/cwl folder will be listed here. You could drop more of these files you want to this folder. They will become aviable the next time you create a new step. If you have all the three items, you can start to use which column from the targets to replace each CWL yaml variables. Try to parse the command, see if the results is as what you expect. If not, try to change options above and try again. If everything looks fine, save and create the step. Figure 3. B.8 Workflow Management - New sysArgs step\n 4. Prepare CWL files (optional) In the new version of SPR, all individual system workflow steps are called by the CWL files. Each SPR workflow has a set of CWL files and normally users do not need to make any change. In case you want to learn more about CWL and create some new CWL files, Step 4 is a good place to practice.\nTo run a CWL step in SPR, 3 files are required:\n targets: to determine how many samples will be run and sample names. CWL running file: can be translated to bash code; CWL input: variables to inject into the running file SPR is the parser between R and CWL by injecting sample information from targets to CWL input file and then CWL parser translates it to bash code.\n Most people are not familiar this part, so read instructions carefully. Your project targets has been loaded for you, and an example CWL running and input for hisat2 is also loaded for you. Directly parse the code. See what commandline code you get. Change the targets injecting column, and parse again, see what has changed. You can edit the CWL running and input files Try to parse the new file and see what has changed. If new CWL files has been created, you can edit workflow Rmd files by adding your new steps. Figure 3. C. Workflow Management - CWL File\n5. Run or finish workflow preparation Up until this step, congratulations, the workflow is prepared. You can choose to download the workflow project files as a bundle or continue to run the workflow.\n Figure 4.A.B Workflow Runner\n On step 5 you can choose to download the prepared workflow or directly run the workflow. However, if you do not have the required commandline tools, workflow will most likely fail. Make sure you system has these tools (Read about these tools). Open up the runner. It is a “Rstudio-like” interface. Code editor. Required workflow running code is pre-entered for you. You can simply hit “Run” to start. Of course, you can delete the default code and run random R code. Output R console. Workflow running log. View any plot output. and send a copy of your current plot to SPS Canvas tab or download it. App security Running the workflow may introduce some security concerns. Read App Security for more details.\nis_demo option The is_demo option will impact the workflow module.\n TRUE: you are not deploying the app for production purpose. It is just a show case. Under this option, users who are trying to create a workflow will be locked inside a temp directory and every time they start a new session, they will be assigned to a new temp directory. This is useful if many people want to try the app the same time, so they will have different private environments, and the temp directory will be removed after the Shiny session is closed. FALSE: you are using the app on your own local computer or use it in a production environment. WF module will have full access to the sever storage system and users can choose any place they have permissions to create the workflow session. ","categories":"","description":"","excerpt":"Workflow management The workflow management module in SPS allows one …","ref":"/sps/modules/workflow/","tags":"","title":"Workflow"},{"body":"pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Note: the most recent version of this vignette can be found here.\nNote: if you use systemPipeR and systemPipeRdata in published research, please cite:\nBackman, T.W.H and Girke, T. (2016). systemPipeR: Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.\nIntroduction systemPipeRdata is a helper package to generate with a single command workflow templates that are intended to be used by its parent package systemPipeR (H Backman and Girke 2016). The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.\nTo test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow. Pre-configured directory structure of the workflow environment and the sample data used by systemPipeRdata are described here.\nGetting started Installation The systemPipeRdata package is available at Bioconductor and can be installed from within R as follows:\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeRdata\") Also, it is possible to install the development version from Bioconductor.\nBiocManager::install(\"systemPipeRdata\", version = \"devel\", build_vignettes = TRUE, dependencies = TRUE) # Installs Devel version from Bioconductor Loading package and documentation library(\"systemPipeRdata\") # Loads the package library(help = \"systemPipeRdata\") # Lists package info vignette(\"systemPipeRdata\") # Opens vignette Starting with pre-configured workflow templates Load one of the available workflows into your current working directory. The following does this for the varseq workflow template. The name of the resulting workflow directory can be specified under the mydirname argument. The default NULL uses the name of the chosen workflow. An error is issued if a directory of the same name and path exists already.\ngenWorkenvir(workflow = \"systemPipeR/SPvarseq\", mydirname = \"varseq\") setwd(\"varseq\") On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.\n$ Rscript -e \"systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname='varseq')\" Workflow templates collection A collection of workflow templates are available, and it is possible to browse the current availability, as follows:\navailableWF(github = TRUE) This function returns the list of workflow templates available within the package and systemPipeR Organization on GitHub. Each one listed template can be created as described above.\nThe workflow template choose from Github will be installed as an R package, and also it creates the environment with all the settings and files to run the demo analysis.\ngenWorkenvir(workflow=\"systemPipeR/SPrnaseq\", mydirname=\"NULL\") setwd(\"SPrnaseq\") Besides, it is possible to choose different versions of the workflow template, defined through other branches on the GitHub Repository. By default, the master branch is selected, however, it is possible to define a different branch with the ref argument.\ngenWorkenvir(workflow=\"systemPipeR/SPrnaseq\", ref = \"singleMachine\") setwd(\"SPrnaseq\") Download a specific R Markdown file Also, it is possible to download a specific workflow script for your analysis. The URL can be specified under url argument and the R Markdown file name in the urlname argument. The default NULL copies the current version available in the chose template.\ngenWorkenvir(workflow=\"systemPipeR/SPrnaseq\", url = \"https://raw.githubusercontent.com/systemPipeR/systemPipeRNAseq/cluster/vignettes/systemPipeRNAseq.Rmd\", urlname = \"rnaseq_V-cluster.Rmd\") setwd(\"rnaseq\") Dynamic generation of workflow template It is possible to create a new workflow structure from RStudio menu File -\u003e New File -\u003e R Markdown -\u003e From Template -\u003e systemPipeR New WorkFlow. This interactive option creates the same environment as demonstrated above.\nFigure 1: Selecting workflow template within RStudio.\nDirectory Structure The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:\n workflow/ (e.g. rnaseq/) This is the root directory of the R session running the workflow. Run script ( *.Rmd) and sample annotation (targets.txt) files are located here. Note, this directory can have any name (e.g. rnaseq, varseq). Changing its name does not require any modifications in the run script(s). Important subdirectories: param/ Stores non-CWL parameter files such as: *.param, *.tmpl and *.run.sh. These files are only required for backwards compatibility to run old workflows using the previous custom command-line interface. param/cwl/: This subdirectory stores all the CWL parameter files. To organize workflows, each can have its own subdirectory, where all CWL param and input.yml files need to be in the same subdirectory. data/ FASTQ files FASTA file of reference (e.g. reference genome) Annotation files etc. results/ Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory. Note: Directory names are indicated in green. Users can change this structure as needed, but need to adjust the code in their workflows accordingly.\n Figure 2: systemPipeR’s preconfigured directory structure.\nRun workflows Next, run from within R the chosen sample workflow by executing the code provided in the corresponding *.Rmd* template file. Much more detailed information on running and customizing systemPipeR* workflows is available in its overview vignette here. This vignette can also be opened from R with the following command.\nlibrary(\"systemPipeR\") # Loads systemPipeR which needs to be installed via BiocManager::install() from Bioconductor vignette(\"systemPipeR\", package = \"systemPipeR\") Return paths to sample data The location of the sample data provided by systemPipeRdata can be returned as a list.\npathList() ## $targets ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/targets.txt\" ## ## $targetsPE ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/targetsPE.txt\" ## ## $annotationdir ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/annotation/\" ## ## $fastqdir ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/fastq/\" ## ## $bamdir ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/bam/\" ## ## $paramdir ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/\" ## ## $workflows ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/\" ## ## $chipseq ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/chipseq/\" ## ## $rnaseq ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/rnaseq/\" ## ## $riboseq ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/riboseq/\" ## ## $varseq ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/varseq/\" ## ## $new ## [1] \"/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/new/\" Version information sessionInfo() ## R Under development (unstable) (2021-02-04 r79940) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS ## ## Matrix products: default ## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-devel/lib/libRlapack.so ## ## locale: ## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C ## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 ## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 ## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C ## [9] LC_ADDRESS=C LC_TELEPHONE=C ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C ## ## attached base packages: ## [1] stats graphics grDevices utils datasets ## [6] methods base ## ## other attached packages: ## [1] systemPipeRdata_1.19.2 BiocStyle_2.19.2 ## ## loaded via a namespace (and not attached): ## [1] knitr_1.33 magrittr_2.0.1 ## [3] BiocGenerics_0.37.4 R6_2.5.0 ## [5] rlang_0.4.11 stringr_1.4.0 ## [7] tools_4.1.0 parallel_4.1.0 ## [9] xfun_0.22 jquerylib_0.1.4 ## [11] htmltools_0.5.1.1 remotes_2.3.0 ## [13] yaml_2.2.1 digest_0.6.27 ## [15] bookdown_0.22 formatR_1.9 ## [17] BiocManager_1.30.12 sass_0.3.1 ## [19] codetools_0.2-18 evaluate_0.14 ## [21] rmarkdown_2.7.12 blogdown_1.3 ## [23] stringi_1.5.3 compiler_4.1.0 ## [25] bslib_0.2.4 jsonlite_1.7.2 Funding This project was supported by funds from the National Institutes of Health (NIH) and the National Science Foundation (NSF).\nReferences H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.\n ","categories":"","description":"","excerpt":"pre code { white-space: pre !important; overflow-x: scroll !important; …","ref":"/sp/sprdata/systempiperdata/","tags":"","title":"Workflow templates and sample data"},{"body":"systemPipeR 1.24 is available OVERVIEW The following enhancements have been added to systemPipeR.\n With the upgrades provided in this release, systemPipeR has become a much more generic data analysis workflow environment that is no longer limited to analyzing just NGS data. Now it can be efficiently used for data analysis tasks in many omics areas, including genomics, proteomics, metabolomics and drug discovery.\n A workflow control class (SYSargsList) has been added allowing users to manage multiple-step workflows from a single container. This way one can select and execute multiple workflow steps with standard R subsetting syntax, e.g. runWF[1:3].\n Various improvements have been added to systemPipeR’s new command-line interface including the recently introduced SYSargs2 class that supports the Common Workflow Language (CWL). Utilities have been added to visualize workflow designs and topologies with different graphical layouts.\n Improvements have been added to monitor the run status of workflows, as well as tracking of warning and error messages. This includes the generation of both scientific and technical status reports. \n ","categories":"","description":"","excerpt":"systemPipeR 1.24 is available OVERVIEW The following enhancements have …","ref":"/news/release_3_12/","tags":"","title":"Bioconductor 3.12"},{"body":"Demo Demo demo Source code shinyapps.io github Instructions Instructions on how to use {drawer} and the capture buttons are provided in the demo Shiny app in details. Click on the show code button on each tab in the demo app for code to reproduce.\n","categories":"","description":"","excerpt":"Demo Demo demo Source code shinyapps.io github Instructions …","ref":"/sps/dev/drawer/shiny/","tags":"","title":"drawer in Shiny"},{"body":" document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Getting Started Installation systemPipeR environment can be installed from the R console using the BiocManager::install command. The associated data package systemPipeRdata can be installed the same way. The latter is a helper package for generating systemPipeR workflow environments with a single command containing all parameter files and sample data required to quickly test and run workflows.\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeR\") BiocManager::install(\"systemPipeRdata\") Please note that if you desire to use a third-party command-line tool, the particular tool and dependencies need to be installed and exported in your PATH. See details.\nLoading package and documentation library(\"systemPipeR\") # Loads the package library(help = \"systemPipeR\") # Lists package info vignette(\"systemPipeR\") # Opens vignette How to get help for systemPipeR All questions about the package or any particular function should be posted to the Bioconductor support site https://support.bioconductor.org.\nPlease add the “systemPipeR” tag to your question, and the package authors will automatically receive an alert.\nWe appreciate receiving reports of bugs in the functions or documentation and suggestions for improvement. For that, please consider opening an issue at GitHub.\nProject structure systemPipeR expects a project directory structure that consists of a directory where users may store all the raw data, the results directory that will be reserved for all the outfiles files or new output folders, and the parameters directory.\nThis structure allows reproducibility and collaboration across the data science team since internally relative paths are used. Users could transfer this project to a different location and still be able to run the entire workflow. Also, it increases efficiency and data management once the raw data is kept in a separate folder and avoids duplication.\nDirectory Structure systemPipeRdata, helper package, provides pre-configured workflows, reporting templates, and sample data loaded as demonstrated below. With a single command, the package allows creating the workflow environment containing the structure described here (see Figure 1).\nDirectory names are indicated in green. Users can change this structure as needed, but need to adjust the code in their workflows accordingly.\n workflow/ (e.g. myproject/) This is the root directory of the R session running the workflow. Run script ( *.Rmd) and sample annotation (targets.txt) files are located here. Note, this directory can have any name (e.g. myproject). Changing its name does not require any modifications in the run script(s). Important subdirectories: param/ param/cwl/: This subdirectory stores all the parameter and configuration files. To organize workflows, each can have its own subdirectory, where all *.cwl and *input.yml files need to be in the same subdirectory. data/ Raw data (e.g. FASTQ files) FASTA file of reference (e.g. reference genome) Annotation files Metadata etc. results/ Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory. Figure 1: systemPipeR’s preconfigured directory structure. The following parameter files are included in each workflow template:\n targets.txt: initial one provided by user; downstream targets_*.txt files are generated automatically *.param/cwl: defines parameter for input/output file operations, e.g.: hisat2/hisat2-mapping-se.cwl hisat2/hisat2-mapping-se.yml *_run.sh: optional bash scripts Configuration files for computer cluster environments (skip on single machines): .batchtools.conf.R: defines the type of scheduler for batchtools pointing to template file of cluster, and located in user’s home directory batchtools.*.tmpl: specifies parameters of scheduler used by a system, e.g. Torque, SGE, Slurm, etc. Structure of initial targets file The targets file defines all input files (e.g. FASTQ, BAM, BCF) and sample comparisons of an analysis workflow. The following shows the format of a sample targets file included in the package. It also can be viewed and downloaded from systemPipeR’s GitHub repository here. In a target file with a single type of input files, here FASTQ files of single-end (SE) reads, the first column describe the path and the second column represents a unique id name for each sample. The third column called Factor represents the biological replicates. All subsequent columns are additional information, and any number of extra columns can be added as needed.\nUsers should note here, the usage of targets files is optional when using systemPipeR's new workflow management interface. They can be replaced by a standard YAML input file used by CWL. Since for organizing experimental variables targets files are extremely useful and user-friendly. Thus, we encourage users to keep using them.\nStructure of targets file for single-end (SE) samples targetspath \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") showDF(read.delim(targetspath, comment.char = \"#\")) ## Loading required namespace: DT {\"x\":{\"filter\":\"none\",\"vertical\":false,\"extensions\":[\"FixedColumns\",\"Scroller\"],\"data\":[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\"],[\"./data/SRR446027_1.fastq.gz\",\"./data/SRR446028_1.fastq.gz\",\"./data/SRR446029_1.fastq.gz\",\"./data/SRR446030_1.fastq.gz\",\"./data/SRR446031_1.fastq.gz\",\"./data/SRR446032_1.fastq.gz\",\"./data/SRR446033_1.fastq.gz\",\"./data/SRR446034_1.fastq.gz\",\"./data/SRR446035_1.fastq.gz\",\"./data/SRR446036_1.fastq.gz\",\"./data/SRR446037_1.fastq.gz\",\"./data/SRR446038_1.fastq.gz\",\"./data/SRR446039_1.fastq.gz\",\"./data/SRR446040_1.fastq.gz\",\"./data/SRR446041_1.fastq.gz\",\"./data/SRR446042_1.fastq.gz\",\"./data/SRR446043_1.fastq.gz\",\"./data/SRR446044_1.fastq.gz\"],[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],[\"M1\",\"M1\",\"A1\",\"A1\",\"V1\",\"V1\",\"M6\",\"M6\",\"A6\",\"A6\",\"V6\",\"V6\",\"M12\",\"M12\",\"A12\",\"A12\",\"V12\",\"V12\"],[\"Mock.1h.A\",\"Mock.1h.B\",\"Avr.1h.A\",\"Avr.1h.B\",\"Vir.1h.A\",\"Vir.1h.B\",\"Mock.6h.A\",\"Mock.6h.B\",\"Avr.6h.A\",\"Avr.6h.B\",\"Vir.6h.A\",\"Vir.6h.B\",\"Mock.12h.A\",\"Mock.12h.B\",\"Avr.12h.A\",\"Avr.12h.B\",\"Vir.12h.A\",\"Vir.12h.B\"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\"]],\"container\":\"\\n \\n \\n \\n FileName\\n SampleName\\n Factor\\n SampleLong\\n Experiment\\n Date\\n \\n \\n\",\"options\":{\"scrollX\":true,\"fixedColumns\":true,\"deferRender\":true,\"scrollY\":200,\"scroller\":true,\"columnDefs\":[{\"className\":\"dt-right\",\"targets\":5},{\"orderable\":false,\"targets\":0}],\"order\":[],\"autoWidth\":false,\"orderClasses\":false}},\"evals\":[],\"jsHooks\":[]} To work with custom data, users need to generate a targets file containing the paths to their own FASTQ files and then provide under targetspath the path to the corresponding targets file.\nStructure of targets file for paired-end (PE) samples For paired-end (PE) samples, the structure of the targets file is similar, where users need to provide two FASTQ path columns: FileName1 and FileName2 with the paths to the PE FASTQ files.\ntargetspath \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") showDF(read.delim(targetspath, comment.char = \"#\")) {\"x\":{\"filter\":\"none\",\"vertical\":false,\"extensions\":[\"FixedColumns\",\"Scroller\"],\"data\":[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\"],[\"./data/SRR446027_1.fastq.gz\",\"./data/SRR446028_1.fastq.gz\",\"./data/SRR446029_1.fastq.gz\",\"./data/SRR446030_1.fastq.gz\",\"./data/SRR446031_1.fastq.gz\",\"./data/SRR446032_1.fastq.gz\",\"./data/SRR446033_1.fastq.gz\",\"./data/SRR446034_1.fastq.gz\",\"./data/SRR446035_1.fastq.gz\",\"./data/SRR446036_1.fastq.gz\",\"./data/SRR446037_1.fastq.gz\",\"./data/SRR446038_1.fastq.gz\",\"./data/SRR446039_1.fastq.gz\",\"./data/SRR446040_1.fastq.gz\",\"./data/SRR446041_1.fastq.gz\",\"./data/SRR446042_1.fastq.gz\",\"./data/SRR446043_1.fastq.gz\",\"./data/SRR446044_1.fastq.gz\"],[\"./data/SRR446027_2.fastq.gz\",\"./data/SRR446028_2.fastq.gz\",\"./data/SRR446029_2.fastq.gz\",\"./data/SRR446030_2.fastq.gz\",\"./data/SRR446031_2.fastq.gz\",\"./data/SRR446032_2.fastq.gz\",\"./data/SRR446033_2.fastq.gz\",\"./data/SRR446034_2.fastq.gz\",\"./data/SRR446035_2.fastq.gz\",\"./data/SRR446036_2.fastq.gz\",\"./data/SRR446037_2.fastq.gz\",\"./data/SRR446038_2.fastq.gz\",\"./data/SRR446039_2.fastq.gz\",\"./data/SRR446040_2.fastq.gz\",\"./data/SRR446041_2.fastq.gz\",\"./data/SRR446042_2.fastq.gz\",\"./data/SRR446043_2.fastq.gz\",\"./data/SRR446044_2.fastq.gz\"],[\"M1A\",\"M1B\",\"A1A\",\"A1B\",\"V1A\",\"V1B\",\"M6A\",\"M6B\",\"A6A\",\"A6B\",\"V6A\",\"V6B\",\"M12A\",\"M12B\",\"A12A\",\"A12B\",\"V12A\",\"V12B\"],[\"M1\",\"M1\",\"A1\",\"A1\",\"V1\",\"V1\",\"M6\",\"M6\",\"A6\",\"A6\",\"V6\",\"V6\",\"M12\",\"M12\",\"A12\",\"A12\",\"V12\",\"V12\"],[\"Mock.1h.A\",\"Mock.1h.B\",\"Avr.1h.A\",\"Avr.1h.B\",\"Vir.1h.A\",\"Vir.1h.B\",\"Mock.6h.A\",\"Mock.6h.B\",\"Avr.6h.A\",\"Avr.6h.B\",\"Vir.6h.A\",\"Vir.6h.B\",\"Mock.12h.A\",\"Mock.12h.B\",\"Avr.12h.A\",\"Avr.12h.B\",\"Vir.12h.A\",\"Vir.12h.B\"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\",\"23-Mar-2012\"]],\"container\":\"\\n \\n \\n \\n FileName1\\n FileName2\\n SampleName\\n Factor\\n SampleLong\\n Experiment\\n Date\\n \\n \\n\",\"options\":{\"scrollX\":true,\"fixedColumns\":true,\"deferRender\":true,\"scrollY\":200,\"scroller\":true,\"columnDefs\":[{\"className\":\"dt-right\",\"targets\":6},{\"orderable\":false,\"targets\":0}],\"order\":[],\"autoWidth\":false,\"orderClasses\":false}},\"evals\":[],\"jsHooks\":[]} Structure of targets file for “Hello World” example In this example, targets file presents only two columns, which the first one are the different phrases used by the echo command-line and the second column it is the sample id. The id column is required, and each sample id should be unique.\ntargetspath \u003c- system.file(\"extdata/cwl/example/targets_example.txt\", package = \"systemPipeR\") showDF(read.delim(targetspath, comment.char = \"#\")) {\"x\":{\"filter\":\"none\",\"vertical\":false,\"extensions\":[\"FixedColumns\",\"Scroller\"],\"data\":[[\"1\",\"2\",\"3\"],[\"Hello World!\",\"Hello USA!\",\"Hello Bioconductor!\"],[\"M1\",\"M2\",\"M3\"]],\"container\":\"\\n \\n \\n \\n Message\\n SampleName\\n \\n \\n\",\"options\":{\"scrollX\":true,\"fixedColumns\":true,\"deferRender\":true,\"scrollY\":200,\"scroller\":true,\"order\":[],\"autoWidth\":false,\"orderClasses\":false,\"columnDefs\":[{\"orderable\":false,\"targets\":0}]}},\"evals\":[],\"jsHooks\":[]} Sample comparisons Sample comparisons are defined in the header lines of the targets file starting with ‘# \u003cCMP\u003e.’\ntargetspath \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") readLines(targetspath)[1:4] ## [1] \"# Project ID: Arabidopsis - Pseudomonas alternative splicing study (SRA: SRP010938; PMID: 24098335)\" ## [2] \"# The following line(s) allow to specify the contrasts needed for comparative analyses, such as DEG identification. All possible comparisons can be specified with 'CMPset: ALL'.\" ## [3] \"# \u003cCMP\u003e CMPset1: M1-A1, M1-V1, A1-V1, M6-A6, M6-V6, A6-V6, M12-A12, M12-V12, A12-V12\" ## [4] \"# \u003cCMP\u003e CMPset2: ALL\" The function readComp imports the comparison information and stores it in a list. Alternatively, readComp can obtain the comparison information from the corresponding SYSargsList step (see below). Note, these header lines are optional. They are mainly useful for controlling comparative analyses according to certain biological expectations, such as identifying differentially expressed genes in RNA-Seq experiments based on simple pair-wise comparisons.\nreadComp(file = targetspath, format = \"vector\", delim = \"-\") ## $CMPset1 ## [1] \"M1-A1\" \"M1-V1\" \"A1-V1\" \"M6-A6\" \"M6-V6\" \"A6-V6\" \"M12-A12\" ## [8] \"M12-V12\" \"A12-V12\" ## ## $CMPset2 ## [1] \"M1-A1\" \"M1-V1\" \"M1-M6\" \"M1-A6\" \"M1-V6\" \"M1-M12\" \"M1-A12\" ## [8] \"M1-V12\" \"A1-V1\" \"A1-M6\" \"A1-A6\" \"A1-V6\" \"A1-M12\" \"A1-A12\" ## [15] \"A1-V12\" \"V1-M6\" \"V1-A6\" \"V1-V6\" \"V1-M12\" \"V1-A12\" \"V1-V12\" ## [22] \"M6-A6\" \"M6-V6\" \"M6-M12\" \"M6-A12\" \"M6-V12\" \"A6-V6\" \"A6-M12\" ## [29] \"A6-A12\" \"A6-V12\" \"V6-M12\" \"V6-A12\" \"V6-V12\" \"M12-A12\" \"M12-V12\" ## [36] \"A12-V12\" Downstream targets files description After the step which required the initial targets file information, the downstream targets files are created automatically (see Figure 2). Each step that uses the previous step outfiles as an input, the new targets input will be managed internally by the workflow instances, establishing connectivity among the steps in the workflow. systemPipeR provides features to automatically and systematically build this connection, providing security that all the samples will be managed efficiently and reproducibly.\nFigure 2: *systemPipeR* automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. *`systemPipeR`* (C) manages this connectivity among the steps automatically for the users. Structure of the new parameters files The parameters and configuration required for running command-line software are provided by the widely used community standard Common Workflow Language (CWL) (Amstutz et al. 2016), which describes parameters analysis workflows in a generic and reproducible manner. For R-based workflow steps, param files are not required. For a complete overview of the CWL syntax, please see this section. Also, we have a dedicated section explain how to systemPipeR establish the connection between the CWL parameters files and the targets files. Please see here.\nReferences Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. https://doi.org/10.6084/m9.figshare.3115156.v2.\n ","categories":"","description":"","excerpt":" document.addEventListener(\"DOMContentLoaded\", …","ref":"/sp/spr/gettingstarted/","tags":"","title":"Getting Started"},{"body":"Full if (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeShiny\", dependencies=TRUE) This will install all required packages including suggested packages that are required by the core modules. Be aware, it will take quite some time if you are installing on Linux where only source installation is available. Windows and Mac binary installations will be much faster.\nMinimum To install the package, please use the BiocManager::install command:\nif (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeShiny\") By the minimum installation, all the 3 core modules are not installed. You can still start the app, and When you start the app and click on these modules, it will tell to enable these modules, what packages and command you need to run. Just follow the instructions. So, install as you need.\nMost recent To obtain the most recent updates immediately, one can install it directly from GitHub{blk} as follow:\nif (!requireNamespace(\"remotes\", quietly=TRUE)) install.packages(\"remotes\") remotes::install(\"systemPipeR/systemPipeShiny\", dependencies=TRUE) Similarly, remotes::install(\"systemPipeR/systemPipeShiny\") for the minimum develop version.\nLinux If you are on Linux, you may also need the following libraries before installing SPS. Different distributions may have different commands, but the following commands are examples for Ubuntu:\nsudo apt-get install -y libicu-dev sudo apt-get install -y pandoc sudo apt-get install -y zlib1g-dev sudo apt-get install -y libcurl4-openssl-dev sudo apt-get install -y libssl-dev sudo apt-get install -y make On other Linux distributions, the install commands may be slightly different.\n","categories":"","description":"","excerpt":"Full if (!requireNamespace(\"BiocManager\", quietly=TRUE)) …","ref":"/sps/install/","tags":"","title":"Installation"},{"body":" SPS tabs In SPS, tab is the basic component of a functionality unit. For example, all the Modules in SPS are complex tabs with many small sub-tabs, the Canvas is another independent tab providing image editing features and an user custom tab is also a SPS tab.\nFrom the developer’s view, all SPS tabs are Shiny Modules{blk}.\nTo understand how SPS tabs work, we will demonstrate with a SPS project. For demo purpose, we are using the /tmp folder but one should use a regular location instead of the temp in a real case.\nsuppressPackageStartupMessages(library(systemPipeShiny)) spsInit(app_path = tempdir(), project_name = \"tab_demo\", overwrite = TRUE, change_wd = FALSE) ## [SPS-INFO] 2021-04-19 23:16:52 Start to create a new SPS project ## [SPS-INFO] 2021-04-19 23:16:52 Create project under /tmp/RtmpjAYUc0/tab_demo ## [SPS-INFO] 2021-04-19 23:16:52 Now copy files ## [SPS-INFO] 2021-04-19 23:16:52 Create SPS database ## [SPS-INFO] 2021-04-19 23:16:52 Created SPS database method container ## [SPS-INFO] 2021-04-19 23:16:52 Creating SPS db... ## [SPS-DANGER] 2021-04-19 23:16:52 Done, Db created at '/tmp/RtmpjAYUc0/tab_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-19 23:16:52 Key md5 ecdf3312953a6bcdaea49e6d85954b80 ## [SPS-INFO] 2021-04-19 23:16:52 SPS project setup done! ## save project path (sps_dir \u003c- file.path(tempdir(), \"tab_demo\")) ## [1] \"/tmp/RtmpjAYUc0/tab_demo\" To reproduce code locally, run the following chunk instead.\nlibrary(systemPipeShiny) spsInit() sps_dir \u003c- normalizePath(\".\") Tab registration In SPS, all tabs are controlled by the config/tabs.csv file. To see what kind of tabs you have with current project. use the spsTabInfo function. It returns a tibble of current tab information.\nspsTabInfo(app_path = sps_dir) ## # A tibble: 11 x 8 ## tab_id display_label type type_sub image displayed tab_file_name plugin ## \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e ## 1 core_ab… About this App core \"\" \"\" 1 No file for … \"core\" ## 2 core_ca… Canvas core \"\" \"\" 1 No file for … \"core\" ## 3 core_we… Home core \"\" \"\" 1 No file for … \"core\" ## 4 core_ri… Internal use on… core \"\" \"\" 1 No file for … \"core\" ## 5 core_top Top push bars core \"\" \"\" 1 No file for … \"core\" ## 6 module_… Module Main Page core \"\" \"\" 1 No file for … \"core\" ## 7 wf Workflow module modu… \"\" \"\" 1 No file for … \"core\" ## 8 vs_rnas… RNAseq module modu… \"\" \"\" 1 No file for … \"core\" ## 9 vs_esq Quick ggplot mo… modu… \"\" \"\" 1 No file for … \"core\" ## 10 vs_main custom tabs mai… core \"\" \"\" 1 No file for … \"core\" ## 11 vs_exam… My custom plott… vs \"plot\" \"\" 1 tab_vs_examp… \"\" tab_id: A unique string ID display_label: for type is “core” or “module”, this is only some description, but for you own custom tabs, this value will be used as a display tab name on left sidebar on SPS UI. type: tab category, “core”, “module” and “vs” (visualization). type_sub: more specific category, current only “plot” (plotting) image: If this is an user custom tab, providing an image path will display the image in visualization main tab gallery. If it not provided, a warning will be given on app starts and an “No image” image will be used like the following: displayed: Internal use only tab_file_name: where the tab file is relative to the R folder. plugin: Internal use only Add a new custom tab SPS provides templates to help developers to create a small SPS tab that\n The main purpose is to generate some plots can be loaded into SPS framework easily can interact with other SPS tabs (components), like the Canvas tab. When you initiate a SPS project, an example custom tab is created for you already. You can find the tab file inside the R folder of the project root. When you start the app for the first time, you can easily find it from the left sidebar, or click on the “Custom tabs” to go to custom tab main tab.\n Example custom tab Simple template Under current SPS version, users are able to add custom tabs with the spsNewTab function. This function:\n creates the tab file. provides a nice template. Helps you to register tab information to tabs.csv spsNewTab(tab_id = \"vs_new\", tab_displayname = \"New tab demo\", app_path = sps_dir) ## [SPS-INFO] 2021-04-19 23:16:52 Write to file /tmp/RtmpjAYUc0/tab_demo/R/tab_vs_new.R ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created! ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c(\"vs_new\")` If you are running the code locally, and are using Rstudio, the tab file will be opened automatically for you.\nIn your global.R, add the new tab to confirm you want to load it, and then restart you app. Scroll down to the bottom, you should see:\n# add \"vs_new\" in `tabs` sps_app \u003c- sps( tabs = c(\"vs_example\", \"vs_new\"), server_expr = { msg(\"Custom expression runs -- Hello World\", \"GREETING\", \"green\") } ) Load new custom tabs By default, it uses the simple template, which contains the spsEzUI and spsEzServer functions. We have provided commented instructions on how to fill each argument.\nUI spsEzUI( desc = \"xxx\", tab_title = \"xxx\", plot_title = \"xxx\", plot_control = shiny::tagList( xxx ) ) The only augment new users need to take some time to learn is adding plot_control. Developers need to add some Shiny UI components to let users control how the plotting is done with interactive options. Basic use can be learned in 5 minutes on Shiny website{blk} and Shiny book{blk}\nServer spsEzServer( plot_code = { # data passed from data loading is a reactiveValues object, data stored in `mydata$data` plot_data \u003c- mydata$data # some validations, make sure users give you the right data format spsValidate({ stopifnot(inherits(plot_data, \"data.frame\")) # require a dataframe stopifnot(nrow(plot_data) \u003e 1) # has least one row if (!all(c(\"Sepal.Length\", \"Sepal.Width\") %in% colnames(plot_data)))# has two required columns stop(\"Require column 'Sepal.Length' and 'Sepal.Width'\") TRUE # give it a TRUE if all checks passed. }, verbose = FALSE # only show messages when fail ) # actual plot code ggplot2::ggplot(plot_data) + ggplot2::geom_point(ggplot2::aes(x = Sepal.Length, y = Sepal.Width)) + # grab user defined title from plot control by `input$+control_ID`, # no need to add `ns()` on server end. ggplot2::ggtitle(input$plot_title) }, other_server_code = {} ) For the server code, users only need to focus on the plotting code. The only very important thing developers need to remember is that the plotting data been passed to this function is stored in a reactiveValues{blk} object and it is called mydata$data. Usually we assign it to a new value so it can be used easily downstream, like plot_data \u003c- mydata$data.\nSome validation is recommended before reaching the plotting code. You would never know what kind of dataset users upload. It is always good to check if users' uploads meet the requirements. In SPS you can use the spsValidate function or use Shiny’s default validate{blk} function (spsValidate is discussed in developer tools).\nFull template For some developers who already has experience with Shiny, and would like to make more complex customization, using the full template enables you to change every detail on the new tab. Simply add the template = \"full\" argument.\nspsNewTab( tab_id = \"vs_new_full\", tab_displayname = \"New tab demo\", template = \"full\", app_path = sps_dir) ## [SPS-INFO] 2021-04-19 23:16:52 Write to file /tmp/RtmpjAYUc0/tab_demo/R/tab_vs_new_full.R ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created! ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c(\"vs_new_full\")` You can see the full template is a lot longer than the simple template:\nsimple_len \u003c- R.utils::countLines(file.path(sps_dir, \"R\", \"tab_vs_new.R\")) full_len \u003c- R.utils::countLines(file.path(sps_dir, \"R\", \"tab_vs_new_full.R\")) spsinfo(glue::glue(\"Simple template has {simple_len} lines\"), TRUE) ## [SPS-INFO] 2021-04-19 23:16:52 Simple template has 66 lines spsinfo(glue::glue(\"Full template has {full_len} lines\"), TRUE) ## [SPS-INFO] 2021-04-19 23:16:52 Full template has 281 lines Tab registeration In your global.R, scroll down to the bottom, you should see:\nsps_app \u003c- sps( tabs = c(\"vs_example\"), server_expr = { msg(\"Custom expression runs -- Hello World\", \"GREETING\", \"green\") } ) This is the SPS main function. You can load/unload custom tabs by providing tab IDs in tabs argument, like c(\"tab1\", \"tab2). Open config/tabs.csv or use spsTabInfo() to see what tabs IDs can be load and other tab information. Essential framework tabs (core) and built-in modules (modules) are loaded automatically. However, you can choose to unload core and modules tabs, and overwrite core tabs by changing some SPS options.\nTab naming Once a tab ID is provided in the sps function tabs argument, when the function runs, it is looking for tab information inside this tabs.csv, like the display name and tab image. Then it will search for the UI and server function in the enviornment. It is expecting a UI function named tab_id + UI -\u003e tab_idUI and the server tab_id + Server -\u003e tab_idServer. If you did not use the spsNewTab function to generate the new tab, make sure you name your tab UI and server in this pattern.\n","categories":"","description":"","excerpt":" SPS tabs In SPS, tab is the basic component of a functionality unit. …","ref":"/sps/adv_features/tabs/","tags":"","title":"Manage tabs"},{"body":" As a framework, default SPS tabs like the welcome tab, the module main tab, the visualization main tab, the Canvas tab and the About tab can be user-defined.\n Default UI and tabs you can overwrite Overwrite SPS default tabs To start create a SPS project:\nsuppressPackageStartupMessages(library(systemPipeShiny)) app_path \u003c- \".\" spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) ## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:11 Key md5 6886f6bf17229ffb646102abad92fa31 ## [SPS-INFO] 2021-04-22 15:45:11 SPS project setup done! use the function spsCoreTabReplace to create a template of which tab you would like to overwrite. Here we use the “Welcome” tab as example to demo how to write your own welcome tab.\nspsCoreTabReplace(replace_tab = \"welcome\") ## [SUCCESS] 2021-04-22 15:45:11 File /tmp/Rtmp2YLDmY/overwrite/R/tab_core_welcome.R created If you are using Rstudio the template will be opened for you like following:\n########################## Overwrite the welcome tab ########################### ## UI core_welcomeUI \u003c- function(id){ ns \u003c- NS(id) tagList( # add your UI code below ) } ## server core_welcomeServer \u003c- function(id, shared){ module \u003c- function(input, output, session, shared){ ns \u003c- session$ns # add your server code below } moduleServer(id, module) } Then you can write your own UI and server for this tab, for example, we can add some UI to the tab:\ncore_welcomeUI \u003c- function(id){ ns \u003c- NS(id) tagList( # add your UI code below h2(\"This is my welcome page\"), h4(\"some UI\"), sliderInput(ns(\"num\"), \"Select a number\", 0, 10, 5) ) } When you restart the app, you should see your custom Welcome tab:\n Custom Welcome tab UI ","categories":"","description":"","excerpt":" As a framework, default SPS tabs like the welcome tab, the module …","ref":"/sps/adv_features/overwritetabs/","tags":"","title":"Overwrite tabs"},{"body":"RNA-Seq Module This is a module which takes a raw count table to do normalization, Differential gene expression (DEG) analysis, and finally helps users to generate different plots to visualize the results.\nPrepare metadata and count table To start, we require two files, the metadata file (targets) and a raw count table (Fig. 5).\n Figure 5 RNAseq\n This is the RNAseq module UI when you first click it. All sub-tabs are disbled at the beginning. Other tabs will enabled as you proceed with different options. First, we need a metadata file to tell SPS what samples and conditions to use. Here, we use the metadata file from SPR, which is also known as “targets” file. If you are not familiar with the targets file, we suggest to use the workflow module step 2 to practice creating and checking the format. You can also use the example to see how it looks like. The loaded targets table is display here. You can use the box below each column name to filter what samples to include/exclude. Only the “SampleName” and “Factor” columns are used, other columns are ignored. SampleName should be a unique character string without space for each row. Factor is the experiment design factors, or conditions, or treatments. If you want to DEG analysis, DEG comparison groups are defined in the targets file header. The header will be parsed into comparison groups which contain individual comparisons. If the parsed comparison is not what you want, edit the header lines and reupload. If everything is expected, confirm to use this table. You should see the progress timeline of step 1 becomes green if your targets and header pass the format checking. (Not on figure) Similarly, use example or upload a count table and confirm to use it. Note: For the count table, the first column will be used as gene names. Other column names will be treated as sample names, and values in these columns are treated as raw counts. Make sure columns except the first one are numeric, and replace NA with 0.\nUpon successfully confirm targets and count table, you should see the “Normalize Data” subtab is enabled. You can click on the top navigation or click the pop-up for the next step.\nProcess raw count If this UI is displayed, that means your targets and count table are accepted by SPS (Fig 6). On this sub-tab, you can choose:\n Transform your count data with “raw”, “rlog” or “VST” and visualize the results in other sub-tabs. Do DEG analysis. These two options are independent.\n Figure 6 RNAseq Normalization\n At step 1 panel, choose how SPS can help you, count transformation or DEG analysis. The former will jump you to step 2, latter will jump to step 3. There are many options. If you are not clear, hover your mouse on the option, and some tips will show up. To start data transformation or DEG analysis. A gallery of different plot options will show up when the data process is done. When the data process is done, you can download results from the right side panel. Check all items you want and SPS will help you to zip it into one file to download. If at least one item is checked, downloading is enabled. Progress timeline will also change upon successful data process. Different visualization options will be enabled depending on the data process options. Plot options SPS RNAseq module provides 6 different plot options to cluster transformed count table.\n Figure 6 RNAseq plots\n Change plot options to customize your plots. Most plots are Plotly plots, which means you can interact with these plots, like hiding/show groups, zoom in/out, etc. All SPS plots are resizable. Drag the bottom-right corner icon to resize your plot. Click “To canvas” to take a screenshot of current plot and edit it in SPS Canvas tab. Or clicking the down-arrow button to directly save current plot to a png or jpg. DEG report This is a special sub-tab designed to filter and visualize DEG results. This sub-tab can be accessed once the DEG is calculated on the “Normalize Data” sub-tab.\n Figure 7 RNAseq DEG\n DEG summary plot. You can view what are the DEG results across different comparision groups. Switch to view a ggplot friendly table. Different from the table you could download from “Normalize Data” subtab, this DEG table is rearranged so you can easily make a ggplot from it. You can change the filter settings here, so DEGs will be re-filtered and you do not need to go back to “Normalize Data” subtab to recalculate DEG. DEG plotting options. Choose from a volcano plot, an upset plot (intersection), a MA plot or a heatmap. Interact with other bioconductor packages. Locally If you are familiar with R and want to continue other analysis after these, simple stop SPS:\n After count transformation, there is a spsRNA_trans object stored in your R environment. raw method gives you a normalized count table. Other two methods give you a DESeq2 class object. You can use it for other analysis. After DEG analysis, SPS stores a global object called spsDEG. It is a summerizedExperiment object which has all individual tables from all DEG comparisons. You can use it for other downstream analysis. Remotely If you are using SPS from a remote server, you can choose to download results from “Normalize Data” sub-tab. Choose results in tabular format or summerizedExperiment format which is saved in a .rds file.\n","categories":"","description":"","excerpt":"RNA-Seq Module This is a module which takes a raw count table to do …","ref":"/sps/modules/rnaseq/","tags":"","title":"RNAseq"},{"body":"How to create a new Workflow Template SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.\nInstallation To install SPRthis using from BiocManager the following code:\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) { install.packages(\"BiocManager\") BiocManager::install(\"dcassol/SPRthis\") Quick start to using to SPRthis ## Load the package library(SPRthis) ## create Package sprthis(wfName=\"SPRtest\", analysis=\"SPRtest\", path=tempdir()) ## ✓ Setting active project to '/tmp/RtmpunjAF9' ## ✓ Creating 'R/' ## ✓ Writing 'DESCRIPTION' ## Package: SPRtest ## Title: SPRtest ## Version: 0.9.0 ## Authors@R (parsed): ## * First Last \u003cfirst.last@example.com\u003e [aut, cre] (YOUR-ORCID-ID) ## Description: This package provides a pre-configured workflow and reporting ## template for SPRtest. ## License: Artistic-2.0 ## URL: https://github.com/systemPipeR/SPRtest ## Imports: ## systemPipeR (\u003e= 1.25.0) ## Suggests: ## BiocStyle, ## knitr, ## rmarkdown ## VignetteBuilder: ## knitr ## biocViews: Infrastructure, ... ## Encoding: UTF-8 ## LazyData: true ## Roxygen: list(markdown = TRUE) ## RoxygenNote: 7.1.1 ## SystemRequirements: SPRtest can be used to run external command-line ## software, but the corresponding tool needs to be installed on a ## system. ## ✓ Writing 'NAMESPACE' ## ✓ Setting active project to '\u003cno active project\u003e' ## [1] \"/tmp/RtmpunjAF9\" SPRtest/ ├── DESCRIPTION ├── NAMESPACE ├── README.md ├── SPRtest.Rproj ├── .gitignore ├── .Rbuildignore ├── .Rproj.user/ ├── R/ │ ├── functions.R ├── vignettes │ ├── bibtex.bib │ ├── SPRtest.Rmd └── inst ├── rmarkdown │ └── templates │ └── SPRtest │ ├── template.yml │ └── skeleton │ ├── batchtools.slurm.tmpl │ ├── .batchtools.conf.R │ ├── bibtex.bib │ ├── NEWS │ ├── SPRconfig.yml │ ├── skeleton.Rmd │ ├── targetsPE.txt │ ├── data/ │ ├── param/ │ └── results/ Help functions to create the package Create the webiste for the package with pkgdown Edit the _pkgdown.yml file and run:\npkgdown::build_site() Documentation with roxygen2 roxygen2::roxygenise() Testing the code with testthat To test the code, you can run\ndevtools::test() Update R Markdown template on skeleton path \u003c- file.path(\"vignettes/SPRtest.Rmd\") skeleton_update(path) Package available to genWorkenvir Function After creating the new repository on GitHub systemPipeR Organization, please follow:\n Rules: The Workflow Template need to be available under systemPipeR Organization; The repository needs to be public; About setting: Description: keywords in the description are required: “Workflow Template”; Topics: we expected “systempiper” and “release” or “development” words on Topics section; Branch name: To make simple, please name the branch as “master”. Check availability of workflow templates A collection of workflow templates are available, and it is possible to browse the current availability, as follows:\nsystemPipeRdata::availableWF(github = TRUE) ## $systemPipeRdata ## [1] \"chipseq\" \"new\" \"riboseq\" \"rnaseq\" \"varseq\" ## ## $github ## workflow branches version ## 1 systemPipeR/SPchipseq master release ## 2 systemPipeR/SPriboseq master release ## 3 systemPipeR/SPrnaseq cluster, master, singleMachine release ## 4 systemPipeR/SPvarseq master release ## 5 systemPipeR/SPclipseq master devel ## 6 systemPipeR/SPdenovo master devel ## 7 systemPipeR/SPmetatrans master devel ## 8 systemPipeR/SPmethylseq master devel ## 9 systemPipeR/SPmirnaseq master devel ## html description ## 1 https://github.com/systemPipeR/SPchipseq Workflow Template ## 2 https://github.com/systemPipeR/SPriboseq Workflow Template ## 3 https://github.com/systemPipeR/SPrnaseq Workflow Template ## 4 https://github.com/systemPipeR/SPvarseq Workflow Template ## 5 https://github.com/systemPipeR/SPclipseq Workflow Template ## 6 https://github.com/systemPipeR/SPdenovo Workflow Template ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template ## 9 https://github.com/systemPipeR/SPmirnaseq Workflow Template This function returns the list of workflow templates available within the package and systemPipeR Project Organization on GitHub. Each one listed template can be created as described above.\n","categories":"","description":"","excerpt":"How to create a new Workflow Template SPRthis package expand usethis …","ref":"/sp/sprdata/newwf/","tags":"","title":"Rules to create a new Workflow Template"},{"body":"{spsComps} has some useful functions for exception catch, expression validation, and more. Even though we say they are Shiny server functions, but in fact most of them can be run without a Shiny server. We have designed the functions to detect whether there is a Shiny server, if not, they will work only in R console as well.\nload package library(spsComps) ## Loading required package: shiny ## Loading required package: spsUtil library(magrittr) Server components shinyCatch basic The shinyCatch function is useful to capture exception. What we mean exception can be message, warning or error. For example\nshinyCatch({ message(\"This is a message\") warning(\"This is a warning\") stop(\"This is an error\") }) ## [SPS-INFO] 2021-04-14 17:31:28 This is a message ## ## [SPS-WARNING] 2021-04-14 17:31:28 This is a warning ## [SPS-ERROR] 2021-04-14 17:31:28 This is an error ## NULL You can see all 3 levels are captured inside the [SPS-XX] log on your console. If you run this in your Shiny app, a pop-up message with the corresponding log level message will be displayed in in app, like following:\nSo the message on both UI and console is called dual-end logging in SPS.\nServer only Of course, if you do not want users to see the message, you can hide it by shiny = FALSE, but the message will be still logged on R console. Run the following on your own computer and watch the difference.\nlibrary(shiny) ui \u003c- fluidPage( spsDepend(\"toastr\") ) server \u003c- function(input, output, session) { shinyCatch({ stop(\"This is an error\") }, shiny = FALSE) } shinyApp(ui, server) get return shinyCatch is able to return you values if your expression has any. Imagine we have a function addNum that gives message, warning or error depeend on the input.\naddNum \u003c- function(num){ if (num \u003e 0) {message(num)} else if (num == 0) {warning(\"Num is 0\")} else {stop(\"less than 0\")} return(num + num) } value_a \u003c- shinyCatch({ addNum(1) }) ## [SPS-INFO] 2021-04-14 17:31:28 1 value_a ## [1] 2 value_b \u003c- shinyCatch({ addNum(0) }) ## [SPS-WARNING] 2021-04-14 17:31:28 Num is 0 value_b ## [1] 0 value_c \u003c- shinyCatch({ addNum(-1) }) ## [SPS-ERROR] 2021-04-14 17:31:28 less than 0 value_c ## NULL You can see at message and warning level, the expected value returned, and at error level, the return is NULL. So the following code value_c still runs and is not blocked by the error occurred in shinyCatch.\nBlocking level More often, if there is an error, we do want take the log in R console, inform the Shinyapp user and then stop the following code. In this case, we need to specify the blocking_level. So, default is \"none\", do not block and return NULL if there is an error, and you can choose \"error\", \"warning\" or \"message\".\n error: block downstream if the first error detected in shinyCatch warning: block downstream if the first error or warning detected in shinyCatch message: block downstream if the first error, warning or message detected in shinyCatch You can see the stringency becomes tighter: message \u003e warning \u003e error\nBlocking code will generate error, in order to have the Rmd rendered, we wrap the expression in try \ntry({ shinyCatch({ stop(\"error level is the most commonly used level\") }, blocking_level = \"error\") print(\"This will not be evaluated\") }) ## [SPS-ERROR] 2021-04-14 17:31:28 error level is the most commonly used level ## Error : try({ shinyCatch({ message(\"error level is the most commonly used level\") }, blocking_level = \"message\") print(\"This will not be evaluated either\") }) ## [SPS-INFO] 2021-04-14 17:31:28 error level is the most commonly used level ## ## Error : You can see the following print in both cases are not got evaluated.\nBlock reative The most useful case for shinyCatch is to use it in the Shiny reactive context. Most errors in shiny::reactive, shiny::observer, shiny::observeEvent, or shiny::renderXXX series function will crash the app. With shinyCatch, it will not. It “dual-logs” the error and stop downstream code.\nThe following example use shiny::reactiveConsole() to mock a Shiny server session\nshiny::reactiveConsole(TRUE) y \u003c- observe({ stop(\"an error from a function\") print(\"some other process\") }) ## Warning: Error in \u003cobserver\u003e: The value of x is ## 38: stop ## 37: \u003cobserver\u003e [#2] ## 35: contextFunc ## 34: env$runWith ## 27: ctx$run ## 26: run ## 7: flushCallback ## 6: FUN ## 5: lapply ## 4: ctx$executeFlushCallbacks ## 3: .getReactiveEnvironment()$flush ## 2: flushReact ## 1: \u003cAnonymous\u003e It crashes the app. However, if you use shinyCatch\nshiny::reactiveConsole(TRUE) y \u003c- observe({ shinyCatch({ stop(\"an error from a function\") }, blocking_level = \"error\") print(\"some other process\") }) ## [SPS-ERROR] 2021-03-02 22:13:05 an error from a function It only logs the error and prevent the downstream print to run. Now try following real Shiny apps and watch the difference:\n# with shinyCatch library(shiny) server \u003c- function(input, output, session) { observe({ shinyCatch({ stop(\"an error from a function\") }, blocking_level = \"error\") print(\"some other process\") }) } shinyApp(fluidPage(spsDepend(\"toastr\")), server) # without shinyCatch library(shiny) server \u003c- function(input, output, session) { observe({ stop(\"an error from a function\") print(\"some other process\") }) } shinyApp(fluidPage(spsDepend(\"toastr\")), server) spsValidate In data analysis, it is important we do some validations before the downstream process, like make a plot. It is epecially the case in Shiny apps. We cannot predict what the user inputs will be, like what kind of data they will use. Similar to shinyCatch, spsValidate is able to catch exceptions but more useful to handle validations. In addtion to shinyCatch functionalities, it will give users a success message if the expression goes through and return TRUE (shinyCatch returns the final expression value).\nshiny::reactiveConsole(TRUE) x \u003c- reactiveVal(10) y \u003c- observe({ spsValidate({ # have multiple validations in one expression if (x() == 1) stop(\"cannot be 1\") if (x() == 0) stop(\"cannot be 0\") if (x() \u003c 0) stop(\"less than 0\") }) message(\"The value of x is \", x()) }) x(0) x(-10) ## The value of x is 10 ## [ ERROR] 2021-03-02 22:36:16 cannot be 0 ## [ ERROR] 2021-03-02 22:36:16 less than 0 Try this real Shiny app:\nlibrary(shiny) ui \u003c- fluidPage( spsDepend(\"toastr\"), shiny::sliderInput( \"num\", \"change number\", min = -1, max = 2, value = 2, step = 1 ) ) server \u003c- function(input, output, session) { x \u003c- reactive(as.numeric(input$num)) y \u003c- observe({ spsValidate(vd_name = \"check numbers\", verbose = TRUE, { # have multiple validations in one expression if (x() == 1) stop(\"cannot be 1\") if (x() == 0) stop(\"cannot be 0\") if (x() \u003c 0) stop(\"less than 0\") }) message(\"The value of x is \", x()) }) } shinyApp(ui, server) You should see the success message like this:\nshinyCheckPkg Sometimes we want the app behave differently if users have certain packages installed. For example, if some packages are installed, we open up additional tabs on UI to allow more features. This can be done with the shinyCheckPkg function. This function has to run inside Shiny server, an alternative version to use without Shiny is from the spsUtil package, spsUtil::checkNameSpace\nUse it in Shiny server, specify the packages you want to check by different sources, like CRAN, Bioconductor, or github.\nshinyCheckPkg(session, cran_pkg = c(\"pkg1\", \"pkg2\"), bioc_pkg = \"bioxxx\", github = \"user1/pkg1\") It will return TRUE if all packages are installed, otherwise FALSE\nNow try this real example. We check if the ggplot99 package is installed, if yes we make a plot. It also combines the spsValidate function. You can have a better idea how these functions work.\nlibrary(shiny) ui \u003c- fluidPage( tags$label('Check if package \"pkg1\", \"pkg2\", \"bioxxx\", github package \"user1/pkg1\" are installed'), br(), actionButton(\"check_random_pkg\", \"check random_pkg\"), br(), spsHr(), tags$label('We can combine `spsValidate` to block server code to prevent crash if some packages are not installed.'), br(), tags$label('If \"shiny\" is installed, make a plot.'), br(), actionButton(\"check_shiny\", \"check shiny\"), br(), tags$label('If \"ggplot99\" is installed, make a plot.'), br(), actionButton(\"check_gg99\", \"check ggplot99\"), br(), plotOutput(\"plot_pkg\") ) server \u003c- function(input, output, session) { observeEvent(input$check_random_pkg, { shinyCheckPkg(session, cran_pkg = c(\"pkg1\", \"pkg2\"), bioc_pkg = \"bioxxx\", github = \"user1/pkg1\") }) observeEvent(input$check_shiny, { spsValidate(verbose = FALSE, { if(!shinyCheckPkg(session, cran_pkg = c(\"shiny\"))) stop(\"Install packages\") }) output$plot_pkg \u003c- renderPlot(plot(1)) }) observeEvent(input$check_gg99, { spsValidate({ if(!shinyCheckPkg(session, cran_pkg = c(\"ggplot99\"))) stop(\"Install packages\") }) output$plot_pkg \u003c- renderPlot(plot(99)) }) } shinyApp(ui, server) You should see something like this if there is any missing package:\n","categories":"","description":"","excerpt":"{spsComps} has some useful functions for exception catch, expression …","ref":"/sps/dev/spscomps/server/","tags":"","title":"Server functions"},{"body":"","categories":"","description":"","excerpt":"","ref":"/sp/spt/","tags":"","title":"systemPipeTools"},{"body":"The {drawer} package offers an interactive image editing tool that can be added as part of the HTML in Shiny, R markdown or any type of HTML document. Often times, plots, photos are embedded in the web application/file. {drawer} can take screenshots of these image-like elements, or any part of the HTML document and send to an image editing space called “canvas” to allow users immediately edit the screenshot(s) within the same document. Users can quickly combine, compare different screenshots, upload their own images and maybe make a scientific figure.\nFeatures {drawer} is built with 99% javascript + HTML + CSS, there is no need to have a Shiny server or any other types of server in the back-end. That’s why you can use it in any HTML document. All you need is a modern web browser, like Chrome or Firefox (IE will not work). Shiny and R markdown compatible. Screenshot any element in the page and edit in canvas or download it png or jpg Drag and upload your own images. Drawer UI screenshot Installation Read the developer tools main page, not repeating here.\nFunctions reference manual Please read the reference manuals for details of every function.\nSome video demos Basic looking and options Capture Use the capture buttons to capture plots, images and other elements in the same document.\n Add text Upload your own images You can upload one or multiple your own images at once.\n Browser support {drawer} only works on recent browsers versions, like Chrome, latest Edge, Firefox. IE is not supported (IE is not my friend). Also, some browser privacy extensions will block javascript and HTML5 canvas fingerprint. This will cause the screenshot to be blank. {drawer} does not collect any user information from you.\n","categories":"","description":"","excerpt":"The {drawer} package offers an interactive image editing tool that can …","ref":"/sps/dev/drawer/","tags":"","title":"drawer"},{"body":"\n{drawer} is compatible with R markdown. Instructions and details are all included in these Rmd demos:\n Demo Source code With instructions link Pure drawer link ","categories":"","description":"","excerpt":"\n{drawer} is compatible with R markdown. Instructions and details are …","ref":"/sps/dev/drawer/rmd/","tags":"","title":"drawer in Rmarkdown"},{"body":" document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Project initialization To create a Workflow within systemPipeR, we can start by defining an empty container and checking the directory structure:\nsal \u003c- SPRproject(projPath = tempdir()) ## Creating directory: /tmp/RtmpzxxPO5/data ## Creating directory: /tmp/RtmpzxxPO5/param ## Creating directory: /tmp/RtmpzxxPO5/results ## Creating directory '/tmp/RtmpzxxPO5/.SPRproject' ## Creating file '/tmp/RtmpzxxPO5/.SPRproject/SYSargsList.yml' ## Your current working directory is different from the directory chosen for the Project Workflow. ## For accurate location of the files and running the Workflow, please set the working directory to ## 'setwd(/tmp/RtmpzxxPO5)' Internally, SPRproject function will create a hidden folder called .SPRproject, by default, to store all the log files. A YAML file, here called SYSargsList.yml, has been created, which initially contains the basic location of the project structure; however, every time the workflow object sal is updated in R, the new information will also be store in this flat-file database for easy recovery. If you desire different names for the logs folder and the YAML file, these can be modified as follows:\nsal \u003c- SPRproject(logs.dir = \".SPRproject\", sys.file = \".SPRproject/SYSargsList.yml\") Also, this function will check and/or create the basic folder structure if missing, which means data, param, and results folder, as described here. If the user wants to use a different names for these directories, can be specified as follows:\nsal \u003c- SPRproject(data = \"data\", param = \"param\", results = \"results\") It is possible to separate all the R objects created within the workflow analysis from the current environment. SPRproject function provides the option to create a new environment, and in this way, it is not overwriting any object you may want to have at your current section.\nsal \u003c- SPRproject(envir = new.env()) In this stage, the object sal is a empty container, except for the project information. The project information can be accessed by the projectInfo method:\nsal ## Instance of 'SYSargsList': ## No workflow steps added projectInfo(sal) ## $project ## [1] \"/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr\" ## ## $data ## [1] \"data\" ## ## $param ## [1] \"param\" ## ## $results ## [1] \"results\" ## ## $logsDir ## [1] \".SPRproject\" ## ## $sysargslist ## [1] \".SPRproject/SYSargsList.yml\" Also, the length function will return how many steps this workflow contains and in this case it is empty, as follow:\nlength(sal) ## [1] 0 Workflow Design systemPipeR workflows can be designed and built from start to finish with a single command, importing from an R Markdown file or stepwise in interactive mode from the R console. In the next section, we will demonstrate how to build the workflow in an interactive mode, and in the following section, we will show how to build from a file.\nNew workflows are constructed, or existing ones modified, by connecting each step via appendStep method. Each SYSargsList instance contains instructions needed for processing a set of input files with a specific command-line or R software, as well as the paths to the corresponding outfiles generated by a particular tool/step.\nTo build R code based step, the constructor function Linewise is used. For more details about this S4 class container, see here.\nBuild workflow interactive This tutorial shows a very simple example for describing and explaining all main features available within systemPipeR to design, build, manage, run, and visualize the workflow. In summary, we are exporting a dataset to multiple files, compressing and decompressing each one of the files, and importing to R, and finally performing a statistical analysis.\nIn the previous section, we initialize the project by building the sal object. Until this moment, the container has no steps:\nsal ## Instance of 'SYSargsList': ## No workflow steps added Next, we need to populate the object created with the first step in the workflow.\nAdding the first step The first step is R code based, and we are splitting the iris dataset by Species and for each Species will be saved on file. Please note that this code will not be executed now; it is just store in the container for further execution.\nThis constructor function requires the step_name and the R-based code under the code argument. The R code should be enclosed by braces ({}) and separated by a new line.\nappendStep(sal) \u003c- LineWise(code = { mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) }, step_name = \"export_iris\") For a brief overview of the workflow, we can check the object as follows:\nsal ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## Also, for printing and double-check the R code in the step, we can use the codeLine method:\ncodeLine(sal) ## export_iris ## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) Adding more steps Next, an example of how to compress the exported files using gzip command-line.\nThe constructor function creates an SYSargsList S4 class object using data from three input files:\n- CWL command-line specification file (`wf_file` argument); - Input variables (`input_file` argument); - Targets file (`targets` argument). In CWL, files with the extension .cwl define the parameters of a chosen command-line step or workflow, while files with the extension .yml define the input variables of command-line steps.\nThe targets file is optional for workflow steps lacking input files. The connection between input variables and the targets file is defined under the inputvars argument. It is required a named vector, where each element name needs to match with column names in the targets file, and the value must match the names of the input variables defined in the *.yml files (see Figure ??).\nA detailed description of the dynamic between input variables and targets files can be found here. In addition, the CWL syntax overview can be found here.\nBesides all the data form targets, wf_file, input_file and dir_path arguments, SYSargsList constructor function options include:\n step_name: a unique name for the step. This is not mandatory; however, it is highly recommended. If no name is provided, a default step_x, where x reflects the step index, will be added. dir: this option allows creating an exclusive subdirectory for the step in the workflow. All the outfiles and log files for this particular step will be generated in the respective folders. dependency: after the first step, all the additional steps appended to the workflow require the information of the dependency tree. The appendStep\u003c- method is used to append a new step in the workflow.\ntargetspath \u003c- system.file(\"extdata/cwl/gunzip\", \"targets_gunzip.txt\", package = \"systemPipeR\") appendStep(sal) \u003c- SYSargsList(step_name = \"gzip\", targets = targetspath, dir = TRUE, wf_file = \"gunzip/workflow_gzip.cwl\", input_file = \"gunzip/gzip.yml\", dir_path = system.file(\"extdata/cwl\", package = \"systemPipeR\"), inputvars = c(FileName = \"_FILE_PATH_\", SampleName = \"_SampleName_\"), dependency = \"export_iris\") Note: This will not work if the gzip is not available on your system (installed and exported to PATH) and may only work on Windows systems using PowerShell.\nFor a overview of the workflow, we can check the object as follows:\nsal ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gzip ## cmdlist: 3 | Pending: 3 ## Note that we have two steps, and it is expected three files from the second step. Also, the workflow status is Pending, which means the workflow object is rendered in R; however, we did not execute the workflow yet. In addition to this summary, it can be observed this step has three command lines.\nFor more details about the command-line rendered for each target file, it can be checked as follows:\ncmdlist(sal, step = \"gzip\") ## $gzip ## $gzip$SE ## $gzip$SE$gzip ## [1] \"gzip -c results/setosa.csv \u003e results/SE.csv.gz\" ## ## ## $gzip$VE ## $gzip$VE$gzip ## [1] \"gzip -c results/versicolor.csv \u003e results/VE.csv.gz\" ## ## ## $gzip$VI ## $gzip$VI$gzip ## [1] \"gzip -c results/virginica.csv \u003e results/VI.csv.gz\" Using the outfiles for the next step For building this step, all the previous procedures are being used to append the next step. However, here, we can observe power features that build the connectivity between steps in the workflow.\nIn this example, we would like to use the outfiles from gzip Step, as input from the next step, which is the gunzip. In this case, let’s look at the outfiles from the first step:\noutfiles(sal) ## $export_iris ## DataFrame with 0 rows and 0 columns ## ## $gzip ## DataFrame with 3 rows and 1 column ## gzip_file ## \u003ccharacter\u003e ## 1 results/SE.csv.gz ## 2 results/VE.csv.gz ## 3 results/VI.csv.gz The column we want to use is “gzip_file.” For the argument targets in the SYSargsList function, it should provide the name of the correspondent step in the Workflow and which outfiles you would like to be incorporated in the next step. The argument inputvars allows the connectivity between outfiles and the new targets file. Here, the name of the previous outfiles should be provided it. Please note that all outfiles column names must be unique.\nIt is possible to keep all the original columns from the targets files or remove some columns for a clean targets file. The argument rm_targets_col provides this flexibility, where it is possible to specify the names of the columns that should be removed. If no names are passing here, the new columns will be appended.\nappendStep(sal) \u003c- SYSargsList(step_name = \"gunzip\", targets = \"gzip\", dir = TRUE, wf_file = \"gunzip/workflow_gunzip.cwl\", input_file = \"gunzip/gunzip.yml\", dir_path = system.file(\"extdata/cwl\", package = \"systemPipeR\"), inputvars = c(gzip_file = \"_FILE_PATH_\", SampleName = \"_SampleName_\"), rm_targets_col = \"FileName\", dependency = \"gzip\") We can check the targets automatically create for this step, based on the previous outfiles:\ntargetsWF(sal[3]) ## $gunzip ## DataFrame with 3 rows and 2 columns ## gzip_file SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/SE.csv.gz SE ## 2 results/VE.csv.gz VE ## 3 results/VI.csv.gz VI We can also check all the expected outfiles for this particular step, as follows:\noutfiles(sal[3]) ## $gunzip ## DataFrame with 3 rows and 1 column ## gunzip_file ## \u003ccharacter\u003e ## 1 results/SE.csv ## 2 results/VE.csv ## 3 results/VI.csv Now, we can observe that the third step has been added and contains one substep.\nsal ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gzip ## cmdlist: 3 | Pending: 3 ## 3. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 3.1. gunzip ## cmdlist: 3 | Pending: 3 ## In addition, we can access all the command lines for each one of the substeps.\ncmdlist(sal[\"gzip\"], targets = 1) ## $gzip ## $gzip$SE ## $gzip$SE$gzip ## [1] \"gzip -c results/setosa.csv \u003e results/SE.csv.gz\" Getting data from a workflow instance The final step in this simple workflow is an R code step. For that, we are using the LineWise constructor function as demonstrated above.\nOne interesting feature showed here is the getColumn method that allows extracting the information for a workflow instance. Those files can be used in an R code, as demonstrated below.\ngetColumn(sal, step = \"gunzip\", \"outfiles\") ## SE VE VI ## \"results/SE.csv\" \"results/VE.csv\" \"results/VI.csv\" appendStep(sal) \u003c- LineWise(code = { df \u003c- lapply(getColumn(sal, step = \"gunzip\", \"outfiles\"), function(x) read.delim(x, sep = \",\")[-1]) df \u003c- do.call(rbind, df) stats \u003c- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], 2, sd))) stats$species \u003c- rownames(stats) plot \u003c- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + ggplot2::geom_bar(stat = \"identity\", color = \"black\", position = ggplot2::position_dodge()) + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width = 0.2, position = ggplot2::position_dodge(0.9)) }, step_name = \"iris_stats\", dependency = \"gzip\") Build workflow from a {R Markdown} The precisely same workflow can be created by importing the steps from an R Markdown file. As demonstrated above, it is required to initialize the project with SPRproject function.\nimportWF function will scan and import all the R chunk from the R Markdown file and build all the workflow instances. Then, each R chuck in the file will be converted in a workflow step.\nsal_rmd \u003c- SPRproject(logs.dir = \".SPRproject_rmd\") ## Creating directory '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd' ## Creating file '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd/SYSargsList.yml' sal_rmd \u003c- importWF(sal_rmd, file_path = system.file(\"extdata\", \"spr_simple_wf.Rmd\", package = \"systemPipeR\")) ## Reading Rmd file ## ## ---- Actions ---- ## Checking chunk SPR option ## Ignore non-SPR chunks: 17 ## Checking chunk eval values ## Resolve step names ## Check duplicated step names ## Checking chunk dependencies ## Use the previous step as dependency for steps without 'spr.dep' options: 27 ## Parse chunk code ## ---- Succes! Create output ---- ## Now importing step 'export_iris' ## Now importing step 'gzip' ## Now importing step 'gunzip' ## Now importing step 'stats' Let’s explore the workflow to check the steps:\nstepsWF(sal_rmd) ## $export_iris ## Instance of 'LineWise' ## Code Chunk length: 1 ## ## $gzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 3 (SE...VI), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 3, output: 3 ## cmdlist: 3 ## Sub Steps: ## 1. gzip (rendered: TRUE) ## ## ## ## $gunzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 3 (SE...VI), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 3, output: 3 ## cmdlist: 3 ## Sub Steps: ## 1. gunzip (rendered: TRUE) ## ## ## ## $stats ## Instance of 'LineWise' ## Code Chunk length: 5 dependency(sal_rmd) ## $export_iris ## [1] \"\" ## ## $gzip ## [1] \"export_iris\" ## ## $gunzip ## [1] \"gzip\" ## ## $stats ## [1] \"gunzip\" codeLine(sal_rmd) ## gzip AND gunzip step have been dropped because it is not a LineWise object. ## export_iris ## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) ## stats ## df \u003c- lapply(getColumn(sal, step = \"gunzip\", \"outfiles\"), function(x) read.delim(x, sep = \",\")[-1]) ## df \u003c- do.call(rbind, df) ## stats \u003c- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], 2, sd))) ## stats$species \u003c- rownames(stats) ## plot \u003c- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + ggplot2::geom_bar(stat = \"identity\", color = \"black\", position = ggplot2::position_dodge()) + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width = 0.2, position = ggplot2::position_dodge(0.9)) targetsWF(sal_rmd) ## $export_iris ## DataFrame with 0 rows and 0 columns ## ## $gzip ## DataFrame with 3 rows and 2 columns ## FileName SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/setosa.csv SE ## 2 results/versicolor.csv VE ## 3 results/virginica.csv VI ## ## $gunzip ## DataFrame with 3 rows and 2 columns ## gzip_file SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/SE.csv.gz SE ## 2 results/VE.csv.gz VE ## 3 results/VI.csv.gz VI ## ## $stats ## DataFrame with 0 rows and 0 columns Rules to create the R Markdown to import as workflow To include a particular code chunk from the R Markdown file in the workflow analysis, please use the following code chunk options:\n- `spr='r'`: for code chunks with R code lines; - `spr='sysargs'`: for code chunks with an `SYSargsList` object; - `spr.dep=\u003cStepName\u003e`: for specify the previous dependency. For example:\n ```{r step_1, eval=TRUE, spr=‘r,’ spr.dep=‘step_0’}\n ```{r step_2, eval=TRUE, spr=‘sysargs,’ spr.dep=‘step_1’}\n For spr = 'sysargs', the last object assigned must to be the SYSargsList, for example:\ntargetspath \u003c- system.file(\"extdata/cwl/example/targets_example.txt\", package = \"systemPipeR\") HW_mul \u003c- SYSargsList(step_name = \"Example\", targets = targetspath, wf_file = \"example/example.cwl\", input_file = \"example/example.yml\", dir_path = system.file(\"extdata/cwl\", package = \"systemPipeR\"), inputvars = c(Message = \"_STRING_\", SampleName = \"_SAMPLE_\")) Also, note that all the required files or objects to generate one particular command-line step must be defined in a R code chunk imported. The motivation for this is that when R Markdown files are imported, the spr = 'sysargs' R chunk will be evaluated and stored in the workflow control class as the SYSargsList object, while the R code based (spr = 'r') is not evaluated, and until the workflow is executed it will be store as an expression.\nRunning the workflow For running the workflow, runWF function will execute all the command lines store in the workflow container.\nsal \u003c- runWF(sal) This essential function allows the user to choose one or multiple steps to be executed using the steps argument. However, it is necessary to follow the workflow dependency graph. If a selected step depends on a previous step(s) that was not executed, the execution will fail.\nsal \u003c- runWF(sal, steps = c(1, 3)) Also, it allows forcing the execution of the steps, even if the status of the step is 'Success' and all the expected outfiles exists. Another feature of the runWF function is ignoring all the warnings and errors and running the workflow by the arguments warning.stop and error.stop, respectively.\nsal \u003c- runWF(sal, force = TRUE, warning.stop = FALSE, error.stop = TRUE) When the project was initialized by SPRproject function, it was created an environment for all objects created during the workflow execution. This environment can be accessed as follows:\nviewEnvir(sal) The workflow execution allows to save this environment for future recovery:\nsal \u003c- runWF(sal, saveEnv = TRUE) Workflow status To check the summary of the workflow, we can use:\nsal ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gzip ## cmdlist: 3 | Pending: 3 ## 3. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 3.1. gunzip ## cmdlist: 3 | Pending: 3 ## 4. iris_stats --\u003e Status: Pending ## To access more details about the workflow instances, we can use the statusWF method:\nstatusWF(sal) ## $export_iris ## DataFrame with 1 row and 2 columns ## Step status.summary ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 export_iris Pending ## ## $gzip ## DataFrame with 3 rows and 5 columns ## Targets Total_Files Existing_Files Missing_Files gzip ## \u003ccharacter\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cfactor\u003e ## 1 SE 1 0 1 Pending ## 2 VE 1 0 1 Pending ## 3 VI 1 0 1 Pending ## ## $gunzip ## DataFrame with 3 rows and 5 columns ## Targets Total_Files Existing_Files Missing_Files gunzip ## \u003ccharacter\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cfactor\u003e ## 1 SE 1 0 1 Pending ## 2 VE 1 0 1 Pending ## 3 VI 1 0 1 Pending ## ## $iris_stats ## DataFrame with 1 row and 2 columns ## Step status.summary ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 iris_stats Pending Parallelization on clusters This section of the tutorial provides an introduction to the usage of the systemPipeR features on a cluster.\nThe computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing system is used for load balancing. For this the clusterRun function submits the computing requests to the scheduler using the run specifications defined by runWF.\nA named list provides the computational resources. By default, it can be defined the upper time limit in minutes for jobs before they get killed by the scheduler, memory limit in Mb, number of CPUs, and number of tasks.\nThe number of independent parallel cluster processes is defined under the Njobs argument. The following example will run one process in parallel using for each 4 CPU cores. If the resources available on a cluster allow running all the processes simultaneously, then the shown sample submission will utilize in total four CPU cores (NJobs * ncpus). Note, clusterRun can be used with most queueing systems as it is based on utilities from the batchtools package which supports the use of template files (*.tmpl) for defining the run parameters of different schedulers. To run the following code, one needs to have both a conf file (see .batchtools.conf.R samples here) and a template file (see *.tmpl samples here) for the queueing available on a system. The following example uses the sample conf and template files for the Slurm scheduler provided by this package.\nlibrary(batchtools) resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) sal \u003c- clusterRun(sal, FUN = runWF, more.args = list(), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 1, runid = \"01\", resourceList = resources) Note: The example is submitting the jog to short partition. If you desire to use a different partition, please adjust accordingly (batchtools.slurm.tmpl).\nVisualize workflow systemPipeR workflows instances can be visualized with the plotWF function.\nThis function will make a plot of selected workflow instance and the following information is displayed on the plot:\n- Workflow structure (dependency graphs between different steps); - Workflow step status, *e.g.* `Success`, `Error`, `Pending`, `Warnings`; - Sample status and statistics; - Workflow timing: running duration time. If no argument is provided, the basic plot will automatically detect width, height, layout, plot method, branches, etc.\nplotWF(sal, show_legend = TRUE, width = \"80%\", rstudio = TRUE) {\"x\":{\"dot\":\"digraph {\\n node[fontsize=20];\\n subgraph {\\n node[color=\\\"dodgerblue\\\"];\\n export_iris - gzip - iris_stats[color=\\\"dodgerblue\\\"]\\n }\\n gzip - gunzip\\n \\n export_iris[label=export_iris\n0/0/0/1; 0s tooltip=\\\"step export_iris: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\\\"]\\n gzip[label=gzip\n0/0/0/3; 0s , style=\\\"rounded\\\", shape=\\\"box\\\" tooltip=\\\"step gzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\\\"]\\n gunzip[label=gunzip\n0/0/0/3; 0s , style=\\\"rounded\\\", shape=\\\"box\\\" tooltip=\\\"step gunzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\\\"]\\n iris_stats[label=iris_stats\n0/0/0/1; 0s tooltip=\\\"step iris_stats: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\\\"]\\n subgraph cluster_legend {\\n rankdir=TB;\\n color=\\\"#EEEEEE\\\";\\n style=filled;\\n node [style=filled];\\n {rank=same; R_step; Sysargs_step; Main_branch}\\n Main_branch - Sysargs_step - R_step[color=\\\"#EEEEEE\\\"]\\n Main_branch[label=\\\"Main branch\\\" color=\\\"dodgerblue\\\", style=\\\"filled\\\", fillcolor=white]; Sysargs_step -step_state[color=\\\"#EEEEEE\\\"];\\n step_state[style=\\\"filled\\\", shape=\\\"box\\\" color=white, label =\\n Step Colors\\n Pending steps; Successful steps; Failed steps\\n Targets Files / Code Chunk 0 (pass) | 0 (warning) | 0 (error) | 0 (total); Duration\\n ];\\n label=\\\"Legends\\\";\\n fontsize = 30;\\n Sysargs_step[label=\\\"Sysargs step\\\" style=\\\"rounded, filled\\\", shape=\\\"box\\\", fillcolor=white];\\n R_step[label=\\\"R step\\\" style=\\\"rounded, filled\\\", fillcolor=white];\\n }\\n\\n}\\n\",\"plotid\":\"sprwf-48365271\",\"responsive\":true,\"width\":\"80%\",\"height\":null,\"plot_method\":\"renderSVGElement\",\"rmd\":true,\"msg\":\"\"},\"evals\":[],\"jsHooks\":[]} For more details about the plotWF function, please see here.\nTechnical report systemPipeR compiles all the workflow execution logs in one central location, making it easier to check any standard output (stdout) or standard error (stderr) for any command-line tools used on the workflow or the R code stdout. Also, the workflow plot is appended at the beginning of the report, making it easier to click on the respective step.\nsal \u003c- renderLogs(sal) Exported the workflow systemPipeR workflow management system allows to translate and export the workflow build interactively to R Markdown format or an executable bash script. This feature advances the reusability of the workflow, as well as the flexibility for workflow execution.\nR Markdown file sal2rmd function takes an SYSargsList workflow container and translates it to SPR workflow template R markdown format. This file can be imported with the importWF function, as demonstrated above.\nsal2rmd(sal) Bash script sal2bash function takes an SYSargsList workflow container and translates it to an executable bash script, so one can run the workflow without loading SPR or using an R console.\nsal2bash(sal) It will be generated on the project root an executable bash script, called by default the spr_wf.sh. Also, a directory ./spr_wf will be created and store all the R scripts based on the workflow steps. Please note that this function will “collapse” adjacent R steps into one file as much as possible.\nProject Resume and Restart If you desire to resume or restart a project that has been initialized in the past, SPRproject function allows this operation.\nWith the resume option, it is possible to load the SYSargsList object in R and resume the analysis. Please, make sure to provide the logs.dir location, and the corresponded YAML file name. The current working directory needs to be in the project root directory.\nsal \u003c- SPRproject(resume = TRUE, logs.dir = \".SPRproject\", sys.file = \".SPRproject/SYSargsList.yml\") If you choose to save the environment in the last analysis, you can recover all the files created in that particular section. SPRproject function allows this with load.envir argument. Please note that the environment was saved only with you run the workflow in the last section (runWF()).\nsal \u003c- SPRproject(resume = TRUE, load.envir = TRUE) After loading the workflow at your current section, you can check the objects created in the old environment and decide if it is necessary to copy them to the current environment.\nviewEnvir(sal) copyEnvir(sal, list = \"plot\", new.env = globalenv()) This option will keep all previous logs in the folder; however, if you desire to clean the execution history and restart the workflow, the restart=TRUE option can be used.\nsal \u003c- SPRproject(restart = TRUE, overwrite = TRUE, load.envir = FALSE) The last and more drastic option from SYSproject function is to overwrite the logs and the workflow. This option will delete the hidden folder and the information on the SYSargsList.yml files. This will not delete any parameter file nor any results it was created in previous runs. Please use with caution.\nsal \u003c- SPRproject(overwrite = TRUE) Exploring workflow instances systemPipeR provide several accessor methods and useful functions to explore SYSargsList workflow object.\nAccessor Methods Several accessor methods are available that are named after the slot names of the SYSargsList workflow object.\nnames(sal) ## [1] \"stepsWF\" \"statusWF\" \"targetsWF\" ## [4] \"outfiles\" \"SEobj\" \"dependency\" ## [7] \"targets_connection\" \"projectInfo\" \"runInfo\" Check the length of the workflow: length(sal) ## [1] 4 Check the steps of the workflow: stepsWF(sal) ## $export_iris ## Instance of 'LineWise' ## Code Chunk length: 1 ## ## $gzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 3 (SE...VI), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 3, output: 3 ## cmdlist: 3 ## Sub Steps: ## 1. gzip (rendered: TRUE) ## ## ## ## $gunzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 3 (SE...VI), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 3, output: 3 ## cmdlist: 3 ## Sub Steps: ## 1. gunzip (rendered: TRUE) ## ## ## ## $iris_stats ## Instance of 'LineWise' ## Code Chunk length: 5 Checking the command-line for each target sample: cmdlist() method printing the system commands for running command-line software as specified by a given *.cwl file combined with the paths to the input samples (e.g. FASTQ files) provided by a targets file. The example below shows the cmdlist() output for running gzip and gunzip on the first sample. Evaluating the output of cmdlist() can be very helpful for designing and debugging *.cwl files of new command-line software or changing the parameter settings of existing ones.\ncmdlist(sal, step = c(2, 3), targets = 1) ## $gzip ## $gzip$SE ## $gzip$SE$gzip ## [1] \"gzip -c results/setosa.csv \u003e results/SE.csv.gz\" ## ## ## ## $gunzip ## $gunzip$SE ## $gunzip$SE$gunzip ## [1] \"gunzip -c results/SE.csv.gz \u003e results/SE.csv\" Check the workflow status: statusWF(sal) ## $export_iris ## DataFrame with 1 row and 2 columns ## Step status.summary ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 export_iris Pending ## ## $gzip ## DataFrame with 3 rows and 5 columns ## Targets Total_Files Existing_Files Missing_Files gzip ## \u003ccharacter\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cfactor\u003e ## 1 SE 1 0 1 Pending ## 2 VE 1 0 1 Pending ## 3 VI 1 0 1 Pending ## ## $gunzip ## DataFrame with 3 rows and 5 columns ## Targets Total_Files Existing_Files Missing_Files gunzip ## \u003ccharacter\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cnumeric\u003e \u003cfactor\u003e ## 1 SE 1 0 1 Pending ## 2 VE 1 0 1 Pending ## 3 VI 1 0 1 Pending ## ## $iris_stats ## DataFrame with 1 row and 2 columns ## Step status.summary ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 iris_stats Pending Check the workflow targets files: targetsWF(sal[2]) ## $gzip ## DataFrame with 3 rows and 2 columns ## FileName SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/setosa.csv SE ## 2 results/versicolor.csv VE ## 3 results/virginica.csv VI Checking the expected outfiles files: The outfiles components of SYSargsList define the expected outfiles files for each step in the workflow, some of which are the input for the next workflow step.\noutfiles(sal[2]) ## $gzip ## DataFrame with 3 rows and 1 column ## gzip_file ## \u003ccharacter\u003e ## 1 results/SE.csv.gz ## 2 results/VE.csv.gz ## 3 results/VI.csv.gz Check the workflow dependencies: dependency(sal) ## $export_iris ## [1] \"\" ## ## $gzip ## [1] \"export_iris\" ## ## $gunzip ## [1] \"gzip\" ## ## $iris_stats ## [1] \"gzip\" Check the sample comparisons: Sample comparisons are defined in the header lines of the targets file starting with ‘# \u003cCMP\u003e.’ This information can be accessed as follows:\ntargetsheader(sal, step = \"Quality\") Get the workflow steps names: stepName(sal) ## [1] \"export_iris\" \"gzip\" \"gunzip\" \"iris_stats\" Get the Sample Id for on particular step: SampleName(sal, step = \"gzip\") ## [1] \"SE\" \"VE\" \"VI\" SampleName(sal, step = \"iris_stats\") ## This step doesn't contain multiple samples. Get the outfiles or targets column files: getColumn(sal, \"outfiles\", step = \"gzip\", column = \"gzip_file\") ## SE VE VI ## \"results/SE.csv.gz\" \"results/VE.csv.gz\" \"results/VI.csv.gz\" getColumn(sal, \"targetsWF\", step = \"gzip\", column = \"FileName\") ## SE VE VI ## \"results/setosa.csv\" \"results/versicolor.csv\" \"results/virginica.csv\" Get the R code for a LineWise step: codeLine(sal, step = \"export_iris\") ## export_iris ## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) View all the objects in the running environment: viewEnvir(sal) ## \u003cenvironment: 0x55bbae3bc680\u003e ## character(0) Copy one or multiple objects from the running environment to a new environment: copyEnvir(sal, list = c(\"plot\"), new.env = globalenv(), silent = FALSE) ## \u003cenvironment: 0x55bbae3bc680\u003e ## Copying to 'new.env': ## plot Accessing the *.yml data yamlinput(sal, step = \"gzip\") ## $file ## $file$class ## [1] \"File\" ## ## $file$path ## [1] \"_FILE_PATH_\" ## ## ## $SampleName ## [1] \"_SampleName_\" ## ## $ext ## [1] \"csv.gz\" ## ## $results_path ## $results_path$class ## [1] \"Directory\" ## ## $results_path$path ## [1] \"./results\" Subsetting the workflow details The SYSargsList class and its subsetting operator [: sal[1] ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## sal[1:3] ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gzip ## cmdlist: 3 | Pending: 3 ## 3. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 3.1. gunzip ## cmdlist: 3 | Pending: 3 ## sal[c(1, 3)] ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gunzip ## cmdlist: 3 | Pending: 3 ## The SYSargsList class and its subsetting by steps and input samples: sal_sub \u003c- subset(sal, subset_steps = c(2, 3), input_targets = (\"SE\"), keep_steps = TRUE) stepsWF(sal_sub) ## $export_iris ## Instance of 'LineWise' ## Code Chunk length: 1 ## ## $gzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 1 (SE...SE), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 1, output: 1 ## cmdlist: 1 ## Sub Steps: ## 1. gzip (rendered: TRUE) ## ## ## ## $gunzip ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 1 (SE...SE), targetsheader: 1 (lines) ## modules: 0 ## wf: 1, clt: 1, yamlinput: 4 (inputs) ## input: 1, output: 1 ## cmdlist: 1 ## Sub Steps: ## 1. gunzip (rendered: TRUE) ## ## ## ## $iris_stats ## Instance of 'LineWise' ## Code Chunk length: 5 targetsWF(sal_sub) ## $export_iris ## DataFrame with 0 rows and 0 columns ## ## $gzip ## DataFrame with 1 row and 2 columns ## FileName SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/setosa.csv SE ## ## $gunzip ## DataFrame with 1 row and 2 columns ## gzip_file SampleName ## \u003ccharacter\u003e \u003ccharacter\u003e ## 1 results/SE.csv.gz SE ## ## $iris_stats ## DataFrame with 0 rows and 0 columns outfiles(sal_sub) ## $export_iris ## DataFrame with 0 rows and 0 columns ## ## $gzip ## DataFrame with 1 row and 1 column ## gzip_file ## \u003ccharacter\u003e ## 1 results/SE.csv.gz ## ## $gunzip ## DataFrame with 1 row and 1 column ## gunzip_file ## \u003ccharacter\u003e ## 1 results/SE.csv ## ## $iris_stats ## DataFrame with 0 rows and 0 columns The SYSargsList class and its operator + sal[1] + sal[2] + sal[3] Replacement Methods Update a input parameter in the workflow sal_c \u003c- sal ## check values yamlinput(sal_c, step = \"gzip\") ## $file ## $file$class ## [1] \"File\" ## ## $file$path ## [1] \"_FILE_PATH_\" ## ## ## $SampleName ## [1] \"_SampleName_\" ## ## $ext ## [1] \"csv.gz\" ## ## $results_path ## $results_path$class ## [1] \"Directory\" ## ## $results_path$path ## [1] \"./results\" ## check on command-line cmdlist(sal_c, step = \"gzip\", targets = 1) ## $gzip ## $gzip$SE ## $gzip$SE$gzip ## [1] \"gzip -c results/setosa.csv \u003e results/SE.csv.gz\" ## Replace yamlinput(sal_c, step = \"gzip\", paramName = \"ext\") \u003c- \"txt.gz\" ## check NEW values yamlinput(sal_c, step = \"gzip\") ## $file ## $file$class ## [1] \"File\" ## ## $file$path ## [1] \"_FILE_PATH_\" ## ## ## $SampleName ## [1] \"_SampleName_\" ## ## $ext ## [1] \"txt.gz\" ## ## $results_path ## $results_path$class ## [1] \"Directory\" ## ## $results_path$path ## [1] \"./results\" ## Check on command-line cmdlist(sal_c, step = \"gzip\", targets = 1) ## $gzip ## $gzip$SE ## $gzip$SE$gzip ## [1] \"gzip -c results/setosa.csv \u003e results/SE.txt.gz\" Append and Replacement methods for R Code Steps appendCodeLine(sal_c, step = \"export_iris\", after = 1) \u003c- \"log_cal_100 \u003c- log(100)\" codeLine(sal_c, step = \"export_iris\") ## export_iris ## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) ## log_cal_100 \u003c- log(100) replaceCodeLine(sal_c, step = \"export_iris\", line = 2) \u003c- LineWise(code = { log_cal_100 \u003c- log(50) }) codeLine(sal_c, step = 1) ## export_iris ## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(\"results\", paste0(names(split(iris, factor(iris$Species))), \".csv\"))) ## 3.91202300542815 For more details about the LineWise class, please see below.\n Rename a Step renameStep(sal_c, step = 1) \u003c- \"newStep\" renameStep(sal_c, c(1, 2)) \u003c- c(\"newStep2\", \"newIndex\") sal_c ## Instance of 'SYSargsList': ## WF Steps: ## 1. newStep2 --\u003e Status: Pending ## 2. newIndex --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gzip ## cmdlist: 3 | Pending: 3 ## 3. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 3.1. gunzip ## cmdlist: 3 | Pending: 3 ## 4. iris_stats --\u003e Status: Pending ## names(outfiles(sal_c)) ## [1] \"newStep2\" \"newIndex\" \"gunzip\" \"iris_stats\" names(targetsWF(sal_c)) ## [1] \"newStep2\" \"newIndex\" \"gunzip\" \"iris_stats\" dependency(sal_c) ## $newStep2 ## [1] \"\" ## ## $newIndex ## [1] \"newStep2\" ## ## $gunzip ## [1] \"newIndex\" ## ## $iris_stats ## [1] \"newIndex\" Replace a Step sal_test \u003c- sal[c(1, 2)] replaceStep(sal_test, step = 1, step_name = \"gunzip\") \u003c- sal[3] sal_test Note: Please use this method with attention, because it can disrupt all the dependency graphs.\n Removing a Step sal_test \u003c- sal[-2] sal_test ## Instance of 'SYSargsList': ## WF Steps: ## 1. export_iris --\u003e Status: Pending ## 2. gunzip --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 2.1. gunzip ## cmdlist: 3 | Pending: 3 ## 3. iris_stats --\u003e Status: Pending ## References ","categories":"","description":"","excerpt":" document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/spr_run/","tags":"","title":"How to run a Workflow"},{"body":" systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk} systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk} ","categories":"","description":"","excerpt":" systemPipeShiny: An Interactive Framework for Workflow Management …","ref":"/outreach/posters/","tags":"","title":"Posters"},{"body":"Quick {ggplot} module This module enables you to quickly upload datasets and make a {ggplot{blk}} in a second by using some functionalities from {Esquisse{blk}}.\nUpload data Upload data The first thing you come to this module is to upload a tabular data file. You can choose to use the example or upload your own. The example is just the iris data. 1.1. If you choose to upload, there will be a upload button where you need to choose your own file. By default, it assumes you upload a “.csv” file with “#” as comments. If not you can choose the file delimiter and comment character. You can view your uploaded data and use the boxes below each column name to perform some filters, but you are not allowed to edit the data. If everything looks good, you can submit to proceed to the plot making panel. Make a plot Make a plot Figure 8 Quick ggplot\n Provide a tabular data table by uploading or use example. Drag variables from into different ggplot aesthetic boxes to make a ggplot. Change to different plot types. Customize other different plotting options. For a more specific guide, read Esquisse official guide{blk}.\n","categories":"","description":"","excerpt":"Quick {ggplot} module This module enables you to quickly upload …","ref":"/sps/modules/ggplot/","tags":"","title":"Quick ggplot"},{"body":"SPS example usage To start with SPS after installation:\nLoad package Load the systemPipeShiny package in your R session.\nlibrary(systemPipeShiny) ## Loading required package: shiny ## Loading required package: spsUtil ## Loading required package: spsComps ## Loading required package: drawer Initialize SPS project Before launching the SPS application, a project environment needs to be created with the following command.\nspsInit() For this demo, the project directory structure is written to a temporary directory on a user’s system. For a real project, it should be written to a defined and user controlled location on a system rather than a temporary directory.\nsps_tmp_dir \u003c- tempdir() spsInit(app_path = sps_tmp_dir, change_wd = FALSE, project_name = \"SPSProject\") ## [SPS-INFO] 2021-04-12 11:31:39 Start to create a new SPS project ## [SPS-INFO] 2021-04-12 11:31:39 Create project under /tmp/RtmpgROsL7/SPSProject ## [SPS-INFO] 2021-04-12 11:31:39 Now copy files ## [SPS-INFO] 2021-04-12 11:31:39 Create SPS database ## [SPS-INFO] 2021-04-12 11:31:39 Created SPS database method container ## [SPS-INFO] 2021-04-12 11:31:39 Creating SPS db... ## [SPS-DANGER] 2021-04-12 11:31:39 Done, Db created at '/tmp/RtmpgROsL7/SPSProject/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-12 11:31:39 Key md5 ae88518aa6cce9a5af24d37c4c3c1b16 ## [SPS-INFO] 2021-04-12 11:31:39 SPS project setup done! sps_dir \u003c- file.path(sps_tmp_dir, \"SPSProject\") SPS project structure The file and directory structure of an SPS project is organized as follows.\n SPS_xx/ ├── server.R | ├── global.R | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit manually ├── ui.R | ├── deploy.R | Deploy helper file ├── config | Important app config files. Do not edit them if you don't know │ ├── sps.db | SPS database │ ├── sps_options.yaml | SPS default option list │ └── tabs.csv | SPS tab information ├── data | App example data files │ ├── xx.csv ├── R | All SPS additional tab files and helper R function files │ ├── tab_xx.R ├── README.md ├── results | Not in use for this current version, you can store some data been generated from the app │ └── README.md └── www | Internet resources ├── about | About tab information │ └── xx.md ├── css | CSS files │ └── sps.css ├── img | App image resources │ └── xx.png ├── js | Javascripts │ └── xx.js ├── loading_themes | Loading screen files │ └── xx.html └── plot_list | Image files for plot gallery └── plot_xx.jpg Launch SPS By default, the working directory will be set inside the project folder automatically. To launch the SPS Shiny application, one only needs to execute the following command.\nshiny::runApp() After the SPS app has been launched, clicking the “Continue to app” button on the welcome screen will open the main dashboard (Fig.2).\n Figure 2: Snapshot of SPS' UI.\n Welcome screen. Module tabs. User defined custom tabs. The Canvas tab. All SPS tabs has this description on top. It is highly recommend to click here to expand and read the full the description for the first time. Alternatively, when using RStudio one can click the Run App button in the top right corner.\nIn addition, in Rstudio the global.R file will be automatically opened when the SPS project is created. Custom changes can be made inside this file before the app launches. Later we will discuss how to change and create new custom tabs and change other settings.\n","categories":"","description":"","excerpt":"SPS example usage To start with SPS after installation:\nLoad package …","ref":"/sps/quick_start/","tags":"","title":"Quick start"},{"body":" SPS framework come with a plenty of useful general R utility functions, like pretty logging, package namespace checking, URL checking, and more.\nSince SPS 1.1, these functions are separated into a supporting package called spsUtil (systemPipeShiny Utility). You can install it from CRAN.\nInstallation Read the developer tools main page, not repeating here.\nFunctions reference manual In documents, we only highlight some important functions. Please read the reference manuals for details of every function.\nFunction highlights library(spsUtil) logging with msg basic Often times in an R function, we want to use some text to inform users the status and message. We can use functions like message, warning, stop to generate different levels of information.\n{spsUtil} provides some more informative and prettier ways to generate these kind of messages.\nmsg(\"my message\") ## [INFO] 2021-04-12 11:49:35 my message You can see it starts with a level information, then a time stamp, and follows the actual message. By default, it uses the INFO level, and you can change to whatever level you want. However, there are 3 keywords that have special meaning.\nLevels INFO: equals message method in native R WARNING: generates warnings the same as warning function ERROR: generates error the same as stop function and will prevent downstream code get evaluated. If the level is other than these 3, there is no special meaning in R, just cat the message out.\nmsg(\"I am info\", level = \"INFO\") ## [INFO] 2021-04-12 11:49:35 I am info msg(\"I am warning\", level = \"warning\") # not case sensitive ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning msg(\"I am error\", level = \"ERROR\") ## Error: [ERROR] 2021-04-12 11:49:35 I am error msg(\"I am random level\", level = \"MY LEVEL\") ## [MY LEVEL] 2021-04-12 11:49:35 I am random level Prefix For the 3 key levels, you can specify the prefix in front of the level text to over write the default level text INFO, WARNING, or ERROR\nmsg(\"I am info\", level = \"INFO\", info_text = \"NEW-INFO\") ## [NEW-INFO] 2021-04-12 11:49:35 I am info msg(\"I am warning\", level = \"warning\", warning_text = \"MY-WARNING\") ## Warning: [MY-WARNING] 2021-04-12 11:49:35 I am warning msg(\"I am error\", level = \"ERROR\", error_text = \"STOP\") ## Error: [STOP] 2021-04-12 11:49:35 I am error Colors Colors are automatically enabled if it is supported. If you try all code above in your terminal or Rstudio, they all have colors. In Rmd, to enable the color, you need to add the following code chunk. You also need to install the fansi package.\n```{r echo=FALSE, results='asis'} options(crayon.enabled = TRUE) old_hooks \u003c- fansi::set_knit_hooks(knitr::knit_hooks, which = c(\"output\", \"message\", \"error\", \"warning\")) ``` PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em}; msg(\"I am info\", level = \"INFO\", info_text = \"NEW-INFO\") ## [NEW-INFO] 2021-04-12 11:49:35 I am info The 3 key levels has default colors:\n INFO: blue WARNING: orange ERROR: red You can specify colors for your own levels\nmsg(\"I am warning\", level = \"warning\") ## not super orange in Rmd translation -_-= ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning msg(\"I am error\", level = \"error\") ## Error: [ERROR] 2021-04-12 11:49:35 I am error msg(\"oh yeah\", level = \"SUCCESS\", .other_color = \"green\") ## [SUCCESS] 2021-04-12 11:49:35 oh yeah msg(\"oh no\", level = \"FAIL\", .other_color = \"purple\") ## [FAIL] 2021-04-12 11:49:35 oh no Wrapper You can use this logging function in your own projects by wrapping it inside a upper level function, like what we do for spsinfo, spswarn, spserror. They have SPS- prefix added, and have some SPS global settings appended.\nspsOption('use_crayon', TRUE) spsinfo(\"info\", verbose = TRUE) ## default `verbose` mute the message ## [SPS-INFO] 2021-04-12 11:49:35 info spswarn(\"warning\") ## Warning: [SPS-WARNING] 2021-04-12 11:49:35 warning spserror(\"stop\") ## Error: [SPS-ERROR] 2021-04-12 11:49:35 stop To create a simple one for project is very easy. Assume your project is named “My Project”. You can create logging as:\nmpInfo \u003c- function(text){ spsUtil::msg(text, info_text = \"MP-INFO\") } mpWarn \u003c- function(text){ spsUtil::msg(text, level = \"warning\", warning_text = \"MP-WARNING\") } mpErr \u003c- function(text){ spsUtil::msg(text, level = \"error\", error_text = \"MP-ERROR\") } mpInfo(\"info\") ## [MP-INFO] 2021-04-12 11:49:35 info mpWarn(\"warning\") ## Warning: [MP-WARNING] 2021-04-12 11:49:35 warning mpErr(\"error\") ## Error: [MP-ERROR] 2021-04-12 11:49:35 error mute message with quiet In R, you can easily mute message and warnings with suppressMessages(), and suppressWarnings(), but not so easy with print or cat methods. spsUtil::quiet enables you to mute all these methods or choose what to mute.\n{ # muted quiet(warning(123)) quiet(message(123)) quiet(print(123)) quiet(cat(123)) # not muted quiet(warning(123), warning = FALSE) quiet(message(123), message = FALSE) quiet(print(123), print_cat = FALSE) quiet(cat(123), print_cat = FALSE) } ## Warning in force(x): 123 ## 123 ## [1] 123 ## 123 check “empty” values with emptyIsFalse In R, values like NA, \"\", NULL, length(0) is not very meaningful in condition judgment and will give you errors. Yet, R does not have a native method to handle these “empty” values in if like other languages. They are meaningful in other ways, but in conditions, we may want to turn them to FALSE.\nif(\"\") TRUE else FALSE ## Error in if (\"\") TRUE else FALSE: argument is not interpretable as logical if(NULL) TRUE else FALSE ## Error in if (NULL) TRUE else FALSE: argument is of length zero if(character(0)) TRUE else FALSE ## Error in if (character(0)) TRUE else FALSE: argument is of length zero if(NA) TRUE else FALSE ## Error in if (NA) TRUE else FALSE: missing value where TRUE/FALSE needed You can see they all give errors. In other languages (javascript in this example), these values are often treated as FALSE.\nif (NaN) true; else false //\u003e false if (undefined) true; else false //\u003e false if (\"\") true; else false //\u003e false if (null) true; else false //\u003e false if (NaN) true; else false // false if (undefined) true; else false // false if (\"\") true; else false // false if (null) true; else false // false This is how emptyIsFalse work. If the input is one of these values, return FALSE, else TRUE\nif(emptyIsFalse(\"\")) TRUE else FALSE ## [1] FALSE if(emptyIsFalse(NULL)) TRUE else FALSE ## [1] FALSE if(emptyIsFalse(character(0))) TRUE else FALSE ## [1] FALSE if(emptyIsFalse(NA)) TRUE else FALSE ## [1] FALSE check missing packages checkNameSpace In our functions, sometimes we want to have the users to install certain packages to enable more functionalities, like the DESeq2::lfcShrink function. Or like in a Rmd source code, before other people can rerender the document, they must install certain packages. checkNameSpace checks all required packages and returns the missing names.\ncheckNameSpace(\"random_pkg\") ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from ## CRAN: random_pkg ## [1] \"random_pkg\" You can add it to your function to or on the top of your Rmd document to inform your users the missing packages and where to install.\npkgs \u003c- list( CRAN = c(\"pkg1\", \"pkg2\"), Bioconductor = c(\"bio_pkg1\", \"bio_pkg2\") ) missing_pkg \u003c- checkNameSpace(pkgs[[1]], from = names(pkgs)[1]) ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from ## CRAN: pkg1,pkg2 missing_pkg \u003c- c(missing_pkg, checkNameSpace(pkgs[[2]], from = names(pkgs)[2])) ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from ## Bioconductor: bio_pkg1,bio_pkg2 if(emptyIsFalse(missing_pkg)) stop(\"Install packages\") ## Error in eval(expr, envir, enclos): Install packages Or write your custom warning message:\n{ missing_pkg \u003c- mapply(function(pkg, from) { checkNameSpace(pkg, quietly = TRUE, from) }, pkg = pkgs, from = names(pkgs), SIMPLIFY = FALSE) cat( \"Use `install.packages(c('\", paste0(missing_pkg[['CRAN']], collapse = \"','\"), \"'))` to install CRAN packages\\n\", sep = \"\" ) cat( \"Use `BiocManager::install(c('\", paste0(missing_pkg[['Bioconductor']], collapse = \"','\"), \"'))` to install Bioconductor packages\\n\", sep = \"\" ) if(emptyIsFalse(unlist(missing_pkg))) stop(\"Install packages\") } ## Use `install.packages(c('pkg1','pkg2'))` to install CRAN packages ## Use `BiocManager::install(c('bio_pkg1','bio_pkg2'))` to install Bioconductor packages ## Error in eval(expr, envir, enclos): Install packages check a URL is reachable with checkUrl Useful if you need make some big HTTP requests.\ncheckUrl(\"https://google.com\") ## [1] TRUE checkUrl(\"https://randomwebsite123.com\", timeout = 1) ## Warning: [WARNING] 2021-04-12 11:49:37 Bad url https:// ## randomwebsite123.com ## Warning: [WARNING] 2021-04-12 11:49:37 Timeout was reached: [randomwebsite123.com] Connection timed out after 1001 milliseconds \n## [1] FALSE ","categories":"","description":"","excerpt":" SPS framework come with a plenty of useful general R utility …","ref":"/sps/dev/spsutil/","tags":"","title":"spsUtil"},{"body":" Find here all the documentation!\n systemPipeRdata: Workflow templates and sample data systemPipeRdata is a helper package to generate with a single command workflow templates that are intended to be used by its parent package systemPipeR. The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.\nTo test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow. Pre-configured directory structure of the workflow environment and the sample data used by systemPipeRdata are described here.\nInstallation To install the package, please use the BiocManager::install command:\nif (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeRdata\") To obtain the most recent updates immediately, one can install it directly from github as follow:\nif (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"tgirke/systemPipeRdata\", build_vignettes=TRUE, dependencies=TRUE) Due to the large size of the sample data (~320 MB) provided by systemPipeRdata, its download/install may take some time.\nTo install the parent package systemPipeR itself, please use the BiocManager::install method as instructed here.\nUsage Detailed user manuals are available here:\n systemPipeRdata Vignette systemPipeR Overview Vignette ","categories":"","description":"","excerpt":" Find here all the documentation!\n systemPipeRdata: Workflow templates …","ref":"/sp/sprdata/","tags":"","title":"systemPipeRdata"},{"body":" Load and unload tabs In SPS, all tabs including tabs for modules and other default tabs can be loaded and unloaded. This is controlled by SPS options\nUnder current version, these options are:\n Option Description Default Other module_wf load workflow module? TRUE FALSE module_rnaseq load RNAseq module? TRUE FALSE module_ggplot load quick ggplot module? TRUE FALSE tab_welcome load welcome tab? TRUE FALSE tab_vs_main load custom visualization main tab? TRUE FALSE tab_canvas load Canvas tab? TRUE FALSE tab_about load about tab? TRUE FALSE Each of them controls whether to load or unload a tab. By default, all tabs are loaded, but you can unload them by turn them to FALSE.\nThe original UI look like this:\n Default UI To unload some tabs, scroll to the option lines in global.R file:\noptions(sps = list( ... tab_welcome = TRUE, tab_vs_main = TRUE, tab_canvas = FALSE, tab_about = FALSE, module_wf = FALSE, module_rnaseq = FALSE, module_ggplot = TRUE, ... )) We unload the “Canvas tab”, “workflow module tab”, “RNASeq module tab” and “About tab”. When you restart the app, you should see some tabs are gone:\nThe original UI look like this:\n Unload some tabs Exception for module main page You may have noticed, there is no option to unload the module main tab, which is named “Modules” on the left sidebar. This is because this tab is controlled by its sub-tabs, the module tab options. To unload this tab, all the module tabs have to be unloaded the same time like following. If any module is loaded, this module main tab cannot be unloaded.\noptions(sps = list( ... module_wf = FALSE, module_rnaseq = FALSE, module_ggplot = FALSE, ... )) No module loaded ","categories":"","description":"","excerpt":" Load and unload tabs In SPS, all tabs including tabs for modules and …","ref":"/sps/adv_features/displaytabs/","tags":"","title":"Toggle tabs"},{"body":"BioC2021 BioC2021{blk}\n systemPipe: Workflow and Visualization Toolkit - Workshop\n GitHub Material{blk} BioC2020 BioC2020{blk}\n systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk}\n systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk}\n BioC2019 BioC2019{blk} systemPipeR's New CWL Command-line Interface - Workshop GitHub Material{blk} [ View Slides in Separate Browser Tab ]{blk}\n Bioc2018 BioC2018{blk}\n Poster Bioc2018{blk}\n Bioc2016 BioC2016{blk} [ View Slides in Separate Browser Tab ]{blk}\n Material for Bioc2016 Tutorial Intro Slide Show{blk} Tutorial Material Introduction to systemPipeR HTML{blk} PDF{blk} Rmd{blk} Demo Workflow: RIBO-Seq HTML{blk} PDF{blk} Rmd{blk} Installation Please install systemPipeRdata from this GitHub repository as shown below. This package provides the data and Rmd files for the tutorial. Its parent package systemPipeR is a dependency and it should install along with all its own dependencies automatically. If it doesn’t then please also install the package, using the BiocManager::install command given below.\nif (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"tgirke/systemPipeRdata\", build_vignettes=TRUE, dependencies=TRUE) BioC2015 BioC2015{blk} [ View Slides in Separate Browser Tab ]{blk}\n ","categories":"","description":"","excerpt":"BioC2021 BioC2021{blk}\n systemPipe: Workflow and Visualization …","ref":"/outreach/conferences/","tags":"","title":"Conferences"},{"body":" In this section, we will discuss the pre-defined modules in SPS\n ","categories":"","description":"","excerpt":" In this section, we will discuss the pre-defined modules in SPS\n ","ref":"/sps/modules/","tags":"","title":"Modules"},{"body":" SPS notification system In SPS, there is a notification dropdown where developers can broadcast new messages to users. The dropdown is located on the top-right corner.\n Notification Dropdown \nWhen a notification item is clicked, details of the notification will be displayed in a modal.\n Notification Detail Moadal Official notification If you only use the original SPS, we will send out new notifications every time we update the package or other important things that we want to inform you. You should see the icon of the dropdown becomes. + the message number. If there is no message or you have clicked the dropdown, it will become + 0.\nCustom notification If you do not want to receive the official notification or want to write your own note to your users, first let us understand how it works.\nMechanism Every time when you run the sps() main function, it will look for a remote URL that stores the notification information in yaml{blk} format. If this file can be successfully parsed, you will see the notification dropdown menu on SPS UI, otherwise no dropdown displayed.\nTo define your own notification URL, you need to change the option note_url in the global.R file. Read more about changing SPS options. The default value is a file on Github, which also can be used as your template to write custom notification messages:\nhttps://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml{blk}\nNotification template If you download the link above, you should see something like this:\n############ Create remote messages to notify users in the app ################# ## When app starts, it will first try to load this file from online. ## You should place this file somewhere publically reachable online, like Github. ## This file should not be included in your app deployment. ## Add the url of this file to the SPS option `note_url` in \"global.R\" file # type: one of 'package' or 'general', required # expire: note will be displayed before the date, required, YYYY-MM-DD format # title: string, required # icon: any font-awesome icon name, default is the \"info-circle\" # status: one of primary, success, info, warning, danger, default is \"primary\" # pkg_name: string, required if type == 'package', such as \"systemPipeShiny\" # version: string, required if type == 'package', such as \"1.0.0\" # message: string, optional, the text body of the notification. Be careful with indentations. - note: type: general pkg_name: version: title: Notification broadcasting expire: 2099-01-01 icon: status: message: | ## SPS notifications What you are looking at is the SPS notification broadcasting system. It display messages to your users by reading a remote `yaml` file stored online. SPS will fetch the content of this file and translate it to different notes you can see here. So you do not need to re-deploy the app every time there is a new notification. 1. You can customize your own notifications by using [this file as template](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml). 2. After the modification, place this file in public accessible location, like Github, do not inlcude this file in app deployment. 3. During app deployment, indicate the URL of this file in `global.R` file, `note_url:` option. Template details Most entries are easy-to-understand. Here are some key points.\nIndentation Indentation is very important in a yaml file. In the template, we use 4 spaces as 1 level of indentation.\nNotification start and end Always start with a - note: to define a notification item. After you finish typing the message body, leave at least one line blank before starting another notification.\ntype general: Use this type to create a general notification. It will ignore pkg_name and version information.\npackage: A notification that is related to a package updates. This type of note will first check if the user has installed the package (single one) with a version that is higher than the specified version number in pkg_name and version entries. If so, the notification will not be displayed. If not the user will see the notification before expiration date.\nexpire The expire decides how long to show users the notification. If current date has passed the date in expire, the notification will not be displayed.\nMessage body Use | to start a new line and put the markdown format text body in the next indentation level.\n","categories":"","description":"","excerpt":" SPS notification system In SPS, there is a notification dropdown …","ref":"/sps/adv_features/notification/","tags":"","title":"Notification system"},{"body":" Guidelines from bioconductor_docker.\n Running the systemPipeR with Docker Get a copy of the public docker image docker pull systempipe/systempipe_docker:latest To run RStudio Server: docker run -e PASSWORD=systemPipe -p 8787:8787 \\ systempipe/systempipe_docker:latest You can then open a web browser pointing to your docker host on port 8787. If you’re on Linux and using default settings, the docker host is 127.0.0.1 (or localhost, so the full URL to RStudio would be http://localhost:8787). If you are on Mac or Windows and running Docker Toolbox, you can determine the docker host with the docker-machine ip default command.\nIn the above command, -e PASSWORD= is setting the RStudio password and is required by the RStudio Docker image. It can be whatever you like except it cannot be rstudio. Log in to RStudio with the username rstudio and whatever password was specified, in this example systemPipe.\nTo run R from the command line: docker run -it --user rstudio systempipe/systempipe_docker:latest R To open a Bash shell on the container: docker run -it --user rstudio systempipe/systempipe_docker:latest bash Install Prerequisites: Linux Mac Windows\nInstructions here on how to install Docker Engine on Ubuntu.\nsudo apt-get update sudo apt-get install \\ apt-transport-https \\ ca-certificates \\ curl \\ gnupg curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\ \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \\ $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ## Verify that Docker Engine is installed correctly by running the hello-world image. sudo docker run hello-world Uninstall sudo apt-get remove docker docker-engine docker.io containerd runc Docker Hub Account To be able to share a custom image, please go to https://hub.docker.com and create a free account.\n Log in to the Docker Hub locally Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one.\ndocker login # Username: XXXX # Password: xxx # Login Succeeded Run Docker docker run-dP systempipe/systempipe_docker:latest Make sure the container is running:\ndocker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # NAMES #5d007f66a7b3 systempipe/systempipe_docker:latest \"/init\" 5 minutes ago Up 5 minutes 0.0.0.0:49153-\u003e8787/tcp determined_easle Login to the container Please check the NAMES in this example, determined_easle, to login into the container.\ndocker exec -it determined_easle /bin/bash Other alternatives to run the container To run RStudio Server: docker run -e PASSWORD=systemPipe -p 8787:8787 \\ systempipe/systempipe_docker:latest To run R from the command line: docker run -it --user rstudio systempipe/systempipe_docker:latest R To open a Bash shell on the container: docker run -it --user rstudio systempipe/systempipe_docker:latest bash Check R Version into the container R --version Stop Docker docker stop determined_easle Create your first repository Link Create a repository: Sign in to Docker Hub. Click Create a Repository on the Docker Hub welcome page: Name it /my-repo. Click Create. Build and push a container image to Docker Hub from your computer Start by creating a Dockerfile to specify your application mkdir docker_test cd docker_test touch Dockerfile # Docker inheritance FROM systempipe/systempipe_docker:latest ## Install BiocStyle RUN R -e 'BiocManager::install(\"BiocStyle\")' # Install required Bioconductor package from devel version RUN R -e 'BiocManager::install(\"tgirke/systemPipeR\")' RUN R -e 'BiocManager::install(\"tgirke/systemPipeRdata\")' WORKDIR /home/rstudio/SPRojects COPY --chown=rstudio:rstudio . /home/rstudio/SPRojects # Metadata LABEL name=\"systempipe/systempipe_docker\" \\ version=$BIOCONDUCTOR_DOCKER_systempipe \\ url=\"https://github.com/systemPipeR/systempipe/systempipe_docker\" \\ vendor=\"systemPipeR Project\" \\ maintainer=\"email@gmail.com\" \\ description=\"Bioconductor docker image containing the systemPipeR Project\" \\ license=\"Artistic-2.0\" Run docker build to build your Docker image docker build -t systempipe/systempipe_docker . Run docker run to test your Docker image locally docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest Run docker push to push your Docker image to Docker Hub docker push systempipe/systempipe_docker Your repository in Docker Hub should now display a new latest tag under Tags Make changes to the container and Create the new image Create a folder, for example:\ndocker run -dP systempipe/systempipe_docker docker ps ## To check the NAME \u003clucid_grothendieck\u003e docker exec -it lucid_grothendieck /bin/bash root@33c758eb1626:/# R setwd(\"home/rstudio/\") systemPipeRdata::genWorkenvir(\"rnaseq\") exit docker commit -m \"Added rnaseq template\" -a \"Dani Cassol\" lucid_grothendieck dcassol/systempipeworkshop2021:rnaseq docker push systempipe/systempipe_docker:rnaseq Run the new image:\ndocker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq Commands List which docker machines are available locally {bash, eval=FALSE}docker images\nList running containers {bash, eval=FALSE}docker ps\nList all containers {bash, eval=FALSE}docker ps -a\nResume a stopped container {bash, eval=FALSE}docker start \u003cCONTAINER ID\u003e\nShell into a running container {bash, eval=FALSE}docker exec -it \u003cCONTAINER ID\u003e /bin/bash\nStop OR remove a cointainer {bash, eval=FALSE}docker stop \u003cCONTAINER ID\u003e {bash, eval=FALSE}docker rm \u003cCONTAINER ID\u003e\nRemove a image {bash, eval=FALSE}docker rmi dcassol/systempipeworkshop2021:rnaseq\n Docker and GitHub Actions To create a new token, go to Docker Hub Settings 1.1. Account Settings » Security » New Access Token 1.2. Add Access Token Description » Create 1.3. Copy the Access Token » Copy and Close\nGo to the Repository at GitHub 2.1. Settings \u003e Secrets \u003e New repository secret 2.2. Create a new secret with the name DOCKER_HUB_USERNAME and your Docker ID as value 2.3. Click at Add secret 2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)\nSet up the GitHub Actions workflow steps: - name: Checkout Repo uses: actions/checkout@v2 - name: Login to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} Common Problems ## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied Solution:\nsudo chmod 666 /var/run/docker.sock Singularity Container Please download the Docker image of systemPipe, as follow:\nsingularity pull docker://systempipe/systempipe_docker:latest You can also use the build command to download pre-built images from Docker. Unlike pull, build will convert the image to the latest Singularity image format after downloading it.\nsingularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest To run the container:\nsingularity shell systempipe_docker_latest.sif Resources Docker Run: How to create images from an application Docker Hub Quickstart Configure GitHub Actions Singularity ","categories":"","description":"","excerpt":" Guidelines from bioconductor_docker.\n Running the systemPipeR with …","ref":"/sp/sp_docker/","tags":"","title":"SPR Docker container"},{"body":"document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Define environment settings and samples A typical workflow starts with generating the expected working environment containing the proper directory structure, input files, and parameter settings. To simplify this task, one can load one of the existing NGS workflows templates provided by systemPipeRdata into the current working directory. The following does this for the rnaseq template. The name of the resulting workflow directory can be specified under the mydirname argument. The default NULL uses the name of the chosen workflow. An error is issued if a directory of the same name and path exists already. On Linux and OS X systems one can also create new workflow instances from the command-line of a terminal as shown here. To apply workflows to custom data, the user needs to modify the targets file and if necessary update the corresponding .cwl and .yml files. A collection of pre-generated .cwl and .yml files are provided in the param/cwl subdirectory of each workflow template. They are also viewable in the GitHub repository of systemPipeRdata (see here).\nlibrary(systemPipeR) library(systemPipeRdata) genWorkenvir(workflow = \"rnaseq\", mydirname = NULL) setwd(\"rnaseq\") Read Preprocessing Preprocessing with preprocessReads function The function preprocessReads allows to apply predefined or custom read preprocessing functions to all FASTQ files referenced in a SYSargs2 container, such as quality filtering or adaptor trimming routines. The paths to the resulting output FASTQ files are stored in the output slot of the SYSargs2 object. Internally, preprocessReads uses the FastqStreamer function from the ShortRead package to stream through large FASTQ files in a memory-efficient manner. The following example performs adaptor trimming with the trimLRPatterns function from the Biostrings package. After the trimming step a new targets file is generated (here targets_trimPE.txt) containing the paths to the trimmed FASTQ files. The new targets file can be used for the next workflow step with an updated SYSargs2 instance, e.g. running the NGS alignments with the trimmed FASTQ files.\nConstruct SYSargs2 object from cwl and yml param and targets files.\ntargetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/preprocessReads/trim-pe\", package = \"systemPipeR\") trim \u003c- loadWorkflow(targets = targetsPE, wf_file = \"trim-pe.cwl\", input_file = \"trim-pe.yml\", dir_path = dir_path) trim \u003c- renderWF(trim, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) trim output(trim)[1:2] preprocessReads(args = trim, Fct = \"trimLRPatterns(Rpattern='GCCCGGGTAA', subject=fq)\", batchsize = 1e+05, overwrite = TRUE, compress = TRUE) The following example shows how one can design a custom read preprocessing function using utilities provided by the ShortRead package, and then run it in batch mode with the ‘preprocessReads’ function (here on paired-end reads).\nfilterFct \u003c- function(fq, cutoff = 20, Nexceptions = 0) { qcount \u003c- rowSums(as(quality(fq), \"matrix\") \u003c= cutoff, na.rm = TRUE) # Retains reads where Phred scores are \u003e= cutoff with N exceptions fq[qcount \u003c= Nexceptions] } preprocessReads(args = trim, Fct = \"filterFct(fq, cutoff=20, Nexceptions=0)\", batchsize = 1e+05) Preprocessing with TrimGalore! TrimGalore! is a wrapper tool to consistently apply quality and adapter trimming to fastq files, with some extra functionality for removing Reduced Representation Bisulfite-Seq (RRBS) libraries.\ntargets \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/trim_galore/trim_galore-se\", package = \"systemPipeR\") trimG \u003c- loadWorkflow(targets = targets, wf_file = \"trim_galore-se.cwl\", input_file = \"trim_galore-se.yml\", dir_path = dir_path) trimG \u003c- renderWF(trimG, inputvars = c(FileName = \"_FASTQ_PATH1_\", SampleName = \"_SampleName_\")) trimG cmdlist(trimG)[1:2] output(trimG)[1:2] ## Run Single Machine Option trimG \u003c- runCommandline(trimG[1], make_bam = FALSE) Preprocessing with Trimmomatic targetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/trimmomatic/trimmomatic-pe\", package = \"systemPipeR\") trimM \u003c- loadWorkflow(targets = targetsPE, wf_file = \"trimmomatic-pe.cwl\", input_file = \"trimmomatic-pe.yml\", dir_path = dir_path) trimM \u003c- renderWF(trimM, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) trimM cmdlist(trimM)[1:2] output(trimM)[1:2] ## Run Single Machine Option trimM \u003c- runCommandline(trimM[1], make_bam = FALSE) FASTQ quality report The following seeFastq and seeFastqPlot functions generate and plot a series of useful quality statistics for a set of FASTQ files including per cycle quality box plots, base proportions, base-level quality trends, relative k-mer diversity, length and occurrence distribution of reads, number of reads above quality cutoffs and mean quality distribution.\nThe function seeFastq computes the quality statistics and stores the results in a relatively small list object that can be saved to disk with save() and reloaded with load() for later plotting. The argument klength specifies the k-mer length and batchsize the number of reads to a random sample from each FASTQ file.\nfqlist \u003c- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8) pdf(\"./results/fastqReport.pdf\", height = 18, width = 4 * length(fqlist)) seeFastqPlot(fqlist) dev.off() Figure 1: FASTQ quality report\n Parallelization of FASTQ quality report on a single machine with multiple cores.\nf \u003c- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) fqlist \u003c- bplapply(seq(along = trim), f, BPPARAM = MulticoreParam(workers = 4)) seeFastqPlot(unlist(fqlist, recursive = FALSE)) Parallelization of FASTQ quality report via scheduler (e.g. Slurm) across several compute nodes.\nlibrary(BiocParallel) library(batchtools) f \u003c- function(x) { library(systemPipeR) targetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/preprocessReads/trim-pe\", package = \"systemPipeR\") trim \u003c- loadWorkflow(targets = targetsPE, wf_file = \"trim-pe.cwl\", input_file = \"trim-pe.yml\", dir_path = dir_path) trim \u003c- renderWF(trim, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) } resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param \u003c- BatchtoolsParam(workers = 4, cluster = \"slurm\", template = \"batchtools.slurm.tmpl\", resources = resources) fqlist \u003c- bplapply(seq(along = trim), f, BPPARAM = param) seeFastqPlot(unlist(fqlist, recursive = FALSE)) NGS Alignment software After quality control, the sequence reads can be aligned to a reference genome or transcriptome database. The following sessions present some NGS sequence alignment software. Select the most accurate aligner and determining the optimal parameter for your custom data set project.\nFor all the following examples, it is necessary to install the respective software and export the PATH accordingly. If it is available Environment Module in the system, you can load all the request software with moduleload(args) function.\nAlignment with HISAT2 using SYSargs2 The following steps will demonstrate how to use the short read aligner Hisat2 (Kim, Langmead, and Salzberg 2015) in both interactive job submissions and batch submissions to queuing systems of clusters using the systemPipeR's new CWL command-line interface.\nThe parameter settings of the aligner are defined in the hisat2-mapping-se.cwl and hisat2-mapping-se.yml files. The following shows how to construct the corresponding SYSargs2 object, here args.\ntargets \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/hisat2/hisat2-se\", package = \"systemPipeR\") args \u003c- loadWorkflow(targets = targets, wf_file = \"hisat2-mapping-se.cwl\", input_file = \"hisat2-mapping-se.yml\", dir_path = dir_path) args \u003c- renderWF(args, inputvars = c(FileName = \"_FASTQ_PATH1_\", SampleName = \"_SampleName_\")) args ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 18 (M1A...V12B), targetsheader: 4 (lines) ## modules: 1 ## wf: 0, clt: 1, yamlinput: 7 (inputs) ## input: 18, output: 18 ## cmdlist: 18 ## Sub Steps: ## 1. hisat2-mapping-se (rendered: TRUE) cmdlist(args)[1:2] ## $M1A ## $M1A$`hisat2-mapping-se` ## [1] \"hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4\" ## ## ## $M1B ## $M1B$`hisat2-mapping-se` ## [1] \"hisat2 -S ./results/M1B.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446028_1.fastq.gz --threads 4\" output(args)[1:2] ## $M1A ## $M1A$`hisat2-mapping-se` ## [1] \"./results/M1A.sam\" ## ## ## $M1B ## $M1B$`hisat2-mapping-se` ## [1] \"./results/M1B.sam\" Subsetting SYSargs2 class slots for each workflow step.\nsubsetWF(args, slot = \"input\", subset = \"FileName\")[1:2] ## Subsetting the input files for this particular workflow ## M1A M1B ## \"./data/SRR446027_1.fastq.gz\" \"./data/SRR446028_1.fastq.gz\" subsetWF(args, slot = \"output\", subset = 1, index = 1)[1:2] ## Subsetting the output files for one particular step in the workflow ## M1A M1B ## \"./results/M1A.sam\" \"./results/M1B.sam\" subsetWF(args, slot = \"step\", subset = 1)[1] ## Subsetting the command-lines for one particular step in the workflow ## M1A ## \"hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4\" subsetWF(args, slot = \"output\", subset = 1, index = 1, delete = TRUE)[1] ## DELETING specific output files ## The subset cannot be deleted: no such file ## M1A ## \"./results/M1A.sam\" Build Hisat2 index.\ndir_path \u003c- system.file(\"extdata/cwl/hisat2/hisat2-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"hisat2-index.cwl\", input_file = \"hisat2-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) ## Run runCommandline(idx, make_bam = FALSE) Interactive job submissions in a single machine To simplify the short read alignment execution for the user, the command-line can be run with the runCommandline function. The execution will be on a single machine without submitting to a queuing system of a computer cluster. This way, the input FASTQ files will be processed sequentially. By default runCommandline auto detects SAM file outputs and converts them to sorted and indexed BAM files, using internally the Rsamtools package (Morgan et al. 2019). Besides, runCommandline allows the user to create a dedicated results folder for each workflow and a sub-folder for each sample defined in the targets file. This includes all the output and log files for each step. When these options are used, the output location will be updated by default and can be assigned to the same object.\nrunCommandline(args, make_bam = FALSE) ## generates alignments and writes *.sam files to ./results folder args \u003c- runCommandline(args, make_bam = TRUE) ## same as above but writes files and converts *.sam files to sorted and indexed BAM files. Assigning the new extention of the output files to the object args. If available, multiple CPU cores can be used for processing each file. The number of CPU cores (here 4) to use for each process is defined in the *.yml file. With yamlinput(args)['thread'] one can return this value from the SYSargs2 object.\nParallelization on clusters Alternatively, the computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing system is used for load balancing. For this the clusterRun function submits the computing requests to the scheduler using the run specifications defined by runCommandline.\nTo avoid over-subscription of CPU cores on the compute nodes, the value from yamlinput(args)['thread'] is passed on to the submission command, here ncpus in the resources list object. The number of independent parallel cluster processes is defined under the Njobs argument. The following example will run 18 processes in parallel using for each 4 CPU cores. If the resources available on a cluster allow running all 18 processes at the same time then the shown sample submission will utilize in total 72 CPU cores. Note, clusterRun can be used with most queueing systems as it is based on utilities from the batchtools package which supports the use of template files (*.tmpl) for defining the run parameters of different schedulers. To run the following code, one needs to have both a conf file (see .batchtools.conf.R samples here) and a template file (see *.tmpl samples here) for the queueing available on a system. The following example uses the sample conf and template files for the Slurm scheduler provided by this package.\nlibrary(batchtools) resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg \u003c- clusterRun(args, FUN = runCommandline, more.args = list(args = args, make_bam = TRUE, dir = FALSE), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 18, runid = \"01\", resourceList = resources) getStatus(reg = reg) waitForJobs(reg = reg) Check and update the output location if necessary.\nargs \u003c- output_update(args, dir = FALSE, replace = TRUE, extension = c(\".sam\", \".bam\")) ## Updates the output(args) to the right location in the subfolders output(args) Create new targets file To establish the connectivity to the next workflow step, one can write a new targets file with the writeTargetsout function. The new targets file serves as input to the next loadWorkflow and renderWF call.\nnames(clt(args)) writeTargetsout(x = args, file = \"default\", step = 1, new_col = \"FileName\", new_col_output_index = 1, overwrite = TRUE) Alignment with HISAT2 and SAMtools Alternatively, it possible to build an workflow with HISAT2 and SAMtools.\ntargets \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/workflow-hisat2/workflow-hisat2-se\", package = \"systemPipeR\") WF \u003c- loadWorkflow(targets = targets, wf_file = \"workflow_hisat2-se.cwl\", input_file = \"workflow_hisat2-se.yml\", dir_path = dir_path) WF \u003c- renderWF(WF, inputvars = c(FileName = \"_FASTQ_PATH1_\", SampleName = \"_SampleName_\")) WF cmdlist(WF)[1:2] output(WF)[1:2] Alignment with Tophat2 The NGS reads of this project can also be aligned against the reference genome sequence using Bowtie2/TopHat2 (Kim et al. 2013; Langmead and Salzberg 2012).\nBuild Bowtie2 index.\ndir_path \u003c- system.file(\"extdata/cwl/bowtie2/bowtie2-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"bowtie2-index.cwl\", input_file = \"bowtie2-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) ## Run in single machine runCommandline(idx, make_bam = FALSE) The parameter settings of the aligner are defined in the tophat2-mapping-pe.cwl and tophat2-mapping-pe.yml files. The following shows how to construct the corresponding SYSargs2 object, here tophat2PE.\ntargetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/tophat2/tophat2-pe\", package = \"systemPipeR\") tophat2PE \u003c- loadWorkflow(targets = targetsPE, wf_file = \"tophat2-mapping-pe.cwl\", input_file = \"tophat2-mapping-pe.yml\", dir_path = dir_path) tophat2PE \u003c- renderWF(tophat2PE, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) tophat2PE cmdlist(tophat2PE)[1:2] output(tophat2PE)[1:2] ## Run in single machine tophat2PE \u003c- runCommandline(tophat2PE[1], make_bam = TRUE) Parallelization on clusters.\nresources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg \u003c- clusterRun(tophat2PE, FUN = runCommandline, more.args = list(args = tophat2PE, make_bam = TRUE, dir = FALSE), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 18, runid = \"01\", resourceList = resources) waitForJobs(reg = reg) Create new targets file\nnames(clt(tophat2PE)) writeTargetsout(x = tophat2PE, file = \"default\", step = 1, new_col = \"tophat2PE\", new_col_output_index = 1, overwrite = TRUE) Alignment with Bowtie2 (e.g. for miRNA profiling) The following example runs Bowtie2 as a single process without submitting it to a cluster.\nBuilding the index:\ndir_path \u003c- system.file(\"extdata/cwl/bowtie2/bowtie2-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"bowtie2-index.cwl\", input_file = \"bowtie2-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) ## Run in single machine runCommandline(idx, make_bam = FALSE) Building all the command-line:\ntargetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/bowtie2/bowtie2-pe\", package = \"systemPipeR\") bowtiePE \u003c- loadWorkflow(targets = targetsPE, wf_file = \"bowtie2-mapping-pe.cwl\", input_file = \"bowtie2-mapping-pe.yml\", dir_path = dir_path) bowtiePE \u003c- renderWF(bowtiePE, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) bowtiePE cmdlist(bowtiePE)[1:2] output(bowtiePE)[1:2] Running all the jobs to computing nodes.\nresources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg \u003c- clusterRun(bowtiePE, FUN = runCommandline, more.args = list(args = bowtiePE, dir = FALSE), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 18, runid = \"01\", resourceList = resources) getStatus(reg = reg) Alternatively, it possible to run all the jobs in a single machine.\nbowtiePE \u003c- runCommandline(bowtiePE) Create new targets file.\nnames(clt(bowtiePE)) writeTargetsout(x = bowtiePE, file = \"default\", step = 1, new_col = \"bowtiePE\", new_col_output_index = 1, overwrite = TRUE) Alignment with BWA-MEM (e.g. for VAR-Seq) The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference\nBuild the index:\ndir_path \u003c- system.file(\"extdata/cwl/bwa/bwa-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"bwa-index.cwl\", input_file = \"bwa-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) # Indexes reference genome ## Run runCommandline(idx, make_bam = FALSE) Running the alignment:\ntargetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/bwa/bwa-pe\", package = \"systemPipeR\") bwaPE \u003c- loadWorkflow(targets = targetsPE, wf_file = \"bwa-pe.cwl\", input_file = \"bwa-pe.yml\", dir_path = dir_path) bwaPE \u003c- renderWF(bwaPE, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) bwaPE cmdlist(bwaPE)[1:2] output(bwaPE)[1:2] ## Single Machine bwaPE \u003c- runCommandline(args = bwaPE, make_bam = FALSE) ## Cluster library(batchtools) resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg \u003c- clusterRun(bwaPE, FUN = runCommandline, more.args = list(args = bwaPE, dir = FALSE), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 18, runid = \"01\", resourceList = resources) getStatus(reg = reg) Create new targets file.\nnames(clt(bwaPE)) writeTargetsout(x = bwaPE, file = \"default\", step = 1, new_col = \"bwaPE\", new_col_output_index = 1, overwrite = TRUE) Alignment with Rsubread (e.g. for RNA-Seq) The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.\n## Build the index: dir_path \u003c- system.file(\"extdata/cwl/rsubread/rsubread-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"rsubread-index.cwl\", input_file = \"rsubread-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) runCommandline(args = idx, make_bam = FALSE) ## Running the alignment: targets \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/rsubread/rsubread-se\", package = \"systemPipeR\") rsubread \u003c- loadWorkflow(targets = targets, wf_file = \"rsubread-mapping-se.cwl\", input_file = \"rsubread-mapping-se.yml\", dir_path = dir_path) rsubread \u003c- renderWF(rsubread, inputvars = c(FileName = \"_FASTQ_PATH1_\", SampleName = \"_SampleName_\")) rsubread cmdlist(rsubread)[1] ## Single Machine rsubread \u003c- runCommandline(args = rsubread[1]) Create new targets file.\nnames(clt(rsubread)) writeTargetsout(x = rsubread, file = \"default\", step = 1, new_col = \"rsubread\", new_col_output_index = 1, overwrite = TRUE) Alignment with gsnap (e.g. for VAR-Seq and RNA-Seq) Another R-based short read aligner is gsnap from the gmapR package (Wu and Nacu 2010). The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.\n## Build the index: dir_path \u003c- system.file(\"extdata/cwl/gsnap/gsnap-idx\", package = \"systemPipeR\") idx \u003c- loadWorkflow(targets = NULL, wf_file = \"gsnap-index.cwl\", input_file = \"gsnap-index.yml\", dir_path = dir_path) idx \u003c- renderWF(idx) idx cmdlist(idx) runCommandline(args = idx, make_bam = FALSE) ## Running the alignment: targetsPE \u003c- system.file(\"extdata\", \"targetsPE.txt\", package = \"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/gsnap/gsnap-pe\", package = \"systemPipeR\") gsnap \u003c- loadWorkflow(targets = targetsPE, wf_file = \"gsnap-mapping-pe.cwl\", input_file = \"gsnap-mapping-pe.yml\", dir_path = dir_path) gsnap \u003c- renderWF(gsnap, inputvars = c(FileName1 = \"_FASTQ_PATH1_\", FileName2 = \"_FASTQ_PATH2_\", SampleName = \"_SampleName_\")) gsnap cmdlist(gsnap)[1] output(gsnap)[1] ## Cluster library(batchtools) resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg \u003c- clusterRun(gsnap, FUN = runCommandline, more.args = list(args = gsnap, make_bam = FALSE), conffile = \".batchtools.conf.R\", template = \"batchtools.slurm.tmpl\", Njobs = 18, runid = \"01\", resourceList = resources) getStatus(reg = reg) gsnap \u003c- output_update(gsnap, dir = FALSE, replace = TRUE, extension = c(\".sam\", \".bam\")) Create new targets file.\nnames(clt(gsnap)) writeTargetsout(x = gsnap, file = \"default\", step = 1, new_col = \"gsnap\", new_col_output_index = 1, overwrite = TRUE) Create symbolic links for viewing BAM files in IGV The genome browser IGV supports reading of indexed/sorted BAM files via web URLs. This way it can be avoided to create unnecessary copies of these large files. To enable this approach, an HTML directory with Http access needs to be available in the user account (e.g. home/publichtml) of a system. If this is not the case then the BAM files need to be moved or copied to the system where IGV runs. In the following, htmldir defines the path to the HTML directory with http access where the symbolic links to the BAM files will be stored. The corresponding URLs will be written to a text file specified under the _urlfile_ argument.\nsymLink2bam(sysargs = args, htmldir = c(\"~/.html/\", \"somedir/\"), urlbase = \"http://myserver.edu/~username/\", urlfile = \"IGVurl.txt\") Read counting for mRNA profiling experiments Create txdb (needs to be done only once).\nlibrary(GenomicFeatures) txdb \u003c- makeTxDbFromGFF(file = \"data/tair10.gff\", format = \"gff\", dataSource = \"TAIR\", organism = \"Arabidopsis thaliana\") saveDb(txdb, file = \"./data/tair10.sqlite\") The following performs read counting with summarizeOverlaps in parallel mode with multiple cores.\nlibrary(BiocParallel) txdb \u003c- loadDb(\"./data/tair10.sqlite\") eByg \u003c- exonsBy(txdb, by = \"gene\") outpaths \u003c- subsetWF(args, slot = \"output\", subset = 1, index = 1) bfl \u003c- BamFileList(outpaths, yieldSize = 50000, index = character()) multicoreParam \u003c- MulticoreParam(workers = 4) register(multicoreParam) registered() counteByg \u003c- bplapply(bfl, function(x) summarizeOverlaps(eByg, x, mode = \"Union\", ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE)) # Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data # set 'singleEnd=FALSE' countDFeByg \u003c- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts) rownames(countDFeByg) \u003c- names(rowRanges(counteByg[[1]])) colnames(countDFeByg) \u003c- names(bfl) rpkmDFeByg \u003c- apply(countDFeByg, 2, function(x) returnRPKM(counts = x, ranges = eByg)) write.table(countDFeByg, \"results/countDFeByg.xls\", col.names = NA, quote = FALSE, sep = \"\\t\") write.table(rpkmDFeByg, \"results/rpkmDFeByg.xls\", col.names = NA, quote = FALSE, sep = \"\\t\") Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as edgeR or DESeq2, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, e.g. manually comparing the expression levels of different genes or features.\nRead counting with summarizeOverlaps using multiple nodes of a cluster.\nlibrary(BiocParallel) f \u003c- function(x) { library(systemPipeR) library(BiocParallel) library(GenomicFeatures) txdb \u003c- loadDb(\"./data/tair10.sqlite\") eByg \u003c- exonsBy(txdb, by = \"gene\") args \u003c- systemArgs(sysma = \"param/tophat.param\", mytargets = \"targets.txt\") outpaths \u003c- subsetWF(args, slot = \"output\", subset = 1, index = 1) bfl \u003c- BamFileList(outpaths, yieldSize = 50000, index = character()) summarizeOverlaps(eByg, bfl[x], mode = \"Union\", ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE) } resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param \u003c- BatchtoolsParam(workers = 4, cluster = \"slurm\", template = \"batchtools.slurm.tmpl\", resources = resources) counteByg \u003c- bplapply(seq(along = args), f, BPPARAM = param) countDFeByg \u003c- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts) rownames(countDFeByg) \u003c- names(rowRanges(counteByg[[1]])) colnames(countDFeByg) \u003c- names(outpaths) Useful commands for monitoring the progress of submitted jobs\ngetStatus(reg = reg) outpaths \u003c- subsetWF(args, slot = \"output\", subset = 1, index = 1) file.exists(outpaths) sapply(1:length(outpaths), function(x) loadResult(reg, id = x)) # Works after job completion Read and alignment count stats Generate a table of read and alignment counts for all samples.\nread_statsDF \u003c- alignStats(args) write.table(read_statsDF, \"results/alignStats.xls\", row.names = FALSE, quote = FALSE, sep = \"\\t\") The following shows the first four lines of the sample alignment stats file provided by the systemPipeR package. For simplicity the number of PE reads is multiplied here by 2 to approximate proper alignment frequencies where each read in a pair is counted.\nread.table(system.file(\"extdata\", \"alignStats.xls\", package = \"systemPipeR\"), header = TRUE)[1:4, ] ## FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary ## 1 M1A 192918 177961 92.24697 177961 92.24697 ## 2 M1B 197484 159378 80.70426 159378 80.70426 ## 3 A1A 189870 176055 92.72397 176055 92.72397 ## 4 A1B 188854 147768 78.24457 147768 78.24457 Parallelization of read/alignment stats on single machine with multiple cores.\nf \u003c- function(x) alignStats(args[x]) read_statsList \u003c- bplapply(seq(along = args), f, BPPARAM = MulticoreParam(workers = 8)) read_statsDF \u003c- do.call(\"rbind\", read_statsList) Parallelization of read/alignment stats via scheduler (e.g. Slurm) across several compute nodes.\nlibrary(BiocParallel) library(batchtools) f \u003c- function(x) { library(systemPipeR) targets \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") dir_path \u003c- \"param/cwl/hisat2/hisat2-se\" ## TODO: replace path to system.file args \u003c- loadWorkflow(targets = targets, wf_file = \"hisat2-mapping-se.cwl\", input_file = \"hisat2-mapping-se.yml\", dir_path = dir_path) args \u003c- renderWF(args, inputvars = c(FileName = \"_FASTQ_PATH1_\", SampleName = \"_SampleName_\")) args \u003c- output_update(args, dir = FALSE, replace = TRUE, extension = c(\".sam\", \".bam\")) alignStats(args[x]) } resources \u003c- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param \u003c- BatchtoolsParam(workers = 4, cluster = \"slurm\", template = \"batchtools.slurm.tmpl\", resources = resources) read_statsList \u003c- bplapply(seq(along = args), f, BPPARAM = param) read_statsDF \u003c- do.call(\"rbind\", read_statsList) Read counting for miRNA profiling experiments Download miRNA genes from miRBase.\nsystem(\"wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/\") gff \u003c- import.gff(\"./data/My_species.gff3\") gff \u003c- split(gff, elementMetadata(gff)$ID) bams \u003c- names(bampaths) names(bams) \u003c- targets$SampleName bfl \u003c- BamFileList(bams, yieldSize = 50000, index = character()) countDFmiR \u003c- summarizeOverlaps(gff, bfl, mode = \"Union\", ignore.strand = FALSE, inter.feature = FALSE) # Note: inter.feature=FALSE important since pre and mature miRNA ranges overlap rpkmDFmiR \u003c- apply(countDFmiR, 2, function(x) returnRPKM(counts = x, gffsub = gff)) write.table(assays(countDFmiR)$counts, \"results/countDFmiR.xls\", col.names = NA, quote = FALSE, sep = \"\\t\") write.table(rpkmDFmiR, \"results/rpkmDFmiR.xls\", col.names = NA, quote = FALSE, sep = \"\\t\") Correlation analysis of samples The following computes the sample-wise Spearman correlation coefficients from the rlog (regularized-logarithm) transformed expression values generated with the DESeq2 package. After transformation to a distance matrix, hierarchical clustering is performed with the hclust function and the result is plotted as a dendrogram (sample_tree.pdf).\nlibrary(DESeq2, warn.conflicts = FALSE, quietly = TRUE) library(ape, warn.conflicts = FALSE) countDFpath \u003c- system.file(\"extdata\", \"countDFeByg.xls\", package = \"systemPipeR\") countDF \u003c- as.matrix(read.table(countDFpath)) colData \u003c- data.frame(row.names = targets.as.df(targets(args))$SampleName, condition = targets.as.df(targets(args))$Factor) dds \u003c- DESeqDataSetFromMatrix(countData = countDF, colData = colData, design = ~condition) ## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in ## design formula are characters, converting to factors d \u003c- cor(assay(rlog(dds)), method = \"spearman\") hc \u003c- hclust(dist(1 - d)) plot.phylo(as.phylo(hc), type = \"p\", edge.col = 4, edge.width = 3, show.node.label = TRUE, no.margin = TRUE) Figure 2: Correlation dendrogram of samples for rlog values.\n Alternatively, the clustering can be performed with RPKM normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.\nrpkmDFeBygpath \u003c- system.file(\"extdata\", \"rpkmDFeByg.xls\", package = \"systemPipeR\") rpkmDFeByg \u003c- read.table(rpkmDFeBygpath, check.names = FALSE) rpkmDFeByg \u003c- rpkmDFeByg[rowMeans(rpkmDFeByg) \u003e 50, ] d \u003c- cor(rpkmDFeByg, method = \"spearman\") hc \u003c- hclust(as.dist(1 - d)) plot.phylo(as.phylo(hc), type = \"p\", edge.col = \"blue\", edge.width = 2, show.node.label = TRUE, no.margin = TRUE) DEG analysis with edgeR The following *run_edgeR* function is a convenience wrapper for identifying differentially expressed genes (DEGs) in batch mode with *edgeR’s GML method (Robinson, McCarthy, and Smyth 2010) for any number of pairwise sample comparisons specified under the cmp* argument. Users are strongly encouraged to consult the edgeR vignette for more detailed information on this topic and how to properly run edgeR on data sets with more complex experimental designs.\ntargetspath \u003c- system.file(\"extdata\", \"targets.txt\", package = \"systemPipeR\") targets \u003c- read.delim(targetspath, comment = \"#\") cmp \u003c- readComp(file = targetspath, format = \"matrix\", delim = \"-\") cmp[[1]] ## [,1] [,2] ## [1,] \"M1\" \"A1\" ## [2,] \"M1\" \"V1\" ## [3,] \"A1\" \"V1\" ## [4,] \"M6\" \"A6\" ## [5,] \"M6\" \"V6\" ## [6,] \"A6\" \"V6\" ## [7,] \"M12\" \"A12\" ## [8,] \"M12\" \"V12\" ## [9,] \"A12\" \"V12\" countDFeBygpath \u003c- system.file(\"extdata\", \"countDFeByg.xls\", package = \"systemPipeR\") countDFeByg \u003c- read.delim(countDFeBygpath, row.names = 1) edgeDF \u003c- run_edgeR(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], independent = FALSE, mdsplot = \"\") ## Loading required namespace: edgeR ## Disp = 0.21829 , BCV = 0.4672 Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the FDR value has been set to a relatively high threshold (here 10%). More commonly used FDR cutoffs are 1% or 5%. The definition of ‘up’ and ‘down’ is given in the corresponding help file. To open it, type ?filterDEGs in the R console.\nDEG_list \u003c- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10)) Figure 7: Up and down regulated DEGs identified by edgeR.\n names(DEG_list) ## [1] \"UporDown\" \"Up\" \"Down\" \"Summary\" DEG_list$Summary[1:4, ] ## Comparisons Counts_Up_or_Down Counts_Up Counts_Down ## M1-A1 M1-A1 0 0 0 ## M1-V1 M1-V1 1 1 0 ## A1-V1 A1-V1 1 1 0 ## M6-A6 M6-A6 0 0 0 DEG analysis with DESeq2 The following *run_DESeq2* function is a convenience wrapper for identifying DEGs in batch mode with DESeq2* (Love, Huber, and Anders 2014) for any number of pairwise sample comparisons specified under the cmp* argument. Users are strongly encouraged to consult the DESeq2 vignette for more detailed information on this topic and how to properly run DESeq2 on data sets with more complex experimental designs.\ndegseqDF \u003c- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], independent = FALSE) ## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in ## design formula are characters, converting to factors Filter and plot DEG results for up and down-regulated genes.\nDEG_list2 \u003c- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10)) Figure 8: Up and down regulated DEGs identified by DESeq2.\n Venn Diagrams The function overLapper can compute Venn intersects for large numbers of sample sets (up to 20 or more) and vennPlot can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).\nvennsetup \u003c- overLapper(DEG_list$Up[6:9], type = \"vennsets\") vennsetdown \u003c- overLapper(DEG_list$Down[6:9], type = \"vennsets\") vennPlot(list(vennsetup, vennsetdown), mymain = \"\", mysub = \"\", colmode = 2, ccol = c(\"blue\", \"red\")) Figure 9: Venn Diagram for 4 Up and Down DEG Sets.\n GO term enrichment analysis of DEGs Obtain gene-to-GO mappings The following shows how to obtain gene-to-GO mappings from biomaRt (here for A. thaliana) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s *.db genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the load function as shown in the next subsection.\nlibrary(\"biomaRt\") listMarts() # To choose BioMart database listMarts(host = \"plants.ensembl.org\") m \u003c- useMart(\"plants_mart\", host = \"plants.ensembl.org\") listDatasets(m) m \u003c- useMart(\"plants_mart\", dataset = \"athaliana_eg_gene\", host = \"plants.ensembl.org\") listAttributes(m) # Choose data types you want to download go \u003c- getBM(attributes = c(\"go_id\", \"tair_locus\", \"namespace_1003\"), mart = m) go \u003c- go[go[, 3] != \"\", ] go[, 3] \u003c- as.character(go[, 3]) go[go[, 3] == \"molecular_function\", 3] \u003c- \"F\" go[go[, 3] == \"biological_process\", 3] \u003c- \"P\" go[go[, 3] == \"cellular_component\", 3] \u003c- \"C\" go[1:4, ] dir.create(\"./data/GO\") write.table(go, \"data/GO/GOannotationsBiomart_mod.txt\", quote = FALSE, row.names = FALSE, col.names = FALSE, sep = \"\\t\") catdb \u003c- makeCATdb(myfile = \"data/GO/GOannotationsBiomart_mod.txt\", lib = NULL, org = \"\", colno = c(1, 2, 3), idconv = NULL) save(catdb, file = \"data/GO/catdb.RData\") Batch GO term enrichment analysis Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the FDR filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the GOCluster_Report function. When method=\"all\", it returns all GO terms passing the p-value cutoff specified under the cutoff arguments. When method=\"slim\", it returns only the GO terms specified under the myslimv argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.\nload(\"data/GO/catdb.RData\") DEG_list \u003c- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 50), plot = FALSE) up_down \u003c- DEG_list$UporDown names(up_down) \u003c- paste(names(up_down), \"_up_down\", sep = \"\") up \u003c- DEG_list$Up names(up) \u003c- paste(names(up), \"_up\", sep = \"\") down \u003c- DEG_list$Down names(down) \u003c- paste(names(down), \"_down\", sep = \"\") DEGlist \u003c- c(up_down, up, down) DEGlist \u003c- DEGlist[sapply(DEGlist, length) \u003e 0] BatchResult \u003c- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = \"all\", id_type = \"gene\", CLSZ = 2, cutoff = 0.9, gocats = c(\"MF\", \"BP\", \"CC\"), recordSpecGO = NULL) library(\"biomaRt\") m \u003c- useMart(\"plants_mart\", dataset = \"athaliana_eg_gene\", host = \"plants.ensembl.org\") goslimvec \u003c- as.character(getBM(attributes = c(\"goslim_goa_accession\"), mart = m)[, 1]) BatchResultslim \u003c- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = \"slim\", id_type = \"gene\", myslimv = goslimvec, CLSZ = 10, cutoff = 0.01, gocats = c(\"MF\", \"BP\", \"CC\"), recordSpecGO = NULL) Plot batch GO term results The data.frame generated by GOCluster_Report can be plotted with the goBarplot function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.\ngos \u003c- BatchResultslim[grep(\"M6-V6_up_down\", BatchResultslim$CLID), ] gos \u003c- BatchResultslim pdf(\"GOslimbarplotMF.pdf\", height = 8, width = 10) goBarplot(gos, gocat = \"MF\") dev.off() goBarplot(gos, gocat = \"BP\") goBarplot(gos, gocat = \"CC\") Figure 10: GO Slim Barplot for MF Ontology.\n Clustering and heat maps The following example performs hierarchical clustering on the rlog transformed expression matrix subsetted by the DEGs identified in the above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.\nlibrary(pheatmap) geneids \u003c- unique(as.character(unlist(DEG_list[[1]]))) y \u003c- assay(rlog(dds))[geneids, ] pdf(\"heatmap1.pdf\") pheatmap(y, scale = \"row\", clustering_distance_rows = \"correlation\", clustering_distance_cols = \"correlation\") dev.off() Figure 11: Heat map with hierarchical clustering dendrograms of DEGs.\n References Kim, Daehwan, Ben Langmead, and Steven L Salzberg. 2015. “HISAT: A Fast Spliced Aligner with Low Memory Requirements.” Nat. Methods 12 (4): 357–60.\n Kim, Daehwan, Geo Pertea, Cole Trapnell, Harold Pimentel, Ryan Kelley, and Steven L Salzberg. 2013. “TopHat2: Accurate Alignment of Transcriptomes in the Presence of Insertions, Deletions and Gene Fusions.” Genome Biol. 14 (4): R36. https://doi.org/10.1186/gb-2013-14-4-r36.\n Langmead, Ben, and Steven L Salzberg. 2012. “Fast Gapped-Read Alignment with Bowtie 2.” Nat. Methods 9 (4): 357–59. https://doi.org/10.1038/nmeth.1923.\n Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-seq Data with DESeq2.” Genome Biol. 15 (12): 550. https://doi.org/10.1186/s13059-014-0550-8.\n Morgan, Martin, Hervé Pagès, Valerie Obenchain, and Nathaniel Hayden. 2019. Rsamtools: Binary Alignment (BAM), FASTA, Variant Call (BCF), and Tabix File Import. http://bioconductor.org/packages/Rsamtools.\n Robinson, M D, D J McCarthy, and G K Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616.\n Wu, T D, and S Nacu. 2010. “Fast and SNP-tolerant Detection of Complex Variants and Splicing in Short Reads.” Bioinformatics 26 (7): 873–81. https://doi.org/10.1093/bioinformatics/btq057.\n ","categories":"","description":"","excerpt":"document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/steps/","tags":"","title":"Workflow steps overview"},{"body":" SPS Canvas is a place to display and edit scrennshots from different plots. To start to use Canvas, you need to take some screenshots but clicking “To Canvas” buttons on different tabs/modules. After clicking, the screenshots will be automatically sent from these places to this Canvas.\nAfter SPS v1.1.0 this Canvas feature has been provided as a separate package {drawer}. If you like this feature and want to use outside of SPS, install {drawer}. It is fully compatible with both Shiny and R markdown.\nPrepare plots In other SPS tabs, adjust your plots to the optimal size by dragging the corner:\n Then use the ‵toCanvas‵ button of that plot to send a screenshot of current plot to the Canvas. Or you can click on the “down arrow” to save it to edit in other tools.\n Use the Canvas Figure 9 Canvas\n The Canvas area. Canvas drawing grids. By default, your objects are limited to these drawing grids, but you can change it from top options inside “canvas”. The grid area size is automatically calculated to fit your screen size when you start SPS. Object information. When you select any object on the Canvas, a bounding box will show to display the object’s dimensions, scale, angle and other information. You can disable them in the “View” menu To edit your screenshots, simply drag your screenshots from left to Canvas working area. You can add text or titles, and change the font color, decorations in this panel. Different Canvas options. Several menus and buttons help you to better control the Canvas. Hover your mouse on buttons will display a tooltip of their functionality. Keyboard shortcuts are also enabled with SPS Canvas. Go to “help” menu to see these options.\nSupport Canvas only works on recent browsers versions, like Chrome, latest Edge, Firefox. IE is not supported. Also, some browser privacy extensions will block javascript and HTML5 canvas fingerprint. This will cause the screenshot to be blank.\n","categories":"","description":"","excerpt":" SPS Canvas is a place to display and edit scrennshots from different …","ref":"/sps/canvas/","tags":"","title":"Canvas"},{"body":" SPS interative guides (tutorials) SPS provides some interactive guides for users to familiarize the app. There is a very simple one-step welcome guide that will initialize everytime on app start to indicate where the guide dropdown is (top-right corner).\n Welcome guide on start \nBy clicking the guide dropdown menu, you can open up the list of available guides. By default, we only proivde a main SPS guide.\n Guide dropdown menu \nIf any of the guide is clicked in the dropdown, the corresponding interactive guide will start.\n Guide started You can click “Next”, “Previous” or “Close” to navigate the guide or close the guide.\nCustom guide To build and provide your custom guides to your users, there is file guide_content.R created on SPS project initialization under the R folder: /R/guide_content.R. This is the place to define your own guide.\nThis file look like this:\n#################### Define your custom SPS tutorials ########################## # use `shinydashboardPlus::messageItem` to add your tutorials UI to this list guide_ui \u003c- list( ## An example is provided below shinydashboardPlus::messageItem( inputId = \"guide_main\", from = \"Main Guide\", icon = icon('home'), message = \"Brief introduction\" ) ) # use `cicerone::Cicerone$new()` to add your tutorials content to this list # See help `?cicerone::Cicerone` # A named list, each item's name must match the `inputId` in UI to trigger it in app. guide_content \u003c- try(list( ## An example is provided below, replace or add your own to the list guide_main = cicerone::Cicerone$new(overlay_click_next = TRUE)$ step(el = \"sidebarItemExpanded\", title = \"SPS tabs\", description = \"Browse SPS functionalities as tabs from the left\", position = \"right-center\")$ ... )) There are two parts that you need to define: UI and actual guide content.\nUI UI is what users see inside the dropdown menu. Guides UI needs to be stored in a list and each item should be a shinydashboardPlus::messageItem.\n inputId must be unique. from is the short description of the guide. icon should be a call of shiny::icon(), the icon of the guide in dropdown menu message: short description of the guide in dropdown menu To add multiple guides' UI, for example:\nguide_ui \u003c- list( ## An example is provided below shinydashboardPlus::messageItem( inputId = \"guide1\", ... ), shinydashboardPlus::messageItem( inputId = \"guide2\", ... ), ... ) Guide content The guide content is defined with the {cicerone{blk}} package with cicerone::Cicerone R6 class and also in a named list.\nThe name of each item in a list must match the name of inputId in guide UI. For example, we have two guides\nguide_ui \u003c- list( ## An example is provided below shinydashboardPlus::messageItem( inputId = \"guide1\", ... ), shinydashboardPlus::messageItem( inputId = \"guide2\", ... ), ... ) guide_content \u003c- try(list( guide1 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ ..., guide2 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ ... )) The “guide1” of inputId in the guide_ui must match “guide1” in guide_content list.\nThe “guide2” of inputId in the guide_ui must match “guide2” in guide_content list.\nDefine guide content How to define the guide content will not be expanded here, read details in the {cicerone{blk}} package manual. Here are some key points:\n The cicerone::Cicerone is R6 class, and it is obejct oriented, so you need to use cicerone::Cicerone$new() method to create a new object before you can add any guide step. R6 methods calling can be chained together, like how to define steps: guide_content \u003c- try(list( guide1 = cicerone::Cicerone$new()$ # chain object creation with step defining step(...)$ # chain step1 to step2 step(...)$ # step2 to step3 step(...)$ # step3 to step4 step(...) # DO NOT use `$` for the last step )) If you follow the manual of {cicerone} to define steps, the guide will look like this when users click it.\n Cicerone steps ","categories":"","description":"","excerpt":" SPS interative guides (tutorials) SPS provides some interactive …","ref":"/sps/adv_features/guide/","tags":"","title":"SPS Guide"},{"body":"document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i Workflow templates The intended way of running systemPipeR workflows is via *.Rmd files, which can be executed either line-wise in interactive mode or with a single command from R or the command-line. This way comprehensive and reproducible analysis reports can be generated in PDF or HTML format in a fully automated manner by making use of the highly functional reporting utilities available for R. The following shows how to execute a workflow (e.g., systemPipeRNAseq.Rmd) from the command-line.\nRscript -e \"rmarkdown::render('systemPipeRNAseq.Rmd')\" Templates for setting up custom project reports are provided as **.Rmd* files by the helper package *systemPipeRdata* and in the vignettes subdirectory of systemPipeR. The corresponding HTML of these report templates are available here: systemPipeRNAseq, systemPipeRIBOseq, systemPipeChIPseq and systemPipeVARseq. To work with *.Rnw* or *.Rmd* files efficiently, basic knowledge of Sweave or knitr and Latex or R Markdown v2 is required.\nRNA-Seq sample Load the RNA-Seq sample workflow into your current working directory.\nlibrary(systemPipeRdata) genWorkenvir(workflow = \"rnaseq\") setwd(\"rnaseq\") Run workflow Next, run the chosen sample workflow systemPipeRNAseq (PDF, Rmd) by executing from the command-line make -B within the rnaseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.\nThe workflow includes following steps:\n Read preprocessing Quality filtering (trimming) FASTQ quality report Alignments: Tophat2 (or any other RNA-Seq aligner) Alignment stats Read counting Sample-wise correlation analysis Analysis of differentially expressed genes (DEGs) GO term enrichment analysis Gene-wise clustering ChIP-Seq sample Load the ChIP-Seq sample workflow into your current working directory.\nlibrary(systemPipeRdata) genWorkenvir(workflow = \"chipseq\") setwd(\"chipseq\") Run workflow Next, run the chosen sample workflow systemPipeChIPseq_single (PDF, Rmd) by executing from the command-line make -B within the chipseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.\nThe workflow includes the following steps:\n Read preprocessing Quality filtering (trimming) FASTQ quality report Alignments: Bowtie2 or rsubread Alignment stats Peak calling: MACS2, BayesPeak Peak annotation with genomic context Differential binding analysis GO term enrichment analysis Motif analysis VAR-Seq sample VAR-Seq workflow for the single machine Load the VAR-Seq sample workflow into your current working directory.\nlibrary(systemPipeRdata) genWorkenvir(workflow = \"varseq\") setwd(\"varseq\") Run workflow Next, run the chosen sample workflow systemPipeVARseq_single (PDF, Rmd) by executing from the command-line make -B within the varseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.\nThe workflow includes following steps:\n Read preprocessing Quality filtering (trimming) FASTQ quality report Alignments: gsnap, bwa Variant calling: VariantTools, GATK, BCFtools Variant filtering: VariantTools and VariantAnnotation Variant annotation: VariantAnnotation Combine results from many samples Summary statistics of samples VAR-Seq workflow for computer cluster The workflow template provided for this step is called systemPipeVARseq.Rmd (PDF, Rmd). It runs the above VAR-Seq workflow in parallel on multiple compute nodes of an HPC system using Slurm as the scheduler.\nRibo-Seq sample Load the Ribo-Seq sample workflow into your current working directory.\nlibrary(systemPipeRdata) genWorkenvir(workflow = \"riboseq\") setwd(\"riboseq\") Run workflow Next, run the chosen sample workflow systemPipeRIBOseq (PDF, Rmd) by executing from the command-line make -B within the ribseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.\nThe workflow includes following steps:\n Read preprocessing Adaptor trimming and quality filtering FASTQ quality report Alignments: Tophat2 (or any other RNA-Seq aligner) Alignment stats Compute read distribution across genomic features Adding custom features to the workflow (e.g. uORFs) Genomic read coverage along with transcripts Read counting Sample-wise correlation analysis Analysis of differentially expressed genes (DEGs) GO term enrichment analysis Gene-wise clustering Differential ribosome binding (translational efficiency) Version information Note: the most recent version of this tutorial can be found here.\nsessionInfo() ## R version 4.0.3 (2020-10-10) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS ## ## Matrix products: default ## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-4.0.3/lib/libRlapack.so ## ## locale: ## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C ## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 ## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 ## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C ## [9] LC_ADDRESS=C LC_TELEPHONE=C ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C ## ## attached base packages: ## [1] stats4 parallel stats graphics grDevices utils datasets ## [8] methods base ## ## other attached packages: ## [1] magrittr_2.0.1 batchtools_0.9.15 ## [3] ape_5.4-1 ggplot2_3.3.3 ## [5] systemPipeR_1.25.6 ShortRead_1.48.0 ## [7] GenomicAlignments_1.26.0 SummarizedExperiment_1.20.0 ## [9] Biobase_2.50.0 MatrixGenerics_1.2.1 ## [11] matrixStats_0.58.0 BiocParallel_1.24.1 ## [13] Rsamtools_2.6.0 Biostrings_2.58.0 ## [15] XVector_0.30.0 GenomicRanges_1.42.0 ## [17] GenomeInfoDb_1.26.2 IRanges_2.24.1 ## [19] S4Vectors_0.28.1 BiocGenerics_0.36.0 ## [21] BiocStyle_2.18.1 ## ## loaded via a namespace (and not attached): ## [1] colorspace_2.0-0 rjson_0.2.20 hwriter_1.3.2 ## [4] ellipsis_0.3.1 bit64_4.0.5 AnnotationDbi_1.52.0 ## [7] xml2_1.3.2 codetools_0.2-18 splines_4.0.3 ## [10] cachem_1.0.3 knitr_1.31 jsonlite_1.7.2 ## [13] annotate_1.68.0 GO.db_3.12.1 dbplyr_2.1.0 ## [16] png_0.1-7 pheatmap_1.0.12 graph_1.68.0 ## [19] BiocManager_1.30.10 compiler_4.0.3 httr_1.4.2 ## [22] GOstats_2.56.0 backports_1.2.1 assertthat_0.2.1 ## [25] Matrix_1.3-2 fastmap_1.1.0 limma_3.46.0 ## [28] formatR_1.7 htmltools_0.5.1.1 prettyunits_1.1.1 ## [31] tools_4.0.3 gtable_0.3.0 glue_1.4.2 ## [34] GenomeInfoDbData_1.2.4 Category_2.56.0 dplyr_1.0.4 ## [37] rsvg_2.1 rappdirs_0.3.3 V8_3.4.0 ## [40] Rcpp_1.0.6 vctrs_0.3.6 nlme_3.1-152 ## [43] blogdown_1.1.7 rtracklayer_1.50.0 xfun_0.21 ## [46] stringr_1.4.0 lifecycle_1.0.0.9000 XML_3.99-0.5 ## [49] edgeR_3.32.1 zlibbioc_1.36.0 scales_1.1.1 ## [52] BSgenome_1.58.0 VariantAnnotation_1.36.0 hms_1.0.0 ## [55] RBGL_1.66.0 RColorBrewer_1.1-2 yaml_2.2.1 ## [58] curl_4.3 memoise_2.0.0 biomaRt_2.46.3 ## [61] latticeExtra_0.6-29 stringi_1.5.3 RSQLite_2.2.3 ## [64] genefilter_1.72.1 checkmate_2.0.0 GenomicFeatures_1.42.1 ## [67] DOT_0.1 rlang_0.4.10 pkgconfig_2.0.3 ## [70] bitops_1.0-6 evaluate_0.14 lattice_0.20-41 ## [73] purrr_0.3.4 bit_4.0.4 tidyselect_1.1.0 ## [76] GSEABase_1.52.1 AnnotationForge_1.32.0 bookdown_0.21 ## [79] R6_2.5.0 generics_0.1.0 base64url_1.4 ## [82] DelayedArray_0.16.1 DBI_1.1.1 withr_2.4.1 ## [85] pillar_1.4.7 survival_3.2-7 RCurl_1.98-1.2 ## [88] tibble_3.0.6 crayon_1.4.1 BiocFileCache_1.14.0 ## [91] rmarkdown_2.6 jpeg_0.1-8.1 progress_1.2.2 ## [94] locfit_1.5-9.4 grid_4.0.3 data.table_1.13.6 ## [97] blob_1.2.1 Rgraphviz_2.34.0 digest_0.6.27 ## [100] xtable_1.8-4 brew_1.0-6 openssl_1.4.3 ## [103] munsell_0.5.0 askpass_1.1 References ","categories":"","description":"","excerpt":"document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/templates/","tags":"","title":"Workflow Templates"},{"body":"document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i CWL syntax This section will introduce how CWL describes command-line tools and the specification and terminology of each file. For complete documentation, please check the CommandLineTools documentation here and here for Workflows and the user guide here.\nCWL command-line specifications are written in YAML format.\nIn CWL, files with the extension .cwl define the parameters of a chosen command-line step or workflow, while files with the extension .yml define the input variables of command-line steps.\nCWL CommandLineTool CommandLineTool by CWL definition is a standalone process, with no interaction if other programs, execute a program, and produce output.\nLet’s explore the *.cwl file:\ndir_path \u003c- system.file(\"extdata/cwl\", package = \"systemPipeR\") cwl \u003c- yaml::read_yaml(file.path(dir_path, \"example/example.cwl\")) The cwlVersion component shows the CWL specification version used by the document. The class component shows this document describes a CommandLineTool. Note that CWL has another class, called Workflow which represents a union of one or more command-line tools together. cwl[1:2] ## $cwlVersion ## [1] \"v1.0\" ## ## $class ## [1] \"CommandLineTool\" baseCommand component provides the name of the software that we desire to execute. cwl[3] ## $baseCommand ## [1] \"echo\" The inputs section provides the input information to run the tool. Important components of this section are: id: each input has an id describing the input name; type: describe the type of input value (string, int, long, float, double, File, Directory or Any); inputBinding: It is optional. This component indicates if the input parameter should appear on the command-line. If this component is missing when describing an input parameter, it will not appear in the command-line but can be used to build the command-line. cwl[4] ## $inputs ## $inputs$message ## $inputs$message$type ## [1] \"string\" ## ## $inputs$message$inputBinding ## $inputs$message$inputBinding$position ## [1] 1 ## ## ## ## $inputs$SampleName ## $inputs$SampleName$type ## [1] \"string\" ## ## ## $inputs$results_path ## $inputs$results_path$type ## [1] \"Directory\" The outputs section should provide a list of the expected outputs after running the command-line tools. Important components of this section are: id: each input has an id describing the output name; type: describe the type of output value (string, int, long, float, double, File, Directory, Any or stdout); outputBinding: This component defines how to set the outputs values. The glob component will define the name of the output value. cwl[5] ## $outputs ## $outputs$string ## $outputs$string$type ## [1] \"stdout\" stdout: component to specify a filename to capture standard output. Note here we are using a syntax that takes advantage of the inputs section, using results_path parameter and also the SampleName to construct the output filename. cwl[6] ## $stdout ## [1] \"$(inputs.results_path.basename)/$(inputs.SampleName).txt\" CWL Workflow Workflow class in CWL is defined by multiple process steps, where can have interdependencies between the steps, and the output for one step can be used as input in the further steps.\ncwl.wf \u003c- yaml::read_yaml(file.path(dir_path, \"example/workflow_example.cwl\")) The cwlVersion component shows the CWL specification version used by the document. The class component shows this document describes a Workflow. cwl.wf[1:2] ## $class ## [1] \"Workflow\" ## ## $cwlVersion ## [1] \"v1.0\" The inputs section describes the inputs of the workflow. cwl.wf[3] ## $inputs ## $inputs$message ## [1] \"string\" ## ## $inputs$SampleName ## [1] \"string\" ## ## $inputs$results_path ## [1] \"Directory\" The outputs section describes the outputs of the workflow. cwl.wf[4] ## $outputs ## $outputs$string ## $outputs$string$outputSource ## [1] \"echo/string\" ## ## $outputs$string$type ## [1] \"stdout\" The steps section describes the steps of the workflow. In this simple example, we demonstrate one step. cwl.wf[5] ## $steps ## $steps$echo ## $steps$echo$`in` ## $steps$echo$`in`$message ## [1] \"message\" ## ## $steps$echo$`in`$SampleName ## [1] \"SampleName\" ## ## $steps$echo$`in`$results_path ## [1] \"results_path\" ## ## ## $steps$echo$out ## [1] \"[string]\" ## ## $steps$echo$run ## [1] \"example/example.cwl\" CWL Input Parameter Next, let’s explore the .yml file, which provide the input parameter values for all the components we describe above.\nFor this simple example, we have three parameters defined:\nyaml::read_yaml(file.path(dir_path, \"example/example_single.yml\")) ## $message ## [1] \"Hello World!\" ## ## $SampleName ## [1] \"M1\" ## ## $results_path ## $results_path$class ## [1] \"Directory\" ## ## $results_path$path ## [1] \"./results\" Note that if we define an input component in the .cwl file, this value needs to be also defined here in the .yml file.\nReference ","categories":"","description":"","excerpt":"document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/cwl_syntax/","tags":"","title":"CWL syntax"},{"body":" .td-content li a { font-size: 1.5rem; } SPS Function Reference Manuals There are many more useful functions one could use from SPS core and sub packages. We could not cover all the details in this manual. To take a look at these functions, click links below to go to the function reference manual of each package. Detailed function usage, example code, and example running results are shown inside.\n Package Description systemPipeShiny main package spsComps SPS components drawer image editing tool spsUtil utility functions table {font-size: 1.5rem} ","categories":"","description":"","excerpt":" .td-content li a { font-size: 1.5rem; } SPS Function Reference …","ref":"/sps/sps_funcs/","tags":"","title":"SPS Functions"},{"body":" The basic usage of SPS with these default modules/tabs has been discussed in previous sections. SPS provides much more than this. To fully use SPS’s framework functionalities, in this section, we will discuss how you can customize SPS and add new features. \n","categories":"","description":"","excerpt":" The basic usage of SPS with these default modules/tabs has been …","ref":"/sps/adv_features/","tags":"","title":"Advanced features"},{"body":"document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i How to connect CWL description files within systemPipeR This section will demonstrate how to connect CWL parameters files to create workflows. In addition, we will show how the workflow can be easily scalable with systemPipeR.\nSYSargsList container stores all the information and instructions needed for processing a set of input files with a single or many command-line steps within a workflow (i.e. several components of the software or several independent software tools). The SYSargsList object is created and fully populated with the SYSargsList construct function. Full documentation of SYSargsList management instances can be found here and here.\nThe following imports a .cwl file (here example.cwl) for running the echo Hello World! example.\nHW \u003c- SYSargsList(wf_file = \"example/workflow_example.cwl\", input_file = \"example/example_single.yml\", dir_path = system.file(\"extdata/cwl\", package = \"systemPipeR\")) HW ## Instance of 'SYSargsList': ## WF Steps: ## 1. Step_x --\u003e Status: Pending ## Total Files: 1 | Existing: 0 | Missing: 1 ## 1.1. echo ## cmdlist: 1 | Pending: 1 ## cmdlist(HW) ## $Step_x ## $Step_x$defaultid ## $Step_x$defaultid$echo ## [1] \"echo Hello World! \u003e results/M1.txt\" However, we are limited to run just one command-line or one sample in this example. To scale the command-line over many samples, a simple solution offered by systemPipeR is to provide a variable for each of the parameters that we want to run with multiple samples.\nLet’s explore the example:\ndir_path \u003c- system.file(\"extdata/cwl\", package = \"systemPipeR\") yml \u003c- yaml::read_yaml(file.path(dir_path, \"example/example.yml\")) yml ## $message ## [1] \"_STRING_\" ## ## $SampleName ## [1] \"_SAMPLE_\" ## ## $results_path ## $results_path$class ## [1] \"Directory\" ## ## $results_path$path ## [1] \"./results\" For the message and SampleName parameter, we are passing a variable connecting with a third file called targets.\nNow, let’s explore the targets file structure:\ntargetspath \u003c- system.file(\"extdata/cwl/example/targets_example.txt\", package = \"systemPipeR\") read.delim(targetspath, comment.char = \"#\") ## Message SampleName ## 1 Hello World! M1 ## 2 Hello USA! M2 ## 3 Hello Bioconductor! M3 The targets file defines all input files or values and sample ids of an analysis workflow. For this example, we have defined a string message for the echo command-line tool, in the first column that will be evaluated, and the second column is the SampleName id for each one of the messages. Any number of additional columns can be added as needed.\nUsers should note here, the usage of targets files is optional when using systemPipeR's new CWL interface. Since for organizing experimental variables targets files are extremely useful and user-friendly. Thus, we encourage users to keep using them.\nHow to connect the parameter files and targets file information? The constructor function creates an SYSargsList S4 class object connecting three input files:\n CWL command-line specification file (wf_file argument); Input variables (input_file argument); Targets file (targets argument). As demonstrated above, the latter is optional for workflow steps lacking input files. The connection between input variables (here defined by input_file argument) and the targets file are defined under the inputvars argument. A named vector is required, where each element name needs to match with column names in the targets file, and the value must match the names of the .yml variables. This is used to replace the CWL variable and construct all the command-line for that particular step.\nThe variable pattern _XXXX_ is used to distinguish CWL variables that target columns will replace. This pattern is recommended for consistency and easy identification but not enforced.\nThe following imports a .cwl file (same example demonstrated above) for running the echo Hello World example. However, now we are connecting the variable defined on the .yml file with the targets file inputs.\nHW_mul \u003c- SYSargsList(step_name = \"echo\", targets = targetspath, wf_file = \"example/workflow_example.cwl\", input_file = \"example/example.yml\", dir_path = dir_path, inputvars = c(Message = \"_STRING_\", SampleName = \"_SAMPLE_\")) HW_mul ## Instance of 'SYSargsList': ## WF Steps: ## 1. echo --\u003e Status: Pending ## Total Files: 3 | Existing: 0 | Missing: 3 ## 1.1. echo ## cmdlist: 3 | Pending: 3 ## cmdlist(HW_mul) ## $echo ## $echo$M1 ## $echo$M1$echo ## [1] \"echo Hello World! \u003e results/M1.txt\" ## ## ## $echo$M2 ## $echo$M2$echo ## [1] \"echo Hello USA! \u003e results/M2.txt\" ## ## ## $echo$M3 ## $echo$M3$echo ## [1] \"echo Hello Bioconductor! \u003e results/M3.txt\" Figure 1: WConnectivity between CWL param files and targets files. Creating the CWL param files from the command-line Users need to define the command-line in a pseudo-bash script format:\ncommand \u003c- \" hisat2 \\ -S \u003cF, out: ./results/M1A.sam\u003e \\ -x \u003cF: ./data/tair10.fasta\u003e \\ -k \u003cint: 1\u003e \\ -min-intronlen \u003cint: 30\u003e \\ -max-intronlen \u003cint: 3000\u003e \\ -threads \u003cint: 4\u003e \\ -U \u003cF: ./data/SRR446027_1.fastq.gz\u003e \" Define prefix and defaults First line is the base command. Each line is an argument with its default value.\n For argument lines (starting from the second line), any word before the first space with leading - or -- in each will be treated as a prefix, like -S or --min. Any line without this first word will be treated as no prefix.\n All defaults are placed inside \u003c...\u003e.\n First argument is the input argument type. F for “File,” “int,” “string” are unchanged.\n Optional: use the keyword out followed the type with a , comma separation to indicate if this argument is also an CWL output.\n Then, use : to separate keywords and default values, any non-space value after the : will be treated as the default value.\n If any argument has no default value, just a flag, like --verbose, there is no need to add any \u003c...\u003e\n createParam Function createParam function requires the string as defined above as an input.\nFirst of all, the function will print the three components of the cwl file:\n BaseCommand: Specifies the program to execute. Inputs: Defines the input parameters of the process. Outputs: Defines the parameters representing the output of the process. The four component is the original command-line.\nIf in interactive mode, the function will verify that everything is correct and will ask you to proceed. Here, the user can answer “no” and provide more information at the string level. Another question is to save the param created here.\nIf running the workflow in non-interactive mode, the createParam function will consider “yes” and returning the container.\ncmd \u003c- createParam(command, writeParamFiles = FALSE) ## *****BaseCommand***** ## hisat2 ## *****Inputs***** ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta ## k: ## type: int ## preF: -k ## yml: 1 ## min-intronlen: ## type: int ## preF: -min-intronlen ## yml: 30 ## max-intronlen: ## type: int ## preF: -max-intronlen ## yml: 3000 ## threads: ## type: int ## preF: -threads ## yml: 4 ## U: ## type: File ## preF: -U ## yml: ./data/SRR446027_1.fastq.gz ## *****Outputs***** ## output1: ## type: File ## value: ./results/M1A.sam ## *****Parsed raw command line***** ## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz If the user chooses not to save the param files on the above operation, it can use the writeParamFiles function.\nwriteParamFiles(cmd, overwrite = TRUE) How to access and edit param files Print a component printParam(cmd, position = \"baseCommand\") ## Print a baseCommand section ## *****BaseCommand***** ## hisat2 printParam(cmd, position = \"outputs\") ## *****Outputs***** ## output1: ## type: File ## value: ./results/M1A.sam printParam(cmd, position = \"inputs\", index = 1:2) ## Print by index ## *****Inputs***** ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta printParam(cmd, position = \"inputs\", index = -1:-2) ## Negative indexing printing to exclude certain indices in a position ## *****Inputs***** ## k: ## type: int ## preF: -k ## yml: 1 ## min-intronlen: ## type: int ## preF: -min-intronlen ## yml: 30 ## max-intronlen: ## type: int ## preF: -max-intronlen ## yml: 3000 ## threads: ## type: int ## preF: -threads ## yml: 4 ## U: ## type: File ## preF: -U ## yml: ./data/SRR446027_1.fastq.gz Subsetting the command-line cmd2 \u003c- subsetParam(cmd, position = \"inputs\", index = 1:2, trim = TRUE) ## *****Inputs***** ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta ## *****Parsed raw command line***** ## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta cmdlist(cmd2) ## $defaultid ## $defaultid$hisat2 ## [1] \"hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta\" cmd2 \u003c- subsetParam(cmd, position = \"inputs\", index = c(\"S\", \"x\"), trim = TRUE) ## *****Inputs***** ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta ## *****Parsed raw command line***** ## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta cmdlist(cmd2) ## $defaultid ## $defaultid$hisat2 ## [1] \"hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta\" Replacing a existing argument in the command-line cmd3 \u003c- replaceParam(cmd, \"base\", index = 1, replace = list(baseCommand = \"bwa\")) ## Replacing baseCommand ## *****BaseCommand***** ## bwa ## *****Parsed raw command line***** ## bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz cmdlist(cmd3) ## $defaultid ## $defaultid$hisat2 ## [1] \"bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz\" new_inputs \u003c- new_inputs \u003c- list(new_input1 = list(type = \"File\", preF = \"-b\", yml = \"myfile\"), new_input2 = \"-L \u003cint: 4\u003e\") cmd4 \u003c- replaceParam(cmd, \"inputs\", index = 1:2, replace = new_inputs) ## Replacing inputs ## *****Inputs***** ## new_input1: ## type: File ## preF: -b ## yml: myfile ## new_input2: ## type: int ## preF: -L ## yml: 4 ## k: ## type: int ## preF: -k ## yml: 1 ## min-intronlen: ## type: int ## preF: -min-intronlen ## yml: 30 ## max-intronlen: ## type: int ## preF: -max-intronlen ## yml: 3000 ## threads: ## type: int ## preF: -threads ## yml: 4 ## U: ## type: File ## preF: -U ## yml: ./data/SRR446027_1.fastq.gz ## *****Parsed raw command line***** ## hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz cmdlist(cmd4) ## $defaultid ## $defaultid$hisat2 ## [1] \"hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz\" Adding new arguments newIn \u003c- new_inputs \u003c- list(new_input1 = list(type = \"File\", preF = \"-b1\", yml = \"myfile1\"), new_input2 = list(type = \"File\", preF = \"-b2\", yml = \"myfile2\"), new_input3 = \"-b3 \u003cF: myfile3\u003e\") cmd5 \u003c- appendParam(cmd, \"inputs\", index = 1:2, append = new_inputs) ## Replacing inputs ## *****Inputs***** ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta ## k: ## type: int ## preF: -k ## yml: 1 ## min-intronlen: ## type: int ## preF: -min-intronlen ## yml: 30 ## max-intronlen: ## type: int ## preF: -max-intronlen ## yml: 3000 ## threads: ## type: int ## preF: -threads ## yml: 4 ## U: ## type: File ## preF: -U ## yml: ./data/SRR446027_1.fastq.gz ## new_input1: ## type: File ## preF: -b1 ## yml: myfile1 ## new_input2: ## type: File ## preF: -b2 ## yml: myfile2 ## new_input3: ## type: File ## preF: -b3 ## yml: myfile3 ## *****Parsed raw command line***** ## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3 cmdlist(cmd5) ## $defaultid ## $defaultid$hisat2 ## [1] \"hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3\" cmd6 \u003c- appendParam(cmd, \"inputs\", index = 1:2, after = 0, append = new_inputs) ## Replacing inputs ## *****Inputs***** ## new_input1: ## type: File ## preF: -b1 ## yml: myfile1 ## new_input2: ## type: File ## preF: -b2 ## yml: myfile2 ## new_input3: ## type: File ## preF: -b3 ## yml: myfile3 ## S: ## type: File ## preF: -S ## yml: ./results/M1A.sam ## x: ## type: File ## preF: -x ## yml: ./data/tair10.fasta ## k: ## type: int ## preF: -k ## yml: 1 ## min-intronlen: ## type: int ## preF: -min-intronlen ## yml: 30 ## max-intronlen: ## type: int ## preF: -max-intronlen ## yml: 3000 ## threads: ## type: int ## preF: -threads ## yml: 4 ## U: ## type: File ## preF: -U ## yml: ./data/SRR446027_1.fastq.gz ## *****Parsed raw command line***** ## hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz cmdlist(cmd6) ## $defaultid ## $defaultid$hisat2 ## [1] \"hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz\" Editing output param new_outs \u003c- list(sam_out = \"\u003cF: $(inputs.results_path)/test.sam\u003e\") cmd7 \u003c- replaceParam(cmd, \"outputs\", index = 1, replace = new_outs) ## Replacing outputs ## *****Outputs***** ## sam_out: ## type: File ## value: $(inputs.results_path)/test.sam ## *****Parsed raw command line***** ## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz output(cmd7) ## $defaultid ## $defaultid$hisat2 ## [1] \"./results/test.sam\" ","categories":"","description":"","excerpt":"document.addEventListener(\"DOMContentLoaded\", function() { …","ref":"/sp/spr/cwl_and_spr/","tags":"","title":"SPR and CWL"},{"body":" This secetion discusses how different security concerns are handled in SPS.\nsuppressPackageStartupMessages(library(systemPipeShiny)) SPS mode SPS has an option of mode. This option controls how the file upload is handled by SPS. It can be either “server” or “local”, which is asking whether you are running the app on the “server” or running on your “local” machine.\n “server”: for security, users do not have access of file system on the server, choose files from users' local computer. “local”: Assumes the Shiny server and users' local computer is the same machine, so users can access file Shiny server’s file system. It is first defined in the global.R file in a SPS project.\noptions(sps = list( mode = \"local\", ... )) You can check current setting after the app started for the first time\nspsOption(\"mode\") ## [1] \"local\" The most affected function is dynamicFile and its server side function dynamicFileServer.\nServer:\nAfter clicking the file selection button in SPS, server mode uses the default shiny file choose, which users can choose from their local computer. You can see from the picture above, this is a user operating system built-in file chooser.\nLocal:\nYou can see this is different than the “server” mode. “Local” mode is able to use the file system of the shiny deploy environment file system, and it is no longer the users' local system.\nThis may be confusing for the first time. Remember “server” and “local” mean where you deploy the shiny app, on the server or run on your local computer.\n Mode choose file from file pointing method Server user local computer copy to temp Local the computer where you deploy the app direct pointer Pro and cons of modes It does not matter if which mode you choose if you run the app on your own computer, because the deploy server and the user computer are the same.\n However “local” mode will not copy a file to temp after the file chooser, but directly create a pointer. “Server” mode will first upload/copy the file to temp and create a pointer. This will cause resources waste if you are running the app on your own computer. You already have the file on your computer but now it gets copied to temp before Shiny can use it. This will also waste some time to copy the file, especially for large files. There is a limit for default Shiny upload size which is 24MB in “server” mode. You can choose files as large as you desire on “local” mode. The security issue of local mode There is a security concern of “local” mode when the app is deployed on a remote server. “local” mode enables users to choose files from the remote server, so there is the risk of file leaking and file damaging.\nWe recommend DO NOT use “local” mode for remote deployment, like https://shinyapps.io. You can turn the option warning_toast = TRUE on global and testing the app before deploy. This option will check for security problems and inform you.\nThere are cases where you really need users to choose files from the remote server, like the Workflow module, where all workflow files are stored on the remote server. Then use a sandbox or container environment to isolate the app, and also turn on the login page login_screen = TRUE to limit access will be helpful.\nWarning toast Set warning_toast = TRUE option will check for potential security risks and show a pop-up message if there is any risk when app starts. This is option is helpful on pre-deployment testing.\n check if you have changed the default admin page url “admin” check if you have changed the default admin user “admin” check if you have changed the default user “admin” check if you are on “local” mode The workflow module The workflow module enables users to manage, design, and run workflows directly from the app and in the final running workflow session, users are allowed to run arbitrary R code in a Rstudio like console in a child R session. Running any R code means they can modify your remote system, and use system commands.\nFor shinyapps.io, it runs in a container and it reset itself once a while, so security is not a big concern, but apparently, shinyapps.io is not a place you want to deploy heavy data analysis workflows. Most users will deploy the SPS with workflow modules in other cloud computing sites or their own servers. For these cases, we recommend you:\n Turn on the login to give access to limited people.\n Isolate the app with sandboxes or containers.\n ","categories":"","description":"","excerpt":" This secetion discusses how different security concerns are handled …","ref":"/sps/adv_features/app_security/","tags":"","title":"App security"},{"body":" pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } document.addEventListener(\"DOMContentLoaded\", function() { document.querySelector(\"h1\").className = \"title\"; }); document.addEventListener(\"DOMContentLoaded\", function() { var links = document.links; for (var i = 0, linksLength = links.length; i systemPipeR Installation To install the systemPipeR package (H Backman and Girke 2016), please use the BiocManager::install command:\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeR\") To obtain the most recent updates immediately, one can install it directly from GitHub as follow:\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"tgirke/systemPipeR\", dependencies = TRUE) Third-party software tools in SPR Current, systemPipeR provides the param file templates for third-party software tools. Please check the listed software tools.\n Tool Name Description Step bwa BWA is a software package for mapping low-divergent sequences against a large reference genome, such as the human genome.  Alignment Bowtie2 Bowtie 2 is an ultrafast and memory-efficient tool for aligning sequencing reads to long reference sequences. Alignment FASTX-Toolkit FASTX-Toolkit is a collection of command line tools for Short-Reads FASTA/FASTQ files preprocessing. Read Preprocessing TransRate Transrate is software for de-novo transcriptome assembly quality analysis. Quality Gsnap GSNAP is a genomic short-read nucleotide alignment program. Alignment Samtools Samtools is a suite of programs for interacting with high-throughput sequencing data. Post-processing Trimmomatic Trimmomatic is a flexible read trimming tool for Illumina NGS data. Read Preprocessing Rsubread Rsubread is a Bioconductor software package that provides high-performance alignment and read counting functions for RNA-seq reads. Alignment Picard Picard is a set of command line tools for manipulating high-throughput sequencing (HTS) data and formats such as SAM/BAM/CRAM and VCF. Manipulating HTS data Busco BUSCO assesses genome assembly and annotation completeness with Benchmarking Universal Single-Copy Orthologs. Quality Hisat2 HISAT2 is a fast and sensitive alignment program for mapping NGS reads (both DNA and RNA) to reference genomes. Alignment Tophat2 TopHat is a fast splice junction mapper for RNA-Seq reads. Alignment GATK Variant Discovery in High-Throughput Sequencing Data. Variant Discovery STAR STAR is an ultrafast universal RNA-seq aligner. Alignment Trim\\_galore Trim Galore is a wrapper around Cutadapt and FastQC to consistently apply adapter and quality trimming to FastQ files. Read Preprocessing TransDecoder TransDecoder identifies candidate coding regions within transcript sequences. Find Coding Regions Trinity Trinity assembles transcript sequences from Illumina RNA-Seq data. denovo Transcriptome Assembly Trinotate Trinotate is a comprehensive annotation suite designed for automatic functional annotation of transcriptomes. Transcriptome Functional Annotation MACS2 MACS2 identifies transcription factor binding sites in ChIP-seq data. Peak calling Kallisto kallisto is a program for quantifying abundances of transcripts from RNA-Seq data. Read counting BCFtools BCFtools is a program for variant calling and manipulating files in the Variant Call Format (VCF) and its binary counterpart BCF. Variant Discovery Bismark Bismark is a program to map bisulfite treated sequencing reads to a genome of interest and perform methylation calls in a single step. Bisulfite mapping Fastqc FastQC is a quality control tool for high throughput sequence data. Quality Blast BLAST finds regions of similarity between biological sequences. Blast References H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.\n ","categories":"","description":"","excerpt":" pre code { white-space: pre !important; overflow-x: scroll …","ref":"/sp/spr/sprinstall/","tags":"","title":"SPR detailed installation instructions"},{"body":" How to deploy the application The easiest way to deploy SPS is shinyapps.io{blk}. To get started, it is required to create a shinyapps.io account. Please follow this tutorial{blk} with all the instructions to create an account. There are other ways to deploy, like AWS or Google Cloud with a custom Shiny server. There are a lot of tutorials to deploy the app other than shinyapps.io. We only use shinyapps.io as the example here to discuss how to deploy.\nGet started After you have created a SPS project, it is in a deploy-ready state, which means you can deploy it as soon as you create the project.\nWe have created some important helper code in deploy.R under the project root for you.\n Read the tutorial{blk} After you have the accounts and token set up according to the tutorial, open deploy.R. If you have used Bioconductor packages (mostly likely yes, unless you do not use the default modules), run the options line in R console before deploy, which is this\noptions(repos = BiocManager::repositories()) If you want to use develop version of Bioconductor packages (not recommended), uncomment following lines and follow the instructions in the file.\n# repos \u003c- BiocManager::repositories() # devel \u003c- \"3.13\" # repos[length(repos) + 1] \u003c- paste0(\"https://bioconductor.org/packages/\", devel, \"/bioc\") # names(repos)[length(repos)] \u003c- \"BioC\" # options(repos = repos) # getOption(\"repos\") If you wish shinyapps.io to install SPS modules, copy and uncomment following lines for the modules to global.R file below the line # load additional libraries that you want to use below.\n## Workflow module # requireNamespace(\"DOT\"); requireNamespace(\"networkD3\"); requireNamespace(\"pushbar\") # requireNamespace(\"readr\"); requireNamespace(\"rhandsontable\"); requireNamespace(\"shinyTree\") # requireNamespace(\"systemPipeR\"); requireNamespace(\"systemPipeRdata\"); requireNamespace(\"zip\") ## RNA-Seq module # requireNamespace(\"DESeq2\"); requireNamespace(\"Rtsne\"); requireNamespace(\"SummarizedExperiment\") # requireNamespace(\"UpSetR\"); requireNamespace(\"ape\"); requireNamespace(\"ggtree\") # requireNamespace(\"glmpca\"); requireNamespace(\"pheatmap\"); requireNamespace(\"systemPipeR\") ## Quick ggplot module # requireNamespace(\"esquisse\") The last section in deploy.R is some helper code to set up the account and deploy the app programmatically. If you use the tutorial{blk}, there is no need to do this section.\n Save your changes in the global.R.\n Deploy in Rstudio We recommend you to deploy the app with Rstudio. If you have set up your shinyapps.io account, we are ready to go.\n A Open global.R in Rstudio, use the “Run App” button to make sure your app can be run without problems locally. Run options(repos = BiocManager::repositories()) and other Bioconductor set up code as listed above. Click the button next to “Run App” and choose “Publish Application…” B If you have set up your account correctly, you should see your account to the right panel. Select all the files of your SPS project. Change the app “Title” to what you want. hit “Publish”. RAM requirement If you wish to load the workflow and/or RNAseq module(s) on shinyapps.io, you need at least 2GB of memory. Unfortunately, these 2 modules depend heavily on Bioconductor packages and these packages are not light-weighted. The max RAM for free account on shinyapps.io is 1GB which means you either need to upgrade your account or use other server to deploy your app.\nIf you decide to not load these modules which will allow you to deploy the app with a free account, change the settings to unload these modules in app options in global.R.\n","categories":"","description":"","excerpt":" How to deploy the application The easiest way to deploy SPS is …","ref":"/sps/deploy/","tags":"","title":"Deploy"},{"body":"SPS is not only a framework to run interactive workflow and visualize data, but also a framework with abundant developer tools for building Shiny apps, writing R markdowns, integrating R-HTML and general R utilities.\nThese developer toolkits are distributed in supporting packages. If you like some of the functionality from SPS and think installing the whole framework is too expensive (time consuming), cherry-pick the functionality you want in following categories:\n spsCpmps: Shiny/Rmarkdown UI components, and Shiny server functions. drawer: Shiny/Rmarkdown/HTML interactive image editing tool. spsUtil: General R utilities, like pretty logging functions. Install All these supporting packages are available on CRAN. We recommend to use the modern package manager {pak} to install packages.\nif(!requireNamespace(\"pak\", quietly = TRUE)) install.packages(\"pak\", repos = \"https://r-lib.github.io/p/pak/dev/\") Pick and install packages as your need\npak::pkg_install(\"spsCpmps\") pak::pkg_install(\"drawer\") pak::pkg_install(\"spsUtil\") Linux If you are on Linux, you need to install some system dependencies before R package installation. To figure out what system dependencies and command, run:\npaste(\"sudo\", pak::pkg_system_requirements(\"spsComps\")) ## [1] \"sudo apt-get install -y libcurl4-openssl-dev\" ## [2] \"sudo apt-get install -y libssl-dev\" ## [3] \"sudo apt-get install -y make\" ## [4] \"sudo apt-get install -y libicu-dev\" ## [5] \"sudo apt-get install -y pandoc\" paste(\"sudo\", pak::pkg_system_requirements(\"drawer\")) ## [1] \"sudo apt-get install -y make\" \"sudo apt-get install -y libicu-dev\" ## [3] \"sudo apt-get install -y pandoc\" paste(\"sudo\", pak::pkg_system_requirements(\"spsUtil\")) ## [1] \"sudo apt-get install -y libcurl4-openssl-dev\" ## [2] \"sudo apt-get install -y libssl-dev\" ## [3] \"sudo apt-get install -y libicu-dev\" We are rendering this doc in Ubuntu. If your Linux distribution is different, commands above will be different.\nFunctions reference manual In documents, we only highlight some important functions. Please read the reference manuals for details of every function.\n","categories":"","description":"","excerpt":"SPS is not only a framework to run interactive workflow and visualize …","ref":"/sps/dev/","tags":"","title":"Developer tools"},{"body":" .td-content li a { font-size: 1.5rem; } systempipeR Functions Reference Manuals The following reference manual was created by systemPipeR Development version.\n systemPipeR Reference Manual ","categories":"","description":"","excerpt":" .td-content li a { font-size: 1.5rem; } systempipeR Functions …","ref":"/sp/spr/spr_funcs/","tags":"","title":"Help Manual"},{"body":" SPS database is a small SQLite database which stores some basic app information, the project encryption key pair, account information. The database is controlled by 3 SPS R6 classes:\n spsDb: basic database management, queries. spsEncryption: Interact with the SHA256 key pair in the database to encrypt strings, and files. Also methods to view or change the key pair, inherits spsDb spsAcount: use the encyption key pair to manage users and admin accounts in SPS, inherits spsDb and spsEncryption. First to create a SPS project\nsuppressPackageStartupMessages(library(systemPipeShiny)) app_path \u003c- \".\" spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) ## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 1d1f76c8eecddb382ee2db097d6edbe9 ## [SPS-INFO] 2021-04-22 15:45:04 SPS project setup done! You can see a database created on a SPS project initiation, you should see a message like this:\n[SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at Then we can use different class methods to interact with the database.\nspsDb class Reference manual under SPS Functions.\nCreate a class object:\nmydb \u003c- spsDb$new() ## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container create new db If there is no database, we can create one:\n# delete current one first try(file.remove(\"config/sps.db\")) ## [1] TRUE # create a new one mydb$createDb() ## [SPS-INFO] 2021-04-22 15:45:04 Creating SPS db... ## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 6306a50abcf3c7618566911a793b0405 If you create a new database, all information in the old database will be overwritten. All old information will be lost\nGet tables # meta info table mydb$queryValue(\"sps_meta\") ## info value ## 1 creation_date 20210422154504 # raw blob table to store keys mydb$queryValue(\"sps_raw\") ## info value ## 1 key blob[1.36 kB] # account table mydb$queryValue(\"sps_account\") ## account pass ## 1 admin bef2094c429fa5b0ff7a37abc6bf8dd31c29fa2acd783a2303935d2b8664ea21 ## 2 user 12842a62c410af0f4b4dc866283a90f7b7c42c9d5ca0d0e1c812dca11021b052 ## role ## 1 admin ## 2 user Insert new records(rows) To add a new row, values of all columns needs to be passed in a SQL string\nmydb$queryInsert(\"sps_meta\", value = \"'new1', '1'\") ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows Or pass in a vector:\nmydb$queryInsert(\"sps_meta\", value = c(\"'new2'\", \"'2'\")) ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows # check the new table mydb$queryValue(\"sps_meta\") ## info value ## 1 creation_date 20210422154504 ## 2 new1 1 ## 3 new2 2 change values mydb$queryUpdate(\"sps_meta\", value = '234', col = \"value\", WHERE = \"info = 'new1'\") ## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows # check the update mydb$queryValue(\"sps_meta\") ## info value ## 1 creation_date 20210422154504 ## 2 new1 234 ## 3 new2 2 remove values mydb$queryDel(\"sps_meta\", WHERE = \"value = '234'\") ## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows # check again mydb$queryValue(\"sps_meta\") ## info value ## 1 creation_date 20210422154504 ## 2 new2 2 spsEncryption class Reference manual under SPS Functions.\nStart by creating a class object\nmy_ecpt \u003c- spsEncryption$new() ## [SPS-INFO] 2021-04-22 15:45:05 Created SPS encryption method container ## [SPS-INFO] 2021-04-22 15:45:05 Default SPS-db found and is working Get current key To see the public and private keys (in {openssil{blk}} format):\n# private my_ecpt$keyGet() ## [2048-bit rsa private key] ## md5: 6306a50abcf3c7618566911a793b0405 # public my_ecpt$keyGet()$pubkey ## [2048-bit rsa public key] ## md5: 6306a50abcf3c7618566911a793b0405 Change the encyption key Be super careful to change the encryption key. This will result any file encrypted by the old key pair unlockable and the password of all current accounts invalid.\nBy default it will prevent you to change the key in case you accidentally run this method\nmy_ecpt$keyChange() ## [SPS-DANGER] 2021-04-22 15:45:05 ## change this key will result all accounts' password failed to ## authenticate. You have to regenerate all password for all ## accounts. All encrypted file using the old key will fail to ## decrypt. There is NO way to RECOVER the old key, password ## and files. If you wish to continue, recall this function ## with `confirm = TRUE`. Unless you are super sure with a confirmation\nmy_ecpt$keyChange(confirm = TRUE) ## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18 Encrypt files # imagine a file has one line \"test\" writeLines(text = \"test\", con = \"test.txt\") my_ecpt$encrypt(\"test.txt\", \"test.bin\", overwrite = TRUE) Decrypt files my_ecpt$decrypt(\"test.bin\", \"test_decpt.txt\", overwrite = TRUE) Check the decrypted file content\nreadLines('test_decpt.txt') ## [1] \"test\" spsAcount class This class is discussed in details in the Accounts, login and admin.\n","categories":"","description":"","excerpt":" SPS database is a small SQLite database which stores some basic app …","ref":"/sps/adv_features/database/","tags":"","title":"SPS database"},{"body":" SPS accounts After a SPS project is initialized, some default accounts has been set up. They will not become useful unless you enable the login and admin features.\nThere are 2 default accounts created for you to test before deploy:\n name role password admin admin admin user user user The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login.\nPlease change these accounts before deployment.\nAccount management You can manage accounts in two ways: commandline and admin page. Here is how you manage from commandline, read how to do it from admin page below.\nThere are some helper code inside global.R file under your SPS project root.\n## account information ## PLEASE use following to add your own accounts and remove the default accounts for deployment # mydb \u003c- spsAccount$new() # mydb$accList() # mydb$accAdd(acc_name = \"XXX\", acc_pass = \"$xxxx\", role = \"admin\") # mydb$accRemove(\"admin\") # mydb$accRemove(\"user\") You can uncomment these lines to practice how to manage accounts, or read the reference manual about spsAccount class.\nFirst to create a SPS project\nsuppressPackageStartupMessages(library(systemPipeShiny)) app_path \u003c- \".\" spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 16:25:15 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 16:25:15 Create project under /tmp/RtmpMoNp2X/SPS_20210416 ## [SPS-INFO] 2021-04-16 16:25:15 Now copy files ## [SPS-INFO] 2021-04-16 16:25:15 Create SPS database ## [SPS-INFO] 2021-04-16 16:25:15 Created SPS database method container ## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db... ## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at '/tmp/RtmpMoNp2X/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 db686a4f203edbdd0fe4c2a1642492d2 ## [SPS-INFO] 2021-04-16 16:25:15 SPS project setup done! Create a spsAccount object. SPS accounts are stored in the config/sps.db database inside your SPS projects.\nacc \u003c- spsAccount$new() ## [SPS-INFO] 2021-04-16 16:25:15 Created SPS account method container ## [SPS-INFO] 2021-04-16 16:25:15 Default SPS-db found and is working ## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db... ## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 127f00770c4ed318c48fe92cd67bf783 See what accounts you have\nacc$accList() ## account role ## 1 admin admin ## 2 user user You can also listed passwords. They are SHA256 encrypted.\ntibble::as_tibble(acc$accList(include_pass = TRUE)) ## # A tibble: 2 x 3 ## account pass role ## \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e ## 1 admin 0b1460498bf1b50e05cc07e53c7856fc23ecd3fc2bc404d52dbf3aae743f8a9a admin ## 2 user 796be5ca7dafddf5e1e7c032fc71386fe16274f63b6068bb2b064d4c9876eaae user See SPS database for encryption key details.\nAdd a new user\nacc$accAdd(acc_name = 'user2', acc_pass = '!newuser12345', role = \"user\") ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 created. Change the role of user2 from “user” to “admin”\nacc$accRoleChange(acc_name = \"user2\", role = \"admin\") ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 role changed. Remove a user\nacc$accRemove(\"user2\") ## [SPS-INFO] 2021-04-16 16:25:15 Deleted 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 removed acc$accList() ## account role ## 1 admin admin ## 2 user user Change password\nacc$accPassChange(acc_name = \"user\", , acc_pass = '!newuser54321') ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user password created. Validate password\nacc$accMatch(acc_name = \"user\", acc_pass = '!newuser54321') ## [1] TRUE acc$accMatch(acc_name = \"user\", acc_pass = \"user\") ## [1] FALSE acc$accMatch(acc_name = \"abc\", acc_pass = \"123\") ## [1] FALSE Validate password + role\nacc$accMatch(acc_name = \"user\", acc_pass = '!newuser54321', match_role = TRUE, role = \"user\") ## [1] TRUE acc$accMatch(acc_name = \"user\", acc_pass = '!newuser54321', match_role = TRUE, role = \"admin\") ## [1] FALSE Main app login After the account has been set up properly, one can try to turn on the login page for the main app. Use spsOption(\"login_screen\", TRUE) or set login_screen = TRUE in global.R file.\nWhether enabling the login screen is fundamentally different how the Shiny app loads the UI and server code.\n Disabled: loads UI and server on app start Enabled: loads login UI and server on start, loads main app UI and server code only when login is successful. One advantage of using the login is the app starting time is fast. On app start, it only loads the login logic so it saves some time. The heavy part is the main app logic which will be loaded after a successful login. So the overall loading time is about the same. The difference is at what time point to load main app. Of course, if the user fails to login, main app will never be loaded. This can save some resources to handle unauthorized requests.\nThis difference may cause some javascript not working if you are loading your custom tabs with custom javascript. Set a wait signal in your javascript or report an issue to us if you have troubles.\n The login screen is also controlled by another setting login_theme. By default, if you turn on the “login_screen”, app will show you a random loading theme (login_theme = \"random\") before you see the login panel. You can interact with these themes or change to play with a different theme. Or you can specify your favorate from “vhelix” (DNA double helix), “hhelix” (DNA flow), or “biomatrix” (DNA Matrix).\n If you are not a fan of these themes, you can use login_theme = \"empty\" to directly go to login panel.\n Admin page SPS Admin page is panel of tabs to help app managers administrate the app. Under current version, SPS provides 2 main features: app information/statistics and account control.\nAdmin login To reach the Admin page, users first need to enable this feature (default is TRUE) in SPS options admin_page use either spsOption(\"admin_page\", TRUE) or set it in global.R. Afterwards, users need type in the correct url to find the page. This can be set with the SPS option admin_url. Default is “admin”, admin_url = \"admin\", but for security we recommend you to change it in deployment. \nTo access it, add “?” + “YOUR_ADMIN_URL” to your app url to visit it. For example:\nwe have a demo https://tgirke.shinyapps.io/systemPipeShiny_loading/\nto visit the admin page, then we visit https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin\n Admin login page\n You can use the testing account “admin” and password “admin” to login, but for security we strongly recommend you to change it in deployment. \nApp information The first tab of the Admin page is current app and server information, like CPU, RAM, size, etc. On this tab, under details, some real-time statistic plots are rendered. You can interact with these plots to dig for more information.\n Admin page app info\n Account control Instead of changing account information from commandline, you can use this tab to add / remove / change password/ change roles of current app accounts.\n Admin page user control\n Create a new user\n ","categories":"","description":"","excerpt":" SPS accounts After a SPS project is initialized, some default …","ref":"/sps/adv_features/login/","tags":"","title":"Accounts, Login and Admin"},{"body":" Guidelines from bioconductor_docker.\n Running the systemPipeR with Docker Get a copy of the public docker image docker pull systempipe/systempipe_docker:latest To run RStudio Server: docker run -e PASSWORD=systemPipe -p 8787:8787 \\ systempipe/systempipe_docker:latest You can then open a web browser pointing to your docker host on port 8787. If you’re on Linux and using default settings, the docker host is 127.0.0.1 (or localhost, so the full URL to RStudio would be http://localhost:8787). If you are on Mac or Windows and running Docker Toolbox, you can determine the docker host with the docker-machine ip default command.\nIn the above command, -e PASSWORD= is setting the RStudio password and is required by the RStudio Docker image. It can be whatever you like except it cannot be rstudio. Log in to RStudio with the username rstudio and whatever password was specified, in this example systemPipe.\nTo run R from the command line: docker run -it --user rstudio systempipe/systempipe_docker:latest R To open a Bash shell on the container: docker run -it --user rstudio systempipe/systempipe_docker:latest bash Install Prerequisites: Linux Mac Windows\nInstructions here on how to install Docker Engine on Ubuntu.\nsudo apt-get update sudo apt-get install \\ apt-transport-https \\ ca-certificates \\ curl \\ gnupg curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\ \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \\ $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ## Verify that Docker Engine is installed correctly by running the hello-world image. sudo docker run hello-world Uninstall sudo apt-get remove docker docker-engine docker.io containerd runc Docker Hub Account To be able to share a custom image, please go to https://hub.docker.com and create a free account.\n Log in to the Docker Hub locally Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one.\ndocker login # Username: XXXX # Password: xxx # Login Succeeded Run Docker docker run-dP systempipe/systempipe_docker:latest Make sure the container is running:\ndocker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # NAMES #5d007f66a7b3 systempipe/systempipe_docker:latest \"/init\" 5 minutes ago Up 5 minutes 0.0.0.0:49153-\u003e8787/tcp determined_easle Login to the container Please check the NAMES in this example, determined_easle, to login into the container.\ndocker exec -it determined_easle /bin/bash Other alternatives to run the container To run RStudio Server: docker run -e PASSWORD=systemPipe -p 8787:8787 \\ systempipe/systempipe_docker:latest To run R from the command line: docker run -it --user rstudio systempipe/systempipe_docker:latest R To open a Bash shell on the container: docker run -it --user rstudio systempipe/systempipe_docker:latest bash Check R Version into the container R --version Stop Docker docker stop determined_easle Create your first repository Link Create a repository: Sign in to Docker Hub. Click Create a Repository on the Docker Hub welcome page: Name it /my-repo. Click Create. Build and push a container image to Docker Hub from your computer Start by creating a Dockerfile to specify your application mkdir docker_test cd docker_test touch Dockerfile # Docker inheritance FROM systempipe/systempipe_docker:latest ## Install BiocStyle RUN R -e 'BiocManager::install(\"BiocStyle\")' # Install required Bioconductor package from devel version RUN R -e 'BiocManager::install(\"tgirke/systemPipeR\")' RUN R -e 'BiocManager::install(\"tgirke/systemPipeRdata\")' WORKDIR /home/rstudio/SPRojects COPY --chown=rstudio:rstudio . /home/rstudio/SPRojects # Metadata LABEL name=\"systempipe/systempipe_docker\" \\ version=$BIOCONDUCTOR_DOCKER_systempipe \\ url=\"https://github.com/systemPipeR/systempipe/systempipe_docker\" \\ vendor=\"systemPipeR Project\" \\ maintainer=\"email@gmail.com\" \\ description=\"Bioconductor docker image containing the systemPipeR Project\" \\ license=\"Artistic-2.0\" Run docker build to build your Docker image docker build -t systempipe/systempipe_docker . Run docker run to test your Docker image locally docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest Run docker push to push your Docker image to Docker Hub docker push systempipe/systempipe_docker Your repository in Docker Hub should now display a new latest tag under Tags Make changes to the container and Create the new image Create a folder, for example:\ndocker run -dP systempipe/systempipe_docker docker ps ## To check the NAME \u003clucid_grothendieck\u003e docker exec -it lucid_grothendieck /bin/bash root@33c758eb1626:/# R setwd(\"home/rstudio/\") systemPipeRdata::genWorkenvir(\"rnaseq\") exit docker commit -m \"Added rnaseq template\" -a \"Dani Cassol\" lucid_grothendieck dcassol/systempipeworkshop2021:rnaseq docker push systempipe/systempipe_docker:rnaseq Run the new image:\ndocker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq Commands List which docker machines are available locally docker images\nList running containers docker ps\nList all containers docker ps -a\nResume a stopped container docker start \u003cCONTAINER ID\u003e\nShell into a running container docker exec -it \u003cCONTAINER ID\u003e /bin/bash\nStop OR remove a cointainer docker stop \u003cCONTAINER ID\u003e docker rm \u003cCONTAINER ID\u003e\nRemove a image docker rmi dcassol/systempipeworkshop2021:rnaseq\n Docker and GitHub Actions To create a new token, go to Docker Hub Settings 1.1. Account Settings » Security » New Access Token 1.2. Add Access Token Description » Create 1.3. Copy the Access Token » Copy and Close\nGo to the Repository at GitHub 2.1. Settings \u003e Secrets \u003e New repository secret 2.2. Create a new secret with the name DOCKER_HUB_USERNAME and your Docker ID as value 2.3. Click at Add secret 2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)\nSet up the GitHub Actions workflow steps: - name: Checkout Repo uses: actions/checkout@v2 - name: Login to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} Common Problems ## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied Solution:\nsudo chmod 666 /var/run/docker.sock Singularity Container Please download the Docker image of systemPipe, as follow:\nsingularity pull docker://systempipe/systempipe_docker:latest You can also use the build command to download pre-built images from Docker. Unlike pull, build will convert the image to the latest Singularity image format after downloading it.\nsingularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest To run the container:\nsingularity shell systempipe_docker_latest.sif Resources Docker Run: How to create images from an application Docker Hub Quickstart Configure GitHub Actions Singularity ","categories":"","description":"","excerpt":" Guidelines from bioconductor_docker.\n Running the systemPipeR with …","ref":"/sp/spr/sp_docker/","tags":"","title":"SPR Docker container"},{"body":" There are some options in SPS that will give you more information and help you on debugging. They are: verbose and traceback. You can config (enable/disable) themin a SPS project’s global.R file, or use spsOption(\"verbose\", TRUE) and spsOption(\"traceback\", TRUE) to turn on them.\nSome setup:\nsuppressPackageStartupMessages(library(systemPipeShiny)) app_dir \u003c- tempdir() spsInit(app_path = app_dir, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 17:46:53 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 17:46:53 Create project under /tmp/RtmpUfKCYR/SPS_20210416 ## [SPS-INFO] 2021-04-16 17:46:53 Now copy files ## [SPS-INFO] 2021-04-16 17:46:53 Create SPS database ## [SPS-INFO] 2021-04-16 17:46:53 Created SPS database method container ## [SPS-INFO] 2021-04-16 17:46:53 Creating SPS db... ## [SPS-DANGER] 2021-04-16 17:46:53 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 17:46:53 Key md5 fc8c85a0e87073328864bd542d740801 ## [SPS-INFO] 2021-04-16 17:46:53 SPS project setup done! app_path \u003c- file.path(app_dir, glue::glue(\"SPS_{format(Sys.time(), '%Y%m%d')}\")) verbose In many SPS functions, there is this argument verbose and usually default is FALSE. It means do not print extra message, keep it clean. You can set in spsOption(\"verbose\", TRUE) or inside global.R file to turn on. These are called global settings, and you can use a local setting to overwrite it (func(..., verbose = TRUE)).\nLet’s use SPS main function sps for example, without the verbose\nspsOption(\"verbose\", FALSE) app \u003c- sps(app_path = app_path) ## Warning: [SPS-WARNING] 2021-04-16 17:46:53 These plot tabs has no image path: ## 'vs_example' ## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. ## [SPS-INFO] 2021-04-16 17:46:55 App starts ... Turn on the verbose:\nspsOption(\"verbose\", TRUE) app \u003c- sps(app_path = app_path) ## [SPS-INFO] 2021-04-16 17:46:55 App has 19 default configs, resolving 19 custom configs ## [SPS-INFO] 2021-04-16 17:46:55 Now check the tab info in tabs.csv ## Warning: [SPS-WARNING] 2021-04-16 17:46:55 These plot tabs has no image path: ## 'vs_example' ## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. ## [SPS-INFO] 2021-04-16 17:46:55 tab.csv info check pass ## [SPS-INFO] 2021-04-16 17:46:55 Using default tabs ## [SPS-INFO] 2021-04-16 17:46:55 check guide ## [SPS-INFO] 2021-04-16 17:46:55 Start to generate UI ## [SPS-INFO] 2021-04-16 17:46:55 parse title and logo ## [SPS-INFO] 2021-04-16 17:46:55 resolve default tabs UI ## [SPS-INFO] 2021-04-16 17:46:55 Loading custom tab UI ... ## [SPS-INFO] 2021-04-16 17:46:55 Loading notifications from developer... ## [SPS-INFO] 2021-04-16 17:46:55 Loading guide UI ## [SPS-INFO] 2021-04-16 17:46:55 Create UI header ... ## [SPS-INFO] 2021-04-16 17:46:55 Create UI sidebar menu ... ## [SPS-INFO] 2021-04-16 17:46:55 Create UI tab content ... ## [SPS-INFO] 2021-04-16 17:46:55 Add tab content to body ... ## [SPS-INFO] 2021-04-16 17:46:55 Merge header, menu, body to dashboard ... ## [SPS-INFO] 2021-04-16 17:46:55 Add overlay loading screen, admin panel. ## Merge everything to app container ... ## [SPS-INFO] 2021-04-16 17:46:55 UI created ## [SPS-INFO] 2021-04-16 17:46:55 Start to create server function ## [SPS-INFO] 2021-04-16 17:46:55 Resolve default tabs server ## [SPS-INFO] 2021-04-16 17:46:55 Load custom tabs servers ## [SPS-INFO] 2021-04-16 17:46:55 Server functions created ## [SPS-INFO] 2021-04-16 17:46:55 App starts ... Exception There is one exception which is the spsInit. It is used to create a SPS project for you, so it assumes you do not have a SPS project yet and therefore do not have the chance to reach SPS options. So the verbose global setting will not work here. You need to turn it on locally with verbose = TRUE.\nCompare messages of this with the initial spsInit creation on top.\nspsInit(verbose = TRUE, app_path = app_path, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 17:46:55 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 17:46:55 Create project under /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416 ## [SPS-INFO] 2021-04-16 17:46:55 Now copy files ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/www ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/config ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/R ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/data ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/results ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/README.md ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/deploy.R ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/server.R ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/global.R ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/ui.R ## [SPS-INFO] 2021-04-16 17:46:55 File(s) copied for /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/server.R ## [SPS-INFO] 2021-04-16 17:46:55 Create SPS database ## [SPS-INFO] 2021-04-16 17:46:55 Created SPS database method container ## [SPS-INFO] 2021-04-16 17:46:55 Db connected ## [SPS-INFO] 2021-04-16 17:46:55 Default SPS-db found and is working ## [SPS-INFO] 2021-04-16 17:46:55 Db connected ## [SPS-INFO] 2021-04-16 17:46:55 Creating SPS db... ## [SPS-INFO] 2021-04-16 17:46:55 Db write the meta table ## [SPS-INFO] 2021-04-16 17:46:56 Db write the raw table ## [SPS-INFO] 2021-04-16 17:46:56 Key generated and stored in db ## [SPS-INFO] 2021-04-16 17:46:56 Db create admin account ## [SPS-DANGER] 2021-04-16 17:46:56 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 17:46:56 Key md5 7dca8a45de4d7260f91ddb1a02d0a6bd ## [SPS-INFO] 2021-04-16 17:46:56 SPS project setup done! traceback When error happens, it will be helpful if we can know where it happened. This option will give you additional information of which function it happened, the system call list and error file and line of code if possible.\nThis feature is enabled in two functions sps and shinyCatch.\n sps: Adding tracebacks if there are some errors sourcing helper functions located in your SPS project under the R folder. shinyCatch: Traceback errors of expressions inside shinyCatch Let’s use shinyCatch to demo.\nBefore adding traceback:\nspsOption(\"traceback\", FALSE) shinyCatch({ stop(\"some error message\") }) ## [SPS-ERROR] 2021-04-16 17:46:56 some error message ## NULL After\nspsOption(\"traceback\", TRUE) shinyCatch({ stop(\"some error message\") }) ## 1. local({ ## if (length(a \u003c- commandArgs(TRUE)) != 2) ## stop(\"The number of arguments passed to Rscript should be 2.\") ## x = readRDS(a[1]) ## f = x[[1]] ## if (is.character(f)) ## f = eval(parse(text = f), envir = globalenv()) ## r = do.call(f, x[[2]], envir = globalenv()) ## saveRDS(r, a[2]) ## }) ## 2. eval.parent(substitute(eval(quote(expr), envir))) ## 3. eval(expr, p) ## 4. eval(expr, p) ## 5. eval(quote({ ## if (length(a \u003c- commandArgs(TRUE)) != 2) stop(\"The number of arguments passed to Rscript should be 2.\") ## x = readRDS(a[1]) ## f = x[[1]] ## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) ## r = do.call(f, x[[2]], envir = globalenv()) ## saveRDS(r, a[2]) ## }), new.env()) ## 6. eval(quote({ ## if (length(a \u003c- commandArgs(TRUE)) != 2) stop(\"The number of arguments passed to Rscript should be 2.\") ## x = readRDS(a[1]) ## f = x[[1]] ## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) ## r = do.call(f, x[[2]], envir = globalenv()) ## saveRDS(r, a[2]) ## }), new.env()) ## 7. do.call(f, x[[2]], envir = globalenv()) ## 8. (function (input, output, to_md = file_ext(output) != \"html\", quiet = TRUE) ## { ## options(htmltools.dir.version = FALSE) ## setwd(dirname(input)) ## input = basename(input) ## if (to_md) ## options(bookdown.output.markdown = TRUE) ## res = rmarkdown::render(input, \"blogdown::html_page\", output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) ## x = read_utf8(res) ## if (to_md) ## x = process_markdown(res, x) ## unlink(res) ## x ## })(\"content/en/sps/adv_features/debug.Rmd\", \"debug.md~\", TRUE, TRUE) ## 9. rmarkdown::render(input, \"blogdown::html_page\", output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) ## 10. knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet) ## 11. process_file(text, output) ## 12. withCallingHandlers(if (tangle) process_tangle(group) else process_group(group), error = function(e) { ## setwd(wd) ## cat(res, sep = \"\\n\", file = output %n% \"\") ## message(\"Quitting from lines \", paste(current_lines(i), collapse = \"-\"), \" (\", knit_concord$get(\"infile\"), \") \") ## }) ## 13. process_group(group) ## 14. process_group.block(group) ## 15. call_block(x) ## 16. block_exec(params) ## 17. in_dir(input_dir(), evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error \u0026\u0026 options$include) 0 else 2, output_handler = knit_handlers(options$render, options))) ## 18. evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error \u0026\u0026 options$include) 0 else 2, output_handler = knit_handlers(options$render, options)) ## 19. evaluate::evaluate(...) ## 20. evaluate_call(expr, parsed$src[[i]], envir = envir, enclos = enclos, debug = debug, last = i == length(out), use_try = stop_on_error != 2, keep_warning = keep_warning, keep_message = keep_message, output_handler = output_handler, include_timing = include_timing) ## 21. timing_fn(handle(ev \u003c- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler))) ## 22. handle(ev \u003c- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler)) ## 23. withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler) ## 24. withVisible(eval(expr, envir, enclos)) ## 25. eval(expr, envir, enclos) ## 26. eval(expr, envir, enclos) ## 27. shinyCatch({ ## stop(\"some error message\") ## }) ## 28. tryCatch(suppressMessages(suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())))), error = function(m) { ## toastr_actions$error(m) ## return(NULL) ## }) ## 29. tryCatchList(expr, classes, parentenv, handlers) ## 30. tryCatchOne(expr, names, parentenv, handlers[[1]]) ## 31. doTryCatch(return(expr), name, parentenv, handler) ## 32. suppressMessages(suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())))) ## 33. withCallingHandlers(expr, message = function(c) if (inherits(c, classes)) tryInvokeRestart(\"muffleMessage\")) ## 34. suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls()))) ## 35. withCallingHandlers(expr, warning = function(w) if (inherits(w, classes)) tryInvokeRestart(\"muffleWarning\")) ## 36. withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())) ## [SPS-ERROR] 2021-04-16 17:46:56 some error message ## NULL Or use local setting to overwrite the global, even we have spsOption(\"traceback\", TRUE), but traceback is still muted by trace_back = FALSE.\nspsOption(\"traceback\", TRUE) shinyCatch({ stop(\"some error message\") }, trace_back = FALSE) ## [SPS-ERROR] 2021-04-16 17:46:56 some error message ## NULL Traceback with file and line number Let’s write an R file with functions, source it and then call the function from this file. Try it on your own computer:\ntemp_file \u003c- tempfile(fileext = \".R\") writeLines( \"myFunc \u003c- function(){ myFunc2() } myFunc2 \u003c- function(){ stop('some error message') } \", temp_file ) source(temp_file) shinyCatch({ myFunc() }) You can see the error happened in myFunc line No. 2 and then inside this function it calls another function myFunc2 which caused the final error. In myFunc2 it is also the line No. 2 caused the issue and error is coming from /tmp/... file.\nother Shiny built-in options There are some Shiny options can also be helpful on debugging:\n# developer mode, use ?devmode to see details devmode(TRUE) # inspect reactivity in shiny options(shiny.reactlog = TRUE) # similar to SPS's traceback but on the whole app level options(shiny.fullstacktrace = TRUE) # open the `browser` debug mode on error options(shiny.error = browser) # when a shiny app file saves, reload the app, not working with modular apps like SPS at this moment options(shiny.autoreload = TRUE) See Shiny option website{blk} for more details\n","categories":"","description":"","excerpt":" There are some options in SPS that will give you more information and …","ref":"/sps/adv_features/debug/","tags":"","title":"Debugging"},{"body":" Title and logo The default for title is “systemPipeShiny” and default logo is the “img/sps_small.png” which is a relative path of the www folder in your SPS project. You can change them in SPS options. The affected places are:\n","categories":"","description":"","excerpt":" Title and logo The default for title is “systemPipeShiny” and default …","ref":"/sps/adv_features/other_customizations/","tags":"","title":"Other customizations"},{"body":" Some screenshots of SPS Full app Loading screens Workflow module Workflow Execution RNASeq module Canvas Admin Debugging ","categories":"","description":"","excerpt":" Some screenshots of SPS Full app Loading screens Workflow module …","ref":"/sps/screenshots/","tags":"","title":"Screenshots"},{"body":"This is a SPR workflow editor, which will allow you to edit the workflow plot before/after running a workflow in SPR.\n Create a SPR workflow with the sysArgsList (sal) object, or directly use the sal object after workflow running. make a workflow plot with plotWF(sal) to take a glimpse of the plot preview. Use plotWF(sal, out_format = \"dot_print\") to print out the plot in DOT language, copy the whole content to your clipboard. Use this link to open Workflow Plot Editor. Paste plot code in the editor to start editing. ","categories":"","description":"","excerpt":"This is a SPR workflow editor, which will allow you to edit the …","ref":"/sp/spr/editor/","tags":"","title":"Workflow Plot Editor"},{"body":"Hi there!\nThanks for submitting an issue to svg-pan-zoom.\nTo help us help you better, please do the following before submitting an issue:\n Review the available documentation and existing examples Check if the same bug/feature request wasn’t previously reported Make sure you are not asking a usage or debugging question. If you are, use StackOverflow. Fill in the information that corresponds to your type of issue below If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via https://jsfiddle.net or similar (template: http://jsfiddle.net/bumbu/167usffr/). Delete this intro and any unrelated text :smile: (if you do not we’ll assume you haven’t read these instructions and automatically close the issue) Bug report Expected behaviour your text here\nActual behaviour your text here\nSteps to reproduce the behaviour Configuration svg-pan-zoom version: `` Browser(s): `` Operating system(s): `` A relevant example URL: Feature Request Feature description Reasons for adopting new feature Is this a breaking change? (How will this affect existing functionality) ","categories":"","description":"","excerpt":"Hi there!\nThanks for submitting an issue to svg-pan-zoom.\nTo help us …","ref":"/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/","tags":"","title":""},{"body":"layout: true background-image: url(https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png) background-position: 100% 0% background-size: 10%\n","categories":"","description":"","excerpt":"layout: true background-image: …","ref":"/presentations/sps/sps_intro/","tags":"","title":"![](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png){width=1in}\n\u003cbr/\u003e_systemPipeShiny_\n"},{"body":" layout: true background-image: url(https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png) background-position: 99% 1% background-size: 10%\n class: middle\nOutline Introduction Design How to run a Workflow Workflows Tutorial Live Demo class: inverse, center, middle\n Introduction Introduction systemPipeR provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports\n systemPipeR offers many utilities to build, control, and execute workflows entirely from R\n The environment takes advantage of central community S4 classes of the Bioconductor ecosystem\n Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software\n Simple annotation system targets\n systemPipeR’s Core Functionalities .center[ ]\n Structural Features – .left-column[\nWF infrastructure ]\n.right-column[ systemPipeR offers many utilities to build, control, and execute workflows entirely from R. The environment takes advantage of central community S4 classes of the Bioconductor ecosystem. Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software. A layered monitoring infrastructure is provided to design, control and debug each step in a workflow. The run environment allows to execute workflows entirely or with a intuitive to use step-wise execution syntax using R’s standard subsetting syntax (runWF(sys[1:3])) or pipes (%\u003e%). ]\n Structural Features .left-column[\nWF infrastructure Command-line support ]\n.right-column[ An important feature of systemPipeR is support for running command-line software by adopting the Common Workflow Language (CWL). The latter is a widely adopted community standard for describing analysis workflows. This design offers several advantages such as:\n seamless integration of most command-line software\n support to run systemPipeR workflows from R or many other popular computer languages\n efficient sharing of workflows across different workflow environments. ]\n Structural Features .left-column[\nWF infrastructure Command-line support Parallel evaluation ]\n.right-column[ The processing time of workflows can be greatly reduced by making use of parallel evaluations across several CPU cores on single machines, or multiple nodes of computer clusters and cloud-based systems. systemPipeR simplifies these parallelization tasks without creating any limitations for users who do not have access to high-performance computer resources ]\n Structural Features .left-column[\nWF infrastructure Command-line support Parallel evaluation Reports infrastructure ]\n.right-column[ systemPipeR’s reporting infrastructure includes three types of interconnected reports each serving a different purpose:\n a scientific report, based on R Markdown, contains all scientifically relevant results\n a technical report captures all technical information important for each workflow step, including parameter settings, software versions, and warning/error messages, etc.\n a visual report depicts the entire workflow topology including its run status in form of a workflow graph\n]\n Structural Features .left-column[\nWF infrastructure Command-line support Parallel evaluation Reports infrastructure Shiny Web Interface ]\n.right-column[ Recently, the systemPipeShiny package has been added that allows users to design workflows in an interactive graphical user interface (GUI). In addition to designing workflows, this new interface allows users to run and to monitor workflows in an intuitive manner without the need of knowing R. ]\n Structural Features .left-column[\nWF infrastructure Command-line support Parallel evaluation Reports infrastructure Shiny Web Interface Workflow Templates ]\n.right-column[ A rich set of end-to-end workflow templates is provided by this project for a wide range omics applications. In addition, users can contribute and share their workflows with the community by submitting them to a central GitHub repository ]\n Important Functions .small[\n Function Name Description Category genWorkenvir Generates workflow templates provided by systemPipeRdata helper package / or from the individuals’ pipelines packages Accessory loadWorkflow Constructs SYSargs2 object from CWL param and targets files SYSargs2 renderWF Populate all the command-line in an SYSargs2 object SYSargs2 subsetWF Subsetting SYSargs2 class slots SYSargs2 runCommandline Executes command-line software on samples and parameters specified in SYSargs2 object SYSargs2 clusterRun Runs command-line software in parallel mode on a computer cluster SYSargs2 writeTargetsout Write updated targets out to file/Generate targets file with reference SYSargs2 output_update Updates the output files paths in the SYSargs2 object SYSargs2 singleYML Create automatically the param.yml SYSargs2 createWF Create automatically param.cwl and the param.yml based on the command line SYSargs2 config.param Custom configuration of the CWL param files from R SYSargs2 ] Important Functions .small[\n Function Name Description Category initWF Constructs SYSargsList workflow control module (S4 object) from script file SYSargsList configWF Control of which step of the workflow will be run and the generation of the new RMarkdown SYSargsList runWF Runs all the R chunk define in the RMarkdown file or a subset, e.g. runWF[1:3] SYSargsList renderReport Render Scientific Report based on RMarkdown SYSargsList subsetRmd Write updated subset Rmarkdown of R chunk with text associate in the step selected SYSargsList plotWF Plot visual workflow designs and topologies with different graphical layouts SYSargsList statusWF Return the overview of the workflow steps computational status SYSargsList evalCode Turn eval option TRUE or FALSE on RMarkdown file Accessory tryCL Checks if third-party software or utility is installed and set in the PATH Accessory ] class: inverse, center, middle\n Design Workflow Management Solutions systemPipeR central concept for designing workflows is workflow management containers (S4 class)\n SYSargs2 controls workflow steps with input/output file operations\n SYSargs2 requires a targets and a set of workflow definition files (here param.cwl and param.yml)\n -- SYSargsList objects organize one or many SYSargs2 containers in a single compound object capturing all information required to run, control and monitor complex workflows from start to finish\n.center[ ]\n Directory Structure The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:\n Workflows Collection Browse pipelines that are currently available as part of the systemPipeR toolkit\n.small[\n WorkFlow Description Version GitHub CI Testing systemPipeChIPseq ChIP-Seq Workflow Template v1.0 systemPipeRIBOseq RIBO-Seq Workflow Template v1.0 systemPipeRNAseq RNA-Seq Workflow Template v1.0 systemPipeVARseq VAR-Seq Workflow Template v1.0 systemPipeMethylseq Methyl-Seq Workflow Template devel systemPipeDeNovo De novo transcriptome assembly Workflow Template devel systemPipeCLIPseq CLIP-Seq Workflow Template devel systemPipeMetaTrans Metatranscriptomic Sequencing Workflow Template devel ] class: inverse, center, middle\nCWL CWL TODO: Add section with CWL details\n.center[ ]\n CWL and SPR TODO: How to use CWL definition with systemPipeR\n SYSargs2 instances are constructed from a targets file and two param file hisat2-mapping-se.cwl file contains the settings for running command-line software hisat2-mapping-se.yml file define all the variables to be input in the specific command-line step targets \u003c- system.file(\"extdata\", \"targets.txt\", package=\"systemPipeR\") dir_path \u003c- system.file(\"extdata/cwl/hisat2/hisat2-se\", package=\"systemPipeR\") align \u003c- loadWF(targets=targets, wf_file=\"hisat2-mapping-se.cwl\", input_file=\"hisat2-mapping-se.yml\", dir_path=dir_path) align \u003c- renderWF(align, inputvars=c(FileName=\"_FASTQ_PATH_\", SampleName=\"_SampleName_\")) ## Instance of 'SYSargs2': ## Slot names/accessors: ## targets: 18 (M1A...V12B), targetsheader: 4 (lines) ## modules: 2 ## wf: 0, clt: 1, yamlinput: 7 (components) ## input: 18, output: 18 ## cmdlist: 18 ## WF Steps: ## 1. hisat2-mapping-se.cwl (rendered: TRUE) CWL and SPR SYSargs2 instance Slots and accessor functions have the same names names(align) # [1] \"targets\" \"targetsheader\" \"modules\" \"wf\" \"clt\" # [6] \"yamlinput\" \"cmdlist\" \"input\" \"output\" \"cwlfiles\" # [11] \"inputvars\" cmdlist return command-line arguments for the specific software, here HISAT2 for the first sample cmdlist(align)[1] # $M1A # $M1A$`hisat2-mapping-se.cwl` # [1] \"hisat2 -S results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4\" The output components of SYSargs2 define all the expected output files for each step in the workflow; some of which are the input for the next workflow step output(align)[1] # $M1A # $M1A$`hisat2-mapping-se.cwl` # [1] \"results/M1A.sam\" class: inverse, center, middle\n Metadata Targets file organizes samples Structure of targets file for single-end (SE) library targetspath \u003c- system.file(\"extdata\", \"targets.txt\", package=\"systemPipeR\") read.delim(targetspath, comment.char = \"#\")[1:3,1:4] ## FileName SampleName Factor SampleLong ## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A ## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B ## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A Structure of targets file for paired-end (PE) library targetspath \u003c- system.file(\"extdata\", \"targetsPE.txt\", package=\"systemPipeR\") read.delim(targetspath, comment.char = \"#\")[1:3,1:5] ## FileName1 FileName2 SampleName Factor ## 1 ./data/SRR446027_1.fastq.gz ./data/SRR446027_2.fastq.gz M1A M1 ## 2 ./data/SRR446028_1.fastq.gz ./data/SRR446028_2.fastq.gz M1B M1 ## 3 ./data/SRR446029_1.fastq.gz ./data/SRR446029_2.fastq.gz A1A A1 ## SampleLong ## 1 Mock.1h.A ## 2 Mock.1h.B ## 3 Avr.1h.A Integration with SummarizedExperiment Integrates targets files and count table from systemPipeR to a SummarizedExperiment object ## Create an object with targets file and comparison and count table sprSE \u003c- SPRdata(targetspath = targetspath, cmp=TRUE) metadata(sprSE) # $version # [1] ‘1.23.9’ # # $comparison # $comparison$CMPset1 # [,1] [,2] # [1,] \"M1\" \"A1\" # [2,] \"M1\" \"V1\" # [3,] \"A1\" \"V1\" # [4,] \"M6\" \"A6\" colData(sprSE) # DataFrame with 18 rows and 6 columns # FileName SampleName Factor SampleLong # \u003ccharacter\u003e \u003ccharacter\u003e \u003ccharacter\u003e \u003ccharacter\u003e # M1A ./data/SRR446027_1.f.. M1A M1 Mock.1h.A # M1B ./data/SRR446028_1.f.. M1B M1 Mock.1h.B # ... ... ... ... ... # M12B ./data/SRR446040_1.f.. M12B M12 Mock.12h.B class: inverse, center, middle\n Live Demo Install Package Install the systemPipeRdata package from Bioconductor:\nif (!requireNamespace(\"BiocManager\", quietly=TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"systemPipeR\") Load Package and Documentation Load package:\nlibrary(\"systemPipeR\") Access help:\nlibrary(help=\"systemPipeR\") vignette(\"systemPipeR\") Quick Start Load Sample Workflow systemPipeRdata\n Helper package to generate with a single command workflow templates for systemPipeR Includes sample data for testing User can create new workflows or change and extend existing ones Template Workflows: Sample workflows can be loaded with the genWorkenvir function from systemPipeRdata Generate workflow template:\nlibrary(systemPipeRdata) genWorkenvir(workflow=\"rnaseq\") setwd(\"rnaseq\") More details about systemPipeRdata package here\n Install Workflow Check the workflow template availability\navailableWF(github = TRUE) # $systemPipeRdata # [1] \"chipseq\" \"new\" \"riboseq\" \"rnaseq\" \"varseq\" # # $github # workflow branches version html description # 1 systemPipeR/systemPipeChIPseq master release https://github.com/systemPipeR/systemPipeChIPseq Workflow Template # 2 systemPipeR/systemPipeRIBOseq master release https://github.com/systemPipeR/systemPipeRIBOseq Workflow Template # 3 systemPipeR/systemPipeRNAseq cluster, master, singleMachine release https://github.com/systemPipeR/systemPipeRNAseq Workflow Template # 4 systemPipeR/systemPipeVARseq master release https://github.com/systemPipeR/systemPipeVARseq Workflow Template # 5 systemPipeR/systemPipeCLIPseq master devel https://github.com/systemPipeR/systemPipeCLIPseq Workflow Template # 6 systemPipeR/systemPipeDeNovo master devel https://github.com/systemPipeR/systemPipeDeNovo Workflow Template # 7 systemPipeR/systemPipeMetaTrans master devel https://github.com/systemPipeR/systemPipeMetaTrans Workflow Template # 8 systemPipeR/systemPipeMethylseq master devel https://github.com/systemPipeR/systemPipeMethylseq Workflow Template Dynamic Workflow Template Create dynamic Workflow Templates with RStudio\n File -\u003e New File -\u003e R Markdown -\u003e From Template .center[ ]\n Run a Workflow .left-column[\nSetup ]\n.right-column[\nlibrary(systemPipeR) targetspath \u003c- system.file(\"extdata\", \"targets.txt\", package=\"systemPipeR\") read.delim(targetspath, comment.char = \"#\")[1:4,1:4] ## FileName SampleName Factor SampleLong ## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A ## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B ## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A ## 4 ./data/SRR446030_1.fastq.gz A1B A1 Avr.1h.B script \u003c- system.file(\"extdata/workflows/rnaseq\", \"systemPipeRNAseq.Rmd\", package=\"systemPipeRdata\") ]\n Run a Workflow .left-column[\nSetup initWF ]\n.right-column[\nsysargslist \u003c- initWF(script = script, targets = targetspath, overwrite = TRUE) # Project started with success: ./SYSproject and SYSconfig.yml were created. ]\n Run a Workflow .left-column[\nSetup initWF configWF ]\n.right-column[\nsysargslist \u003c- configWF(sysargslist, input_steps = \"1:3\") sysargslist # Instance of 'SYSargsList': # WF Steps: # 1. Rmarkdown/HTML setting # 2. Introduction # 3. Samples and environment settings # 3.1. Environment settings and input data # 3.2. Required packages and resources # 3.3. Experiment definition provided by `targets` file ]\n Run a Workflow .left-column[\nSetup initWF configWF runWF ]\n.right-column[\nsysargslist \u003c- runWF(sysargslist, steps = \"1:2\") # Step: 1: Introduction --\u003e DONE # Step: 2: Samples and environment settings --\u003e DONE # Step: 2.1: Environment settings and input data --\u003e DONE # Step: 2.2: Required packages and resources --\u003e DONE # Step: 2.3: Experiment definition provided by `targets` file --\u003e DONE sysargslist \u003c- runWF(sysargslist, steps = \"ALL\") ]\n Run a Workflow .left-column[\nSetup initWF configWF runWF renderReport ]\n.right-column[\nsysargslist \u003c- renderReport(sysargslist = sysargslist) ]\n How to Use Pipes %\u003e% Consider the following example, in which the steps are the initialization, configuration and running the entire workflow.\nlibrary(systemPipeR) sysargslist \u003c- initWF(script =\"systemPipeRNAseq.Rmd\", overwrite = TRUE) %\u003e% configWF(input_steps = \"1:6\") %\u003e% runWF(steps = \"1:2\") class: inverse, center, middle\n Project Updates targets x SummarizedExperiment Extension “SummarizedExperiment” methods:\nsprSE \u003c- addAssay(sprSE, assay(countMatrix), xName=\"countMatrix\") sprSE \u003c- addMetadata(sprSE, list(targets), xName=\"metadata\") New Function:\n## Create empty SummarizedExperiment sprSE \u003c- SPRdata() ## Create an object with targets file and comparison and count table sprSE \u003c- SPRdata(counts = countMatrix, cmp=TRUE, targetspath = targetspath) metadata(sprSE) colData(sprSE) assays(sprSE) SPR Paper Link to draft\n Added the main points to discuss in the draft\n Writing: Results and introduction\n Improve Graphical Abstract\n Show case?\n SYSargsList Explain how SYSargsList is implemented - Vignette\n.small[\n Function Name Description initWF Constructs SYSargsList workflow control module (S4 object) from script file configWF Control of which step of the workflow will be run and the generation of the new RMarkdown runWF Runs all the R chunk define in the RMarkdown file or a subset, e.g. runWF[1:3] renderReport Render Scientific Report based on RMarkdown renderLog Render logs Report based on RMarkdown updateWF Recover the SYSargsList workflow previous ran and restarts the WF plotWF Plot visual workflow designs and topologies with different graphical layouts statusWF Return the overview of the workflow steps computational status evalCode Turn eval option TRUE or FALSE on RMarkdown file tryCL Checks if third-party software or utility is installed and set in the PATH ] Improve statusWF()\n Visualization in systemPipeR Add to vignette (SPR or SPS)\n exploreDDS, exploreDDSplot, GLMplot, MAplot, MDSplot, PCAplot, hclustplot, heatMaplot, tSNEplot, volcanoplot Enrichment analysis and visualization tool for SPR\n Integration with FGSEA WebSite Updated the vignette\n Added systemPipeRdata vignette and presentation: link\n Redirect http://girke.bioinformatics.ucr.edu/systemPipeR/ to new page\n Add content to FAQ section\n Add tutorials videos\n class: middle\nThanks! Browse source code at \n Ask a question about systemPipeR at Bioconductor Support Page \n systemPipeRdata at Bioconductor\n https://systempipe.org/\n","categories":"","description":"","excerpt":" layout: true background-image: …","ref":"/presentations/spr/spr_project/","tags":"","title":"_systemPipeR_"},{"body":" Find here all the documentation!\n Motivation The analysis of Next-generation sequencing (NGS) data remains a major obstacle to the efficient utilization of the technology. While substantial effort has been invested on the development of software dedicated to the individual analysis steps of NGS experiments, insufficient resources are currently available for integrating the individual software components within the widely used R/Bioconductor environment into automated workflows capable of running the analysis of most types of NGS applications from start-to-finish in a time-efficient and reproducible manner.\nResults To address this need, we have developed the R/Bioconductor package systemPipeR. It is an extensible environment for both building and running end-to-end analysis workflows with automated report generation for a wide range of NGS applications. Its unique features include a uniform workflow interface across different NGS applications, automated report generation, and support for running both R and command-line software on local computers and computer clusters. A flexible sample annotation infrastructure efficiently handles complex sample sets and experimental designs.\nTo simplify the analysis of widely used NGS applications, the package provides pre-configured workflows and reporting templates for a wide range of NGS applications that are listed on the Workflow Collection page of this site. Additional workflow templates will be provided in the future. systemPipeR accelerates the extraction of reproducible analysis results from NGS experiments. By combining the capabilities of many R/Bioconductor and command-line tools, it makes efficient use of existing software resources without limiting the user to a set of predefined methods or environments.\n\nAvailability systemPipeR is freely available for all common operating systems from Bioconductor. Its GitHub repository is here.\n Acknowledgement This project is funded by NSF award ABI-1661152.\n","categories":"","description":"","excerpt":" Find here all the documentation!\n Motivation The analysis of …","ref":"/sp/","tags":"","title":"systemPipeR Documentation"},{"body":"Starting with pre-configured workflow templates To test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow.\nLoad one of the available workflows into your current working directory. The following does this for the varseq workflow template. The name of the resulting workflow directory can be specified under the mydirname argument. The default NULL uses the name of the chosen workflow. An error is issued if a directory of the same name and path exists already.\nlibrary(\"systemPipeRdata\") genWorkenvir(workflow=\"systemPipeR/SPvarseq\", mydirname=NULL) setwd(\"varseq\") On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.\n$ Rscript -e \"systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname=NULL)\" Check availability of workflow templates A collection of workflow templates are available, and it is possible to browse the current availability, as follows:\navailableWF(github = TRUE) ## $systemPipeRdata ## [1] \"chipseq\" \"new\" \"riboseq\" \"rnaseq\" \"varseq\" ## ## $github ## workflow branches version ## 1 systemPipeR/SPchipseq master release ## 2 systemPipeR/SPriboseq master release ## 3 systemPipeR/SPrnaseq cluster, master, singleMachine release ## 4 systemPipeR/SPvarseq master release ## 5 systemPipeR/SPclipseq master devel ## 6 systemPipeR/SPdenovo master devel ## 7 systemPipeR/SPmetatrans master devel ## 8 systemPipeR/SPmethylseq master devel ## 9 systemPipeR/SPmirnaseq master devel ## html description ## 1 https://github.com/systemPipeR/SPchipseq Workflow Template ## 2 https://github.com/systemPipeR/SPriboseq Workflow Template ## 3 https://github.com/systemPipeR/SPrnaseq Workflow Template ## 4 https://github.com/systemPipeR/SPvarseq Workflow Template ## 5 https://github.com/systemPipeR/SPclipseq Workflow Template ## 6 https://github.com/systemPipeR/SPdenovo Workflow Template ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template ## 9 https://github.com/systemPipeR/SPmirnaseq Workflow Template This function returns the list of workflow templates available within the package and systemPipeR Project Organization on GitHub. Each one listed template can be created as described above.\nThe workflow template choose from Github will be installed as an R package, and also it creates an environment with all the settings and files to run the demo analysis.\ngenWorkenvir(workflow=\"systemPipeR/SPrnaseq\", mydirname=\"NULL\") setwd(\"systemPipeVARseq\") Besides, it is possible to choose different versions of the workflow template, defined through other branches on the GitHub Repository. By default, the master branch is selected, however, it is possible to define a different branch with the ref argument.\ngenWorkenvir(workflow=\"systemPipeR/SPrnaseq\", ref = \"singleMachine\") setwd(\"systemPipeRNAseq\") ","categories":"","description":"","excerpt":"Starting with pre-configured workflow templates To test workflows …","ref":"/spr_wf/installwf/","tags":"","title":"How to install systemPipe Workflows"},{"body":" Stay tuned for all sytemPipe project news!\n ","categories":"","description":"","excerpt":" Stay tuned for all sytemPipe project news!\n ","ref":"/news/","tags":"","title":"News"},{"body":"","categories":"","description":"","excerpt":"","ref":"/presentations/","tags":"","title":"Presentations"},{"body":"How to create a new Workflow Template SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.\nInstallation To install SPRthis using from BiocManager the following code:\nif (!requireNamespace(\"BiocManager\", quietly = TRUE)) { install.packages(\"BiocManager\") BiocManager::install(\"dcassol/SPRthis\") Quick start to using to SPRthis ## Load the package library(SPRthis) ## create Package sprthis(wfName=\"SPRtest\", analysis=\"SPRtest\", path=tempdir()) ## ✓ Setting active project to '/tmp/RtmpWTh4tB' ## ✓ Creating 'R/' ## ✓ Writing 'DESCRIPTION' ## Package: SPRtest ## Title: SPRtest ## Version: 0.9.0 ## Authors@R (parsed): ## * First Last \u003cfirst.last@example.com\u003e [aut, cre] (YOUR-ORCID-ID) ## Description: This package provides a pre-configured workflow and reporting ## template for SPRtest. ## License: Artistic-2.0 ## URL: https://github.com/systemPipeR/SPRtest ## Imports: ## systemPipeR (\u003e= 1.25.0) ## Suggests: ## BiocStyle, ## knitr, ## rmarkdown ## VignetteBuilder: ## knitr ## biocViews: Infrastructure, ... ## Encoding: UTF-8 ## LazyData: true ## Roxygen: list(markdown = TRUE) ## RoxygenNote: 7.1.1 ## SystemRequirements: SPRtest can be used to run external command-line ## software, but the corresponding tool needs to be installed on a ## system. ## ✓ Writing 'NAMESPACE' ## ✓ Setting active project to '\u003cno active project\u003e' ## [1] \"/tmp/RtmpWTh4tB\" SPRtest/ ├── DESCRIPTION ├── NAMESPACE ├── README.md ├── SPRtest.Rproj ├── .gitignore ├── .Rbuildignore ├── .Rproj.user/ ├── R/ │ ├── functions.R ├── vignettes │ ├── bibtex.bib │ ├── SPRtest.Rmd └── inst ├── rmarkdown │ └── templates │ └── SPRtest │ ├── template.yml │ └── skeleton │ ├── batchtools.slurm.tmpl │ ├── .batchtools.conf.R │ ├── bibtex.bib │ ├── NEWS │ ├── SPRconfig.yml │ ├── skeleton.Rmd │ ├── targetsPE.txt │ ├── data/ │ ├── param/ │ └── results/ Help functions to create the package Create the webiste for the package with pkgdown Edit the _pkgdown.yml file and run:\npkgdown::build_site() Documentation with roxygen2 roxygen2::roxygenise() Testing the code with testthat To test the code, you can run\ndevtools::test() Package available to genWorkenvir Function After creating the new repository on GitHub systemPipeR Organization, please follow:\n Rules: The Workflow Template need to be available under systemPipeR Organization; The repository needs to be public; About setting: Description: keywords in the description are required: “Workflow Template”; Topics: we expected “systempiper” and “release” or “development” words on Topics section; Branch name: To make simple, please name the branch as “master”. Check availability of workflow templates A collection of workflow templates are available, and it is possible to browse the current availability, as follows:\nsystemPipeRdata::availableWF(github = TRUE) ## $systemPipeRdata ## [1] \"chipseq\" \"new\" \"riboseq\" \"rnaseq\" \"varseq\" ## ## $github ## workflow branches version ## 1 systemPipeR/SPchipseq master release ## 2 systemPipeR/SPriboseq master release ## 3 systemPipeR/SPrnaseq cluster, master, singleMachine release ## 4 systemPipeR/SPvarseq master release ## 5 systemPipeR/SPclipseq master devel ## 6 systemPipeR/SPdenovo master devel ## 7 systemPipeR/SPmetatrans master devel ## 8 systemPipeR/SPmethylseq master devel ## 9 systemPipeR/SPmirnaseq master devel ## html description ## 1 https://github.com/systemPipeR/SPchipseq Workflow Template ## 2 https://github.com/systemPipeR/SPriboseq Workflow Template ## 3 https://github.com/systemPipeR/SPrnaseq Workflow Template ## 4 https://github.com/systemPipeR/SPvarseq Workflow Template ## 5 https://github.com/systemPipeR/SPclipseq Workflow Template ## 6 https://github.com/systemPipeR/SPdenovo Workflow Template ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template ## 9 https://github.com/systemPipeR/SPmirnaseq Workflow Template This function returns the list of workflow templates available within the package and systemPipeR Project Organization on GitHub. Each one listed template can be created as described above.\n","categories":"","description":"","excerpt":"How to create a new Workflow Template SPRthis package expand usethis …","ref":"/spr_wf/newwf/","tags":"","title":"Rules to create a new Workflow Template"},{"body":"","categories":"","description":"","excerpt":"","ref":"/search/","tags":"","title":"Search Results"},{"body":"Workflow Templates systemPipeR project provides pre-configured workflows and reporting templates for a wide range of NGS applications that are listed bellow. The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.\nsystemPipeRdata is a helper package to generate with a single command workflow templates that are intended to be used by its parent package systemPipeR (H Backman and Girke 2016).\n WorkFlow Description Version GitHub R-CMD-check SPchipseq ChIP-Seq Workflow Template SPriboseq RIBO-Seq Workflow Template SPrnaseq RNA-Seq Workflow Template SPvarseq VAR-Seq Workflow Template SPmethylseq Methyl-Seq Workflow Template SPdenovo De novo transcriptome assembly Workflow Template SPclipseq CLIP-Seq Workflow Template SPmetatrans Metatranscriptomic Sequencing Workflow Template SPatacseq ATAC-Seq Workflow Template SPpolyriboseq Polyribosomal RNA-Seq Workflow Template SPhic Hi-C Workflow Template SPmirnaseq MicroRNA-Seq Workflow Template SPblast BLAST Workflow Template SPscrnaseq Single-Cell RNA-Seq Workflow Template Reference H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.\n ","categories":"","description":"","excerpt":"Workflow Templates systemPipeR project provides pre-configured …","ref":"/spr_wf/","tags":"","title":"SPR WorkFlow Collection"},{"body":" #td-cover-block-0 { background-image: url(\"background.jpg\") } systemPipe Workflow Environment loadLogo(\"images/sp_org_links.svg\") Learn More Bioconductor 3.14 New Features A workflow design, report generation, and visualization framework for data analysis\n systemPipe Project\nThe systemPipe project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports.\n Bioconductor Download a stable release from Bioconductor of systemPipeR, systemPipeShiny, systemPipeTools systemPipeRdata.\n Contributions welcome! Get the lastest version, submit issues and pull requests.\nRead more …\n systemPipeShiny Demo Try an interactive demo and tutorial.\n ","categories":"","description":"","excerpt":" #td-cover-block-0 { background-image: url(\"background.jpg\") } …","ref":"/","tags":"","title":"systemPipe"},{"body":" loadLogo(\"/images/sps_logos.svg\") #svg-logo { background: radial-gradient(circle, transparent 0%, rgba(255,255,255,1) 30%), linear-gradient(to right, var(--color), var(--color)), var(--image2); background-repeat: no-repeat; background-size: auto 1200px; background-position: center center; background-blend-mode: var(--blend-top, normal), var(--blend-bottom, saturation), normal; --image2: url(\"/background.jpg\"); --color-v: rgba(76,169,237,1); --color: rgba(76,169,237,1); } #svg-logo svg { margin: 0 auto; display: block; padding: 50px; } systemPipeShiny (SPS) extends the widely used systemPipeR (SPR) workflow environment with a versatile graphical user interface provided by a Shiny App. This allows non-R users, such as experimentalists, to run many systemPipeR’s workflow designs, control, and visualization functionalities interactively without requiring knowledge of R. Most importantly, SPS has been designed as a general purpose framework for interacting with other R packages in an intuitive manner. Like most Shiny Apps, SPS can be used on both local computers as well as centralized server-based deployments that can be accessed remotely as a public web service for using SPR’s functionalities with community and/or private data. The framework can integrate many core packages from the R/Bioconductor ecosystem. Examples of SPS' current functionalities include:\n A default interactive workflow module to create experimental designs, visualize and customize workflow topologies with previews, and programming free workflow execution within the application. An interactive module with extensive plot options to visualize downstream analysis of a RNA-Seq workflow. A quick ggplot module to make all variety of scientific plots from any user defined tabular data. An extendable set of visualization functionalities makes it easy to design custom Shiny Apps under SPS framework without any knowledge of Shiny. A ‘Canvas Workbench’ to manage complex visual results. It allows users to organize and to compare plots in an efficient manner combined with a session screenshot feature to edit scientific and publishable figures. Three other supporting packages to help all users from beginners and advanced developers to extend under current SPS framework or on their own visualization apps. Demo View our online demo app:\n Type and link option changed notes Default full installation{blk} See installation full app Minimum installation{blk} See installation no modules installed Login enabled{blk} login_screen = TRUE; login_theme = \"empty\" no modules installed Login and login themes{blk} login_screen = TRUE; login_theme = \"random\" no modules installed App admin page{blk} admin_page = TRUE or simply add “?admin” to the end of URL of demos For the login required demos, the app account name is “user” password “user”.\nFor the admin panel login, account name “admin”, password “admin”.\nPlease DO NOT delete or change password when you are using the admin features. shinyapp.io will reset the app once a while, but this will affect other people who are trying the demo simultaneously.\nOther packages in systemPipeShiny Package Description Documents Function reference Demo systemPipeShiny{blk} SPS main package website link demo{blk} spsComps{blk} SPS UI and server components website link demo{blk} drawer{blk} SPS interactive image editing tool website link demo{blk} spsUtil{blk} SPS utility functions website link NA ","categories":"","description":"","excerpt":" loadLogo(\"/images/sps_logos.svg\") #svg-logo { background: …","ref":"/sps/","tags":"","title":"systemPipeShiny Documentation"}] \ No newline at end of file diff --git a/public/outreach/conferences/index.html b/public/outreach/conferences/index.html index 03f848d38..b6500263b 100644 --- a/public/outreach/conferences/index.html +++ b/public/outreach/conferences/index.html @@ -1,47 +1,996 @@ -Conferences | sysPipe

Conferences

BioC2021

BioC2020

  • BioC2020{blk}

  • systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk}

  • systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk}

BioC2019

[ View Slides in Separate Browser Tab ]{blk}

Bioc2018

Bioc2016

[ View Slides in Separate Browser Tab ]{blk}

Material for Bioc2016 Tutorial

Installation

Please install systemPipeRdata from this GitHub repository as shown below. This package provides the data and Rmd files for the tutorial. -Its parent package systemPipeR is a dependency and it should install along with all its own dependencies automatically. If it doesn’t then please also install the package, using the BiocManager::install command given below.

if (!requireNamespace("BiocManager", quietly=TRUE))
+
+
+  
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Conferences | sysPipe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Conferences

+ + +

BioC2021

+ +

BioC2020

+
    +
  • +

    BioC2020{blk}

    +
  • +
  • +

    systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk}

    +
  • +
  • +

    systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk}

    +
  • +
+

BioC2019

+ +

[ View Slides in Separate Browser Tab ]{blk}

+ +

Bioc2018

+ +

Bioc2016

+ +

[ View Slides in Separate Browser Tab ]{blk}

+ +

Material for Bioc2016 Tutorial

+ +

Installation

+

Please install systemPipeRdata from this GitHub repository as shown below. This package provides the data and Rmd files for the tutorial. +Its parent package systemPipeR is a dependency and it should install along with all its own dependencies automatically. If it doesn’t then please also install the package, using the BiocManager::install command given below.

+
if (!requireNamespace("BiocManager", quietly=TRUE))
     install.packages("BiocManager")
 BiocManager::install("tgirke/systemPipeRdata", build_vignettes=TRUE, dependencies=TRUE)
-

BioC2015

[ View Slides in Separate Browser Tab ]{blk}


+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/outreach/conferences/index.xml b/public/outreach/conferences/index.xml index 1c63ba075..9148acd78 100644 --- a/public/outreach/conferences/index.xml +++ b/public/outreach/conferences/index.xml @@ -1 +1,17 @@ -sysPipe – Conferences/outreach/conferences/Recent content in Conferences on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Conferences + /outreach/conferences/ + Recent content in Conferences on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/outreach/index.html b/public/outreach/index.html index c48e0b13a..41d538abd 100644 --- a/public/outreach/index.html +++ b/public/outreach/index.html @@ -1,43 +1,909 @@ -Outreach | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

Outreach

+ + + +
+ + + + + +
+ + + + +
+
+ Presentations +
+

+
+ + + +
+
+ Videos Tutorials +
+

+
+ + + +
+
+ Posters +
+

+
+ + + +
+
+ Conferences +
+

+
+ + + +
+ + + +
Last modified 2021-08-06: no_render (171d9df8) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/outreach/index.xml b/public/outreach/index.xml index 26b8794e4..9ab6c8bbf 100644 --- a/public/outreach/index.xml +++ b/public/outreach/index.xml @@ -1 +1,17 @@ -sysPipe – Outreach/outreach/Recent content in Outreach on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Outreach + /outreach/ + Recent content in Outreach on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/outreach/posters/index.html b/public/outreach/posters/index.html index f7794038b..8b1b3955e 100644 --- a/public/outreach/posters/index.html +++ b/public/outreach/posters/index.html @@ -1,43 +1,901 @@ -Posters | sysPipe

Posters

  • systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk}

  • systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk}


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

Posters

+ + +

+
    +
  • systemPipeShiny: An Interactive Framework for Workflow Management and Visualization - F1000{blk}
  • +
+

+ +
    +
  • systemPipeR: a generic workflow environment federates R with command-line software - F1000{blk}
  • +
+

+ +
+ + + + + +
+ + + + + + + + + + + + +
+ + + +
Last modified 2021-08-06: no_render (171d9df8) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/outreach/posters/index.xml b/public/outreach/posters/index.xml index a10ac18ec..25fe32815 100644 --- a/public/outreach/posters/index.xml +++ b/public/outreach/posters/index.xml @@ -1 +1,17 @@ -sysPipe – Posters/outreach/posters/Recent content in Posters on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Posters + /outreach/posters/ + Recent content in Posters on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/outreach/presentations/index.html b/public/outreach/presentations/index.html index 930a43a41..9b967a3e0 100644 --- a/public/outreach/presentations/index.html +++ b/public/outreach/presentations/index.html @@ -1,43 +1,912 @@ -Presentations | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + + + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/outreach/presentations/index.xml b/public/outreach/presentations/index.xml index 7516e6715..6c43bdba7 100644 --- a/public/outreach/presentations/index.xml +++ b/public/outreach/presentations/index.xml @@ -1 +1,17 @@ -sysPipe – Presentations/outreach/presentations/Recent content in Presentations on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Presentations + /outreach/presentations/ + Recent content in Presentations on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/outreach/videos/index.html b/public/outreach/videos/index.html index 16b88878c..3ea4829e0 100644 --- a/public/outreach/videos/index.html +++ b/public/outreach/videos/index.html @@ -1,43 +1,913 @@ -Videos Tutorials | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Videos Tutorials

+ + + + +
+

Page under development.

+ +
+ +

Video Tutorials are coming soon…

+ +
+ + + + + +
+ + + + + + + + + + + + +
+ + + +
Last modified 2021-08-06: no_render (171d9df8) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/outreach/videos/index.xml b/public/outreach/videos/index.xml index 48a2569a5..a47000221 100644 --- a/public/outreach/videos/index.xml +++ b/public/outreach/videos/index.xml @@ -1 +1,17 @@ -sysPipe – Videos Tutorials/outreach/videos/Recent content in Videos Tutorials on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – Videos Tutorials + /outreach/videos/ + Recent content in Videos Tutorials on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/presentations/index.html b/public/presentations/index.html index 73b5892dd..ee0d7e477 100644 --- a/public/presentations/index.html +++ b/public/presentations/index.html @@ -1,35 +1,604 @@ -Presentations | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/presentations/index.xml b/public/presentations/index.xml index d3e47aad7..1ee8bc848 100644 --- a/public/presentations/index.xml +++ b/public/presentations/index.xml @@ -1,63 +1,100 @@ -sysPipe – Presentations/presentations/Recent content in Presentations on sysPipeHugo -- gohugo.ioPresentations: ![](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png){width=1in} -<br/>_systemPipeShiny_/presentations/sps/sps_intro/Mon, 01 Jan 0001 00:00:00 +0000/presentations/sps/sps_intro/ -<!-- background-image: url(https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png) --> -<p>layout: true -background-image: url(<a href="https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png">https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png</a>) + + + sysPipe – Presentations + /presentations/ + Recent content in Presentations on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Presentations: ![](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png){width=1in} +<br/>_systemPipeShiny_ + + /presentations/sps/sps_intro/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /presentations/sps/sps_intro/ + + + + <!-- background-image: url(https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png) --> +<p>layout: true +background-image: url(<a href="https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png">https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png</a>) background-position: 100% 0% -background-size: 10%</p>Presentations: _systemPipeR_/presentations/spr/spr_project/Mon, 01 Jan 0001 00:00:00 +0000/presentations/spr/spr_project/ -<link href="../rmarkdown-libs/font-awesome/css/all.css" rel="stylesheet" /> -<link href="../rmarkdown-libs/font-awesome/css/v4-shims.css" rel="stylesheet" /> -<link href="../rmarkdown-libs/tile-view/tile-view.css" rel="stylesheet" /> -<script src="../rmarkdown-libs/tile-view/tile-view.js"></script> -<link href="../rmarkdown-libs/animate.css/animate.xaringan.css" rel="stylesheet" /> -<link href="../rmarkdown-libs/tachyons/tachyons.min.css" rel="stylesheet" /> -<p>layout: true -background-image: url(<a href="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png">https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png</a>) +background-size: 10%</p> + + + + + + Presentations: _systemPipeR_ + /presentations/spr/spr_project/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /presentations/spr/spr_project/ + + + + <link href="../rmarkdown-libs/font-awesome/css/all.css" rel="stylesheet" /> +<link href="../rmarkdown-libs/font-awesome/css/v4-shims.css" rel="stylesheet" /> +<link href="../rmarkdown-libs/tile-view/tile-view.css" rel="stylesheet" /> +<script src="../rmarkdown-libs/tile-view/tile-view.js"></script> +<link href="../rmarkdown-libs/animate.css/animate.xaringan.css" rel="stylesheet" /> +<link href="../rmarkdown-libs/tachyons/tachyons.min.css" rel="stylesheet" /> +<p>layout: true +background-image: url(<a href="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png">https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png</a>) background-position: 99% 1% -background-size: 10%</p> -<hr> -<p>class: middle</p> -<h2 id="outline">Outline</h2> -<h4 id="introduction">Introduction</h4> -<h4 id="design">Design</h4> -<h4 id="how-to-run-a-workflow">How to run a Workflow</h4> -<h4 id="workflows-tutorial">Workflows Tutorial</h4> -<h4 id="live-demo">Live Demo</h4> -<!-- ################## --> -<!-- ## Introduction --> -<!-- ################## --> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="i-classfas-fa-file-codei-introduction"><i class="fas fa-file-code"></i> Introduction</h1> -<!-- ################## Slide ################## --> -<hr> -<h2 id="introduction-1">Introduction</h2> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em>systemPipeR</em></a> provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>systemPipeR</em> offers many utilities to build, control, and execute -workflows entirely from R</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -The environment takes advantage of central community S4 classes of the Bioconductor ecosystem</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Simple annotation system targets</p> -<!-- ################## Slide ################## --> -<hr> -<h3 id="systempipers-core-functionalities">systemPipeR’s Core Functionalities</h3> -<p>.center[ -<img src="highLevel_color.svg" height="490px" class="center" /> -]</p> -<!-- ################## Slide ################## --> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>&ndash; -.left-column[</p> -<h4 id="wf-infrastructure">WF infrastructure</h4> -<p>]</p> -<p>.right-column[ -<em>systemPipeR</em> offers many utilities to build, control, and execute +background-size: 10%</p> +<hr> +<p>class: middle</p> +<h2 id="outline">Outline</h2> +<h4 id="introduction">Introduction</h4> +<h4 id="design">Design</h4> +<h4 id="how-to-run-a-workflow">How to run a Workflow</h4> +<h4 id="workflows-tutorial">Workflows Tutorial</h4> +<h4 id="live-demo">Live Demo</h4> +<!-- ################## --> +<!-- ## Introduction --> +<!-- ################## --> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="i-classfas-fa-file-codei-introduction"><i class="fas fa-file-code"></i> Introduction</h1> +<!-- ################## Slide ################## --> +<hr> +<h2 id="introduction-1">Introduction</h2> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em>systemPipeR</em></a> provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>systemPipeR</em> offers many utilities to build, control, and execute +workflows entirely from R</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +The environment takes advantage of central community S4 classes of the Bioconductor ecosystem</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Simple annotation system targets</p> +<!-- ################## Slide ################## --> +<hr> +<h3 id="systempipers-core-functionalities">systemPipeR’s Core Functionalities</h3> +<p>.center[ +<img src="highLevel_color.svg" height="490px" class="center" /> +]</p> +<!-- ################## Slide ################## --> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>&ndash; +.left-column[</p> +<h4 id="wf-infrastructure">WF infrastructure</h4> +<p>]</p> +<p>.right-column[ +<em>systemPipeR</em> offers many utilities to build, control, and execute workflows entirely from R. The environment takes advantage of central community S4 classes of the Bioconductor ecosystem. Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line @@ -65,744 +102,754 @@ software. A layered monitoring infrastructure is provided to design, control and step in a workflow. The run environment allows to execute workflows entirely or with a intuitive to use step-wise execution syntax using R’s standard subsetting syntax (runWF(sys[1:3])) or pipes (%&gt;%). -]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features-1"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>.left-column[</p> -<h4 id="wf-infrastructure-1">WF infrastructure</h4> -<h4 id="command-line-support">Command-line support</h4> -<p>]</p> -<p>.right-column[ +]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features-1"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>.left-column[</p> +<h4 id="wf-infrastructure-1">WF infrastructure</h4> +<h4 id="command-line-support">Command-line support</h4> +<p>]</p> +<p>.right-column[ An important feature of systemPipeR is support for running command-line software by adopting the Common Workflow Language (CWL). The latter is a widely adopted community standard for describing analysis workflows. This design -offers several advantages such as:</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -seamless integration of most command-line software</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -support to run systemPipeR workflows from R or many other popular computer languages</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +offers several advantages such as:</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +seamless integration of most command-line software</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +support to run systemPipeR workflows from R or many other popular computer languages</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> efficient sharing of workflows across different workflow environments. -]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features-2"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>.left-column[</p> -<h4 id="wf-infrastructure-2">WF infrastructure</h4> -<h4 id="command-line-support-1">Command-line support</h4> -<h4 id="parallel-evaluation">Parallel evaluation</h4> -<p>]</p> -<p>.right-column[ +]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features-2"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>.left-column[</p> +<h4 id="wf-infrastructure-2">WF infrastructure</h4> +<h4 id="command-line-support-1">Command-line support</h4> +<h4 id="parallel-evaluation">Parallel evaluation</h4> +<p>]</p> +<p>.right-column[ The processing time of workflows can be greatly reduced by making use of parallel evaluations across several CPU cores on single machines, or multiple nodes of computer clusters and cloud-based systems. systemPipeR simplifies these parallelization tasks without creating any limitations for users who do not have access to high-performance computer resources -]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features-3"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>.left-column[</p> -<h4 id="wf-infrastructure-3">WF infrastructure</h4> -<h4 id="command-line-support-2">Command-line support</h4> -<h4 id="parallel-evaluation-1">Parallel evaluation</h4> -<h4 id="reports-infrastructure">Reports infrastructure</h4> -<p>]</p> -<p>.right-column[ -<em>systemPipeR’s</em> reporting infrastructure -includes three types of interconnected reports each serving a different purpose:</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -a scientific report, based on R Markdown, contains all scientifically relevant results</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features-3"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>.left-column[</p> +<h4 id="wf-infrastructure-3">WF infrastructure</h4> +<h4 id="command-line-support-2">Command-line support</h4> +<h4 id="parallel-evaluation-1">Parallel evaluation</h4> +<h4 id="reports-infrastructure">Reports infrastructure</h4> +<p>]</p> +<p>.right-column[ +<em>systemPipeR’s</em> reporting infrastructure +includes three types of interconnected reports each serving a different purpose:</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +a scientific report, based on R Markdown, contains all scientifically relevant results</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> a technical report captures all technical information important for each workflow step, including parameter -settings, software versions, and warning/error messages, etc.</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -a visual report depicts the entire workflow topology including its run status in form of a workflow graph</p> -<p>]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features-4"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>.left-column[</p> -<h4 id="wf-infrastructure-4">WF infrastructure</h4> -<h4 id="command-line-support-3">Command-line support</h4> -<h4 id="parallel-evaluation-2">Parallel evaluation</h4> -<h4 id="reports-infrastructure-1">Reports infrastructure</h4> -<h4 id="shiny-web-interface">Shiny Web Interface</h4> -<p>]</p> -<p>.right-column[ +settings, software versions, and warning/error messages, etc.</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +a visual report depicts the entire workflow topology including its run status in form of a workflow graph</p> +<p>]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features-4"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>.left-column[</p> +<h4 id="wf-infrastructure-4">WF infrastructure</h4> +<h4 id="command-line-support-3">Command-line support</h4> +<h4 id="parallel-evaluation-2">Parallel evaluation</h4> +<h4 id="reports-infrastructure-1">Reports infrastructure</h4> +<h4 id="shiny-web-interface">Shiny Web Interface</h4> +<p>]</p> +<p>.right-column[ Recently, the systemPipeShiny package has been added that allows users to design workflows in an interactive graphical user interface (GUI). In addition to designing workflows, this new interface allows users to run and to monitor workflows in an intuitive manner without the need of knowing R. -]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-structural-features-5"><i class="fas fa-toolbox"></i> Structural Features</h2> -<p>.left-column[</p> -<h4 id="wf-infrastructure-5">WF infrastructure</h4> -<h4 id="command-line-support-4">Command-line support</h4> -<h4 id="parallel-evaluation-3">Parallel evaluation</h4> -<h4 id="reports-infrastructure-2">Reports infrastructure</h4> -<h4 id="shiny-web-interface-1">Shiny Web Interface</h4> -<h4 id="workflow-templates">Workflow Templates</h4> -<p>]</p> -<p>.right-column[ +]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-structural-features-5"><i class="fas fa-toolbox"></i> Structural Features</h2> +<p>.left-column[</p> +<h4 id="wf-infrastructure-5">WF infrastructure</h4> +<h4 id="command-line-support-4">Command-line support</h4> +<h4 id="parallel-evaluation-3">Parallel evaluation</h4> +<h4 id="reports-infrastructure-2">Reports infrastructure</h4> +<h4 id="shiny-web-interface-1">Shiny Web Interface</h4> +<h4 id="workflow-templates">Workflow Templates</h4> +<p>]</p> +<p>.right-column[ A rich set of end-to-end workflow templates is provided by this project for a wide range omics applications. In addition, users can contribute and share their workflows with the community by submitting them to a central GitHub repository -]</p> -<!-- ################## Slide ################## --> -<hr> -<h2 id="important-functions">Important Functions</h2> -<p>.small[</p> -<table> -<thead> -<tr> -<th>Function Name</th> -<th>Description</th> -<th>Category</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>genWorkenvir</code></td> -<td>Generates workflow templates provided by systemPipeRdata helper package / or from the individuals’ pipelines packages</td> -<td>Accessory</td> -</tr> -<tr> -<td><code>loadWorkflow</code></td> -<td>Constructs <code>SYSargs2</code> object from CWL param and targets files</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>renderWF</code></td> -<td>Populate all the command-line in an <code>SYSargs2</code> object</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>subsetWF</code></td> -<td>Subsetting <code>SYSargs2</code> class slots</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>runCommandline</code></td> -<td>Executes command-line software on samples and parameters specified in <code>SYSargs2</code> object</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>clusterRun</code></td> -<td>Runs command-line software in parallel mode on a computer cluster</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>writeTargetsout</code></td> -<td>Write updated targets out to file/Generate targets file with reference</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>output_update</code></td> -<td>Updates the output files paths in the <code>SYSargs2</code> object</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>singleYML</code></td> -<td>Create automatically the <code>param.yml</code></td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>createWF</code></td> -<td>Create automatically <code>param.cwl</code> and the <code>param.yml</code> based on the command line</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td><code>config.param</code></td> -<td>Custom configuration of the CWL param files from R</td> -<td><code>SYSargs2</code></td> -</tr> -<tr> -<td>]</td> -<td></td> -<td></td> -</tr> -</tbody> -</table> -<hr> -<h2 id="important-functions-1">Important Functions</h2> -<p>.small[</p> -<table> -<thead> -<tr> -<th>Function Name</th> -<th>Description</th> -<th>Category</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>initWF</code></td> -<td>Constructs <code>SYSargsList</code> workflow control module (S4 object) from script file</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>configWF</code></td> -<td>Control of which step of the workflow will be run and the generation of the new RMarkdown</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>runWF</code></td> -<td>Runs all the R chunk define in the RMarkdown file or a subset, e.g. <code>runWF[1:3]</code></td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>renderReport</code></td> -<td>Render Scientific Report based on RMarkdown</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>subsetRmd</code></td> -<td>Write updated subset Rmarkdown of R chunk with text associate in the step selected</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>plotWF</code></td> -<td>Plot visual workflow designs and topologies with different graphical layouts</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>statusWF</code></td> -<td>Return the overview of the workflow steps computational status</td> -<td><code>SYSargsList</code></td> -</tr> -<tr> -<td><code>evalCode</code></td> -<td>Turn eval option <code>TRUE</code> or <code>FALSE</code> on RMarkdown file</td> -<td>Accessory</td> -</tr> -<tr> -<td><code>tryCL</code></td> -<td>Checks if third-party software or utility is installed and set in the PATH</td> -<td>Accessory</td> -</tr> -<tr> -<td>]</td> -<td></td> -<td></td> -</tr> -</tbody> -</table> -<!-- ################## --> -<!-- ## Design --> -<!-- ################## --> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="i-classfas-fa-drafting-compassi-design"><i class="fas fa-drafting-compass"></i> Design</h1> -<hr> -<h3 id="workflow-management-solutions">Workflow Management Solutions</h3> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>systemPipeR</em> central concept for designing workflows is <strong>workflow -management containers</strong> (S4 class)</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>SYSargs2</em> controls workflow steps with input/output file operations</p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>SYSargs2</em> requires a targets and a set of workflow definition files (here param.cwl and param.yml)</p> -<!-- <i class="fas fa-hand-point-right" style="color:#00758a;"></i> --> -<!-- Any number of predefined or custom workflow steps is supported --> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>SYSargsList</em> objects organize one or many <em>SYSargs2</em> +]</p> +<!-- ################## Slide ################## --> +<hr> +<h2 id="important-functions">Important Functions</h2> +<p>.small[</p> +<table> +<thead> +<tr> +<th>Function Name</th> +<th>Description</th> +<th>Category</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>genWorkenvir</code></td> +<td>Generates workflow templates provided by systemPipeRdata helper package / or from the individuals’ pipelines packages</td> +<td>Accessory</td> +</tr> +<tr> +<td><code>loadWorkflow</code></td> +<td>Constructs <code>SYSargs2</code> object from CWL param and targets files</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>renderWF</code></td> +<td>Populate all the command-line in an <code>SYSargs2</code> object</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>subsetWF</code></td> +<td>Subsetting <code>SYSargs2</code> class slots</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>runCommandline</code></td> +<td>Executes command-line software on samples and parameters specified in <code>SYSargs2</code> object</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>clusterRun</code></td> +<td>Runs command-line software in parallel mode on a computer cluster</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>writeTargetsout</code></td> +<td>Write updated targets out to file/Generate targets file with reference</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>output_update</code></td> +<td>Updates the output files paths in the <code>SYSargs2</code> object</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>singleYML</code></td> +<td>Create automatically the <code>param.yml</code></td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>createWF</code></td> +<td>Create automatically <code>param.cwl</code> and the <code>param.yml</code> based on the command line</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td><code>config.param</code></td> +<td>Custom configuration of the CWL param files from R</td> +<td><code>SYSargs2</code></td> +</tr> +<tr> +<td>]</td> +<td></td> +<td></td> +</tr> +</tbody> +</table> +<hr> +<h2 id="important-functions-1">Important Functions</h2> +<p>.small[</p> +<table> +<thead> +<tr> +<th>Function Name</th> +<th>Description</th> +<th>Category</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>initWF</code></td> +<td>Constructs <code>SYSargsList</code> workflow control module (S4 object) from script file</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>configWF</code></td> +<td>Control of which step of the workflow will be run and the generation of the new RMarkdown</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>runWF</code></td> +<td>Runs all the R chunk define in the RMarkdown file or a subset, e.g. <code>runWF[1:3]</code></td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>renderReport</code></td> +<td>Render Scientific Report based on RMarkdown</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>subsetRmd</code></td> +<td>Write updated subset Rmarkdown of R chunk with text associate in the step selected</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>plotWF</code></td> +<td>Plot visual workflow designs and topologies with different graphical layouts</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>statusWF</code></td> +<td>Return the overview of the workflow steps computational status</td> +<td><code>SYSargsList</code></td> +</tr> +<tr> +<td><code>evalCode</code></td> +<td>Turn eval option <code>TRUE</code> or <code>FALSE</code> on RMarkdown file</td> +<td>Accessory</td> +</tr> +<tr> +<td><code>tryCL</code></td> +<td>Checks if third-party software or utility is installed and set in the PATH</td> +<td>Accessory</td> +</tr> +<tr> +<td>]</td> +<td></td> +<td></td> +</tr> +</tbody> +</table> +<!-- ################## --> +<!-- ## Design --> +<!-- ################## --> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="i-classfas-fa-drafting-compassi-design"><i class="fas fa-drafting-compass"></i> Design</h1> +<hr> +<h3 id="workflow-management-solutions">Workflow Management Solutions</h3> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>systemPipeR</em> central concept for designing workflows is <strong>workflow +management containers</strong> (S4 class)</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>SYSargs2</em> controls workflow steps with input/output file operations</p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>SYSargs2</em> requires a targets and a set of workflow definition files (here param.cwl and param.yml)</p> +<!-- <i class="fas fa-hand-point-right" style="color:#00758a;"></i> --> +<!-- Any number of predefined or custom workflow steps is supported --> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>SYSargsList</em> objects organize one or many <em>SYSargs2</em> containers in a single compound object capturing all information required to run, control and -monitor complex workflows from start to finish</p> -<p>.center[ -<img src="SPRclass.png" class="center" /> -]</p> -<hr> -<h2 id="i-classfar-fa-folder-openi-directory-structure"><i class="far fa-folder-open"></i> Directory Structure</h2> -<p>The workflow templates generated by <em><code>genWorkenvir</code></em> contain the following preconfigured directory structure:</p> -<p><img src="directory.png" height="425px" class="center" /></p> -<hr> -<h2 id="i-classfas-fa-project-diagrami-workflows-collection"><i class="fas fa-project-diagram"></i> Workflows Collection</h2> -<p>Browse pipelines that are currently available as part of the <em>systemPipeR</em> toolkit</p> -<p>.small[</p> -<table> -<thead> -<tr> -<th style="text-align:center">WorkFlow</th> -<th style="text-align:center">Description</th> -<th style="text-align:center">Version</th> -<th style="text-align:center">GitHub</th> -<th style="text-align:center">CI Testing</th> -</tr> -</thead> -<tbody> -<tr> -<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeChIPseq/articles/systemPipeChIPseq.html">systemPipeChIPseq</a></td> -<td style="text-align:center">ChIP-Seq Workflow Template</td> -<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeChIPseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeChIPseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeRIBOseq/articles/systemPipeRIBOseq.html">systemPipeRIBOseq</a></td> -<td style="text-align:center">RIBO-Seq Workflow Template</td> -<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeRIBOseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeRIBOseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeRNAseq/articles/systemPipeRNAseq.html">systemPipeRNAseq</a></td> -<td style="text-align:center">RNA-Seq Workflow Template</td> -<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeRNAseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeRNAseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeVARseq/articles/systemPipeVARseq.html">systemPipeVARseq</a></td> -<td style="text-align:center">VAR-Seq Workflow Template</td> -<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeVARseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeVARseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMethylseq">systemPipeMethylseq</a></td> -<td style="text-align:center">Methyl-Seq Workflow Template</td> -<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMethylseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeMethylseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeDeNovo">systemPipeDeNovo</a></td> -<td style="text-align:center">De novo transcriptome assembly Workflow Template</td> -<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeDeNovo"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeDeNovo/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeCLIPseq">systemPipeCLIPseq</a></td> -<td style="text-align:center">CLIP-Seq Workflow Template</td> -<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeCLIPseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeCLIPseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMetaTrans">systemPipeMetaTrans</a></td> -<td style="text-align:center">Metatranscriptomic Sequencing Workflow Template</td> -<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> -<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMetaTrans"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> -<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeMetaTrans/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> -</tr> -<tr> -<td style="text-align:center">]</td> -<td></td> -<td></td> -<td></td> -<td></td> -</tr> -</tbody> -</table> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="cwl">CWL</h1> -<hr> -<h2 id="i-classfas-fa-box-openi-cwl"><i class="fas fa-box-open"></i> CWL</h2> -<p><i class="fas fa-circle" style="color:#00758a;"></i> <strong>TODO:</strong> -Add section with CWL details</p> -<p>.center[ -<img src="cwl.png" height="490px" class="center" /> -]</p> -<hr> -<h2 id="i-classfas-fa-box-openi-cwl-and-spr"><i class="fas fa-box-open"></i> CWL and SPR</h2> -<p><i class="fas fa-circle" style="color:#00758a;"></i> <strong>TODO:</strong> -How to use CWL definition with <em>systemPipeR</em></p> -<ul> -<li><em>SYSargs2</em> instances are constructed from a <em><code>targets</code></em> file and two <em><code>param</code></em> file -<ul> -<li><em><code>hisat2-mapping-se.cwl</code></em> file contains the settings for running command-line software</li> -<li><em><code>hisat2-mapping-se.yml</code></em> file define all the variables to be input in the specific command-line step </h4></li> -</ul> -</li> -</ul> -<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) +monitor complex workflows from start to finish</p> +<p>.center[ +<img src="SPRclass.png" class="center" /> +]</p> +<hr> +<h2 id="i-classfar-fa-folder-openi-directory-structure"><i class="far fa-folder-open"></i> Directory Structure</h2> +<p>The workflow templates generated by <em><code>genWorkenvir</code></em> contain the following preconfigured directory structure:</p> +<p><img src="directory.png" height="425px" class="center" /></p> +<hr> +<h2 id="i-classfas-fa-project-diagrami-workflows-collection"><i class="fas fa-project-diagram"></i> Workflows Collection</h2> +<p>Browse pipelines that are currently available as part of the <em>systemPipeR</em> toolkit</p> +<p>.small[</p> +<table> +<thead> +<tr> +<th style="text-align:center">WorkFlow</th> +<th style="text-align:center">Description</th> +<th style="text-align:center">Version</th> +<th style="text-align:center">GitHub</th> +<th style="text-align:center">CI Testing</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeChIPseq/articles/systemPipeChIPseq.html">systemPipeChIPseq</a></td> +<td style="text-align:center">ChIP-Seq Workflow Template</td> +<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeChIPseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeChIPseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeRIBOseq/articles/systemPipeRIBOseq.html">systemPipeRIBOseq</a></td> +<td style="text-align:center">RIBO-Seq Workflow Template</td> +<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeRIBOseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeRIBOseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeRNAseq/articles/systemPipeRNAseq.html">systemPipeRNAseq</a></td> +<td style="text-align:center">RNA-Seq Workflow Template</td> +<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeRNAseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeRNAseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://systempiper.github.io/systemPipeVARseq/articles/systemPipeVARseq.html">systemPipeVARseq</a></td> +<td style="text-align:center">VAR-Seq Workflow Template</td> +<td style="text-align:center">v1.0 <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/check.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeVARseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeVARseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMethylseq">systemPipeMethylseq</a></td> +<td style="text-align:center">Methyl-Seq Workflow Template</td> +<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMethylseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeMethylseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeDeNovo">systemPipeDeNovo</a></td> +<td style="text-align:center">De novo transcriptome assembly Workflow Template</td> +<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeDeNovo"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeDeNovo/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeCLIPseq">systemPipeCLIPseq</a></td> +<td style="text-align:center">CLIP-Seq Workflow Template</td> +<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeCLIPseq"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeCLIPseq/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMetaTrans">systemPipeMetaTrans</a></td> +<td style="text-align:center">Metatranscriptomic Sequencing Workflow Template</td> +<td style="text-align:center">devel <img src="https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/devel.png" align="center" style="width:25px;" /></td> +<td style="text-align:center"><a href="https://github.com/systemPipeR/systemPipeMetaTrans"> <img src="https://raw.githubusercontent.com/systemPipeR/systemPipeR/gh-pages/images/GitHub-Mark-120px-plus.png" align="center" style="width:20px;" /></td> +<td style="text-align:center"><img src="https://github.com/systemPipeR/systemPipeMetaTrans/workflows/R-CMD-check/badge.svg" alt="R-CMD-check"></td> +</tr> +<tr> +<td style="text-align:center">]</td> +<td></td> +<td></td> +<td></td> +<td></td> +</tr> +</tbody> +</table> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="cwl">CWL</h1> +<hr> +<h2 id="i-classfas-fa-box-openi-cwl"><i class="fas fa-box-open"></i> CWL</h2> +<p><i class="fas fa-circle" style="color:#00758a;"></i> <strong>TODO:</strong> +Add section with CWL details</p> +<p>.center[ +<img src="cwl.png" height="490px" class="center" /> +]</p> +<hr> +<h2 id="i-classfas-fa-box-openi-cwl-and-spr"><i class="fas fa-box-open"></i> CWL and SPR</h2> +<p><i class="fas fa-circle" style="color:#00758a;"></i> <strong>TODO:</strong> +How to use CWL definition with <em>systemPipeR</em></p> +<ul> +<li><em>SYSargs2</em> instances are constructed from a <em><code>targets</code></em> file and two <em><code>param</code></em> file +<ul> +<li><em><code>hisat2-mapping-se.cwl</code></em> file contains the settings for running command-line software</li> +<li><em><code>hisat2-mapping-se.yml</code></em> file define all the variables to be input in the specific command-line step </h4></li> +</ul> +</li> +</ul> +<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/hisat2/hisat2-se&quot;, package=&quot;systemPipeR&quot;) align &lt;- loadWF(targets=targets, wf_file=&quot;hisat2-mapping-se.cwl&quot;, -input_file=&quot;hisat2-mapping-se.yml&quot;, dir_path=dir_path) + input_file=&quot;hisat2-mapping-se.yml&quot;, dir_path=dir_path) align &lt;- renderWF(align, inputvars=c(FileName=&quot;_FASTQ_PATH_&quot;, SampleName=&quot;_SampleName_&quot;)) -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 18 (M1A...V12B), targetsheader: 4 (lines) -## modules: 2 -## wf: 0, clt: 1, yamlinput: 7 (components) -## input: 18, output: 18 -## cmdlist: 18 -## WF Steps: -## 1. hisat2-mapping-se.cwl (rendered: TRUE) -</code></pre> -<hr> -<h2 id="i-classfas-fa-box-openi-cwl-and-spr-1"><i class="fas fa-box-open"></i> CWL and SPR</h2> -<h2 id="sysargs2-instance"><em><code>SYSargs2</code></em> instance</h2> -<ul> -<li>Slots and accessor functions have the same names</li> -</ul> -<pre><code class="language-r">names(align) -# [1] &quot;targets&quot; &quot;targetsheader&quot; &quot;modules&quot; &quot;wf&quot; &quot;clt&quot; -# [6] &quot;yamlinput&quot; &quot;cmdlist&quot; &quot;input&quot; &quot;output&quot; &quot;cwlfiles&quot; -# [11] &quot;inputvars&quot; -</code></pre> -<ul> -<li><em><code>cmdlist</code></em> return command-line arguments for the specific software, here <em><code>HISAT2</code></em> for the first sample</li> -</ul> -<pre><code class="language-r">cmdlist(align)[1] + +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 18 (M1A...V12B), targetsheader: 4 (lines) +## modules: 2 +## wf: 0, clt: 1, yamlinput: 7 (components) +## input: 18, output: 18 +## cmdlist: 18 +## WF Steps: +## 1. hisat2-mapping-se.cwl (rendered: TRUE) +</code></pre> +<hr> +<h2 id="i-classfas-fa-box-openi-cwl-and-spr-1"><i class="fas fa-box-open"></i> CWL and SPR</h2> +<h2 id="sysargs2-instance"><em><code>SYSargs2</code></em> instance</h2> +<ul> +<li>Slots and accessor functions have the same names</li> +</ul> +<pre><code class="language-r">names(align) +# [1] &quot;targets&quot; &quot;targetsheader&quot; &quot;modules&quot; &quot;wf&quot; &quot;clt&quot; +# [6] &quot;yamlinput&quot; &quot;cmdlist&quot; &quot;input&quot; &quot;output&quot; &quot;cwlfiles&quot; +# [11] &quot;inputvars&quot; +</code></pre> +<ul> +<li><em><code>cmdlist</code></em> return command-line arguments for the specific software, here <em><code>HISAT2</code></em> for the first sample</li> +</ul> +<pre><code class="language-r">cmdlist(align)[1] # $M1A # $M1A$`hisat2-mapping-se.cwl` -# [1] &quot;hisat2 -S results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; -</code></pre> -<ul> -<li>The output components of <em><code>SYSargs2</code></em> define all the expected output files for each step in the workflow; some of which are the input for the next workflow step</li> -</ul> -<pre><code class="language-r">output(align)[1] +# [1] &quot;hisat2 -S results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; +</code></pre> +<ul> +<li>The output components of <em><code>SYSargs2</code></em> define all the expected output files for each step in the workflow; some of which are the input for the next workflow step</li> +</ul> +<pre><code class="language-r">output(align)[1] # $M1A # $M1A$`hisat2-mapping-se.cwl` # [1] &quot;results/M1A.sam&quot; -</code></pre> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="i-classfas-fa-tablei-metadata"><i class="fas fa-table"></i> Metadata</h1> -<hr> -<h3 id="i-classfas-fa-box-openi-targets-file-organizes-samples"><i class="fas fa-box-open"></i> <em>Targets</em> file organizes samples</h3> -<ul> -<li>Structure of <em><code>targets</code></em> file for single-end (SE) library</li> -</ul> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) +</code></pre> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="i-classfas-fa-tablei-metadata"><i class="fas fa-table"></i> Metadata</h1> +<hr> +<h3 id="i-classfas-fa-box-openi-targets-file-organizes-samples"><i class="fas fa-box-open"></i> <em>Targets</em> file organizes samples</h3> +<ul> +<li>Structure of <em><code>targets</code></em> file for single-end (SE) library</li> +</ul> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) read.delim(targetspath, comment.char = &quot;#&quot;)[1:3,1:4] -</code></pre> -<pre><code>## FileName SampleName Factor SampleLong -## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A -## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B -## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A -</code></pre> -<ul> -<li>Structure of <em><code>targets</code></em> file for paired-end (PE) library</li> -</ul> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package=&quot;systemPipeR&quot;) +</code></pre> +<pre><code>## FileName SampleName Factor SampleLong +## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A +## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B +## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A +</code></pre> +<ul> +<li>Structure of <em><code>targets</code></em> file for paired-end (PE) library</li> +</ul> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package=&quot;systemPipeR&quot;) read.delim(targetspath, comment.char = &quot;#&quot;)[1:3,1:5] -</code></pre> -<pre><code>## FileName1 FileName2 SampleName Factor -## 1 ./data/SRR446027_1.fastq.gz ./data/SRR446027_2.fastq.gz M1A M1 -## 2 ./data/SRR446028_1.fastq.gz ./data/SRR446028_2.fastq.gz M1B M1 -## 3 ./data/SRR446029_1.fastq.gz ./data/SRR446029_2.fastq.gz A1A A1 -## SampleLong -## 1 Mock.1h.A -## 2 Mock.1h.B -## 3 Avr.1h.A -</code></pre> -<hr> -<h3 id="i-classfas-fa-box-openi-integration-with-summarizedexperiment"><i class="fas fa-box-open"></i> Integration with <em>SummarizedExperiment</em></h3> -<ul> -<li>Integrates <em>targets</em> files and count table from <em>systemPipeR</em> to a <em>SummarizedExperiment</em> object</li> -</ul> -<pre><code class="language-r">## Create an object with targets file and comparison and count table +</code></pre> +<pre><code>## FileName1 FileName2 SampleName Factor +## 1 ./data/SRR446027_1.fastq.gz ./data/SRR446027_2.fastq.gz M1A M1 +## 2 ./data/SRR446028_1.fastq.gz ./data/SRR446028_2.fastq.gz M1B M1 +## 3 ./data/SRR446029_1.fastq.gz ./data/SRR446029_2.fastq.gz A1A A1 +## SampleLong +## 1 Mock.1h.A +## 2 Mock.1h.B +## 3 Avr.1h.A +</code></pre> +<hr> +<h3 id="i-classfas-fa-box-openi-integration-with-summarizedexperiment"><i class="fas fa-box-open"></i> Integration with <em>SummarizedExperiment</em></h3> +<ul> +<li>Integrates <em>targets</em> files and count table from <em>systemPipeR</em> to a <em>SummarizedExperiment</em> object</li> +</ul> +<pre><code class="language-r">## Create an object with targets file and comparison and count table sprSE &lt;- SPRdata(targetspath = targetspath, cmp=TRUE) metadata(sprSE) # $version # [1] ‘1.23.9’ -# +# # $comparison # $comparison$CMPset1 -# [,1] [,2] -# [1,] &quot;M1&quot; &quot;A1&quot; -# [2,] &quot;M1&quot; &quot;V1&quot; -# [3,] &quot;A1&quot; &quot;V1&quot; -# [4,] &quot;M6&quot; &quot;A6&quot; +# [,1] [,2] +# [1,] &quot;M1&quot; &quot;A1&quot; +# [2,] &quot;M1&quot; &quot;V1&quot; +# [3,] &quot;A1&quot; &quot;V1&quot; +# [4,] &quot;M6&quot; &quot;A6&quot; + colData(sprSE) # DataFrame with 18 rows and 6 columns -# FileName SampleName Factor SampleLong -# &lt;character&gt; &lt;character&gt; &lt;character&gt; &lt;character&gt; -# M1A ./data/SRR446027_1.f.. M1A M1 Mock.1h.A -# M1B ./data/SRR446028_1.f.. M1B M1 Mock.1h.B -# ... ... ... ... ... -# M12B ./data/SRR446040_1.f.. M12B M12 Mock.12h.B -</code></pre> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="i-classfas-fa-codei-live-demo"><i class="fas fa-code"></i> Live Demo</h1> -<hr> -<h2 id="i-classfas-fa-box-openi-install-package"><i class="fas fa-box-open"></i> Install Package</h2> -<p>Install the <strong>systemPipeRdata</strong> package from <a href="http://www.bioconductor.org/packages/release/data/experiment/html/systemPipeRdata.html">Bioconductor</a>:</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly=TRUE)) -install.packages(&quot;BiocManager&quot;) +# FileName SampleName Factor SampleLong +# &lt;character&gt; &lt;character&gt; &lt;character&gt; &lt;character&gt; +# M1A ./data/SRR446027_1.f.. M1A M1 Mock.1h.A +# M1B ./data/SRR446028_1.f.. M1B M1 Mock.1h.B +# ... ... ... ... ... +# M12B ./data/SRR446040_1.f.. M12B M12 Mock.12h.B +</code></pre> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="i-classfas-fa-codei-live-demo"><i class="fas fa-code"></i> Live Demo</h1> +<hr> +<h2 id="i-classfas-fa-box-openi-install-package"><i class="fas fa-box-open"></i> Install Package</h2> +<p>Install the <strong>systemPipeRdata</strong> package from <a href="http://www.bioconductor.org/packages/release/data/experiment/html/systemPipeRdata.html">Bioconductor</a>:</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly=TRUE)) + install.packages(&quot;BiocManager&quot;) BiocManager::install(&quot;systemPipeR&quot;) -</code></pre> -<h3 id="i-classfas-fa-booki-load-package-and-documentation"><i class="fas fa-book"></i> Load Package and Documentation</h3> -<p><i class="fas fa-question" style="color:#00758a;"></i> -Load package:</p> -<pre><code class="language-r">library(&quot;systemPipeR&quot;) -</code></pre> -<p><i class="fas fa-question" style="color:#00758a;"></i> -Access help:</p> -<pre><code class="language-r">library(help=&quot;systemPipeR&quot;) +</code></pre> +<h3 id="i-classfas-fa-booki-load-package-and-documentation"><i class="fas fa-book"></i> Load Package and Documentation</h3> +<p><i class="fas fa-question" style="color:#00758a;"></i> +Load package:</p> +<pre><code class="language-r">library(&quot;systemPipeR&quot;) +</code></pre> +<p><i class="fas fa-question" style="color:#00758a;"></i> +Access help:</p> +<pre><code class="language-r">library(help=&quot;systemPipeR&quot;) vignette(&quot;systemPipeR&quot;) -</code></pre> -<hr> -<h2 id="i-classfas-fa-codei-quick-start"><i class="fas fa-code"></i> Quick Start</h2> -<h3 id="load-sample-workflow">Load Sample Workflow</h3> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>systemPipeRdata</em></p> -<ul> -<li>Helper package to generate with a single command workflow templates for <em>systemPipeR</em></li> -<li>Includes sample data for testing</li> -<li>User can create new workflows or change and extend existing ones</li> -<li>Template Workflows: -<ul> -<li>Sample workflows can be loaded with the <em><code>genWorkenvir</code></em> function from <strong>systemPipeRdata</strong></li> -</ul> -</li> -</ul> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Generate workflow template:</p> -<pre><code class="language-r">library(systemPipeRdata) +</code></pre> +<hr> +<h2 id="i-classfas-fa-codei-quick-start"><i class="fas fa-code"></i> Quick Start</h2> +<h3 id="load-sample-workflow">Load Sample Workflow</h3> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>systemPipeRdata</em></p> +<ul> +<li>Helper package to generate with a single command workflow templates for <em>systemPipeR</em></li> +<li>Includes sample data for testing</li> +<li>User can create new workflows or change and extend existing ones</li> +<li>Template Workflows: +<ul> +<li>Sample workflows can be loaded with the <em><code>genWorkenvir</code></em> function from <strong>systemPipeRdata</strong></li> +</ul> +</li> +</ul> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Generate workflow template:</p> +<pre><code class="language-r">library(systemPipeRdata) genWorkenvir(workflow=&quot;rnaseq&quot;) setwd(&quot;rnaseq&quot;) -</code></pre> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -More details about <em>systemPipeRdata</em> package <a href="https://systempipe.org/pages/SPRdata_intro/SPRdata_intro#1">here</a></p> -<hr> -<h2 id="i-classfas-fa-box-openi-install-workflow"><i class="fas fa-box-open"></i> Install Workflow</h2> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Check the workflow template availability</p> -<pre><code class="language-r">availableWF(github = TRUE) +</code></pre> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +More details about <em>systemPipeRdata</em> package <a href="https://systempipe.org/pages/SPRdata_intro/SPRdata_intro#1">here</a></p> +<hr> +<h2 id="i-classfas-fa-box-openi-install-workflow"><i class="fas fa-box-open"></i> Install Workflow</h2> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Check the workflow template availability</p> +<pre><code class="language-r">availableWF(github = TRUE) + # $systemPipeRdata -# [1] &quot;chipseq&quot; &quot;new&quot; &quot;riboseq&quot; &quot;rnaseq&quot; &quot;varseq&quot; -# +# [1] &quot;chipseq&quot; &quot;new&quot; &quot;riboseq&quot; &quot;rnaseq&quot; &quot;varseq&quot; +# # $github -# workflow branches version html description -# 1 systemPipeR/systemPipeChIPseq master release https://github.com/systemPipeR/systemPipeChIPseq Workflow Template -# 2 systemPipeR/systemPipeRIBOseq master release https://github.com/systemPipeR/systemPipeRIBOseq Workflow Template -# 3 systemPipeR/systemPipeRNAseq cluster, master, singleMachine release https://github.com/systemPipeR/systemPipeRNAseq Workflow Template -# 4 systemPipeR/systemPipeVARseq master release https://github.com/systemPipeR/systemPipeVARseq Workflow Template -# 5 systemPipeR/systemPipeCLIPseq master devel https://github.com/systemPipeR/systemPipeCLIPseq Workflow Template -# 6 systemPipeR/systemPipeDeNovo master devel https://github.com/systemPipeR/systemPipeDeNovo Workflow Template -# 7 systemPipeR/systemPipeMetaTrans master devel https://github.com/systemPipeR/systemPipeMetaTrans Workflow Template -# 8 systemPipeR/systemPipeMethylseq master devel https://github.com/systemPipeR/systemPipeMethylseq Workflow Template -</code></pre> -<hr> -<h2 id="i-classfas-fa-mouse-pointeri-dynamic-workflow-template"><i class="fas fa-mouse-pointer"></i> Dynamic Workflow Template</h2> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Create dynamic Workflow Templates with <em>RStudio</em></p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<code>File -&gt; New File -&gt; R Markdown -&gt; From Template</code> +# workflow branches version html description +# 1 systemPipeR/systemPipeChIPseq master release https://github.com/systemPipeR/systemPipeChIPseq Workflow Template +# 2 systemPipeR/systemPipeRIBOseq master release https://github.com/systemPipeR/systemPipeRIBOseq Workflow Template +# 3 systemPipeR/systemPipeRNAseq cluster, master, singleMachine release https://github.com/systemPipeR/systemPipeRNAseq Workflow Template +# 4 systemPipeR/systemPipeVARseq master release https://github.com/systemPipeR/systemPipeVARseq Workflow Template +# 5 systemPipeR/systemPipeCLIPseq master devel https://github.com/systemPipeR/systemPipeCLIPseq Workflow Template +# 6 systemPipeR/systemPipeDeNovo master devel https://github.com/systemPipeR/systemPipeDeNovo Workflow Template +# 7 systemPipeR/systemPipeMetaTrans master devel https://github.com/systemPipeR/systemPipeMetaTrans Workflow Template +# 8 systemPipeR/systemPipeMethylseq master devel https://github.com/systemPipeR/systemPipeMethylseq Workflow Template +</code></pre> +<hr> +<h2 id="i-classfas-fa-mouse-pointeri-dynamic-workflow-template"><i class="fas fa-mouse-pointer"></i> Dynamic Workflow Template</h2> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Create dynamic Workflow Templates with <em>RStudio</em></p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<code>File -&gt; New File -&gt; R Markdown -&gt; From Template</code> .center[ -<img src="rstudio.png" height="425px" class="center" /> -]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-run-a-workflow"><i class="fas fa-toolbox"></i> Run a Workflow</h2> -<p>.left-column[</p> -<h3 id="setup">Setup</h3> -<p>]</p> -<p>.right-column[</p> -<pre><code class="language-r">library(systemPipeR) -targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) +<img src="rstudio.png" height="425px" class="center" /> +]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-run-a-workflow"><i class="fas fa-toolbox"></i> Run a Workflow</h2> +<p>.left-column[</p> +<h3 id="setup">Setup</h3> +<p>]</p> +<p>.right-column[</p> +<pre><code class="language-r">library(systemPipeR) +targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package=&quot;systemPipeR&quot;) read.delim(targetspath, comment.char = &quot;#&quot;)[1:4,1:4] -</code></pre> -<pre><code>## FileName SampleName Factor SampleLong -## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A -## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B -## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A -## 4 ./data/SRR446030_1.fastq.gz A1B A1 Avr.1h.B -</code></pre> -<pre><code class="language-r">script &lt;- system.file(&quot;extdata/workflows/rnaseq&quot;, &quot;systemPipeRNAseq.Rmd&quot;, package=&quot;systemPipeRdata&quot;) -</code></pre> -<p>]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-run-a-workflow-1"><i class="fas fa-toolbox"></i> Run a Workflow</h2> -<p>.left-column[</p> -<h3 id="setup-1">Setup</h3> -<h3 id="initwf"><code>initWF</code></h3> -<p>]</p> -<p>.right-column[</p> -<pre><code class="language-r">sysargslist &lt;- initWF(script = script, targets = targetspath, overwrite = TRUE) +</code></pre> +<pre><code>## FileName SampleName Factor SampleLong +## 1 ./data/SRR446027_1.fastq.gz M1A M1 Mock.1h.A +## 2 ./data/SRR446028_1.fastq.gz M1B M1 Mock.1h.B +## 3 ./data/SRR446029_1.fastq.gz A1A A1 Avr.1h.A +## 4 ./data/SRR446030_1.fastq.gz A1B A1 Avr.1h.B +</code></pre> +<pre><code class="language-r">script &lt;- system.file(&quot;extdata/workflows/rnaseq&quot;, &quot;systemPipeRNAseq.Rmd&quot;, package=&quot;systemPipeRdata&quot;) +</code></pre> +<p>]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-run-a-workflow-1"><i class="fas fa-toolbox"></i> Run a Workflow</h2> +<p>.left-column[</p> +<h3 id="setup-1">Setup</h3> +<h3 id="initwf"><code>initWF</code></h3> +<p>]</p> +<p>.right-column[</p> +<pre><code class="language-r">sysargslist &lt;- initWF(script = script, targets = targetspath, overwrite = TRUE) # Project started with success: ./SYSproject and SYSconfig.yml were created. -</code></pre> -<p>]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-run-a-workflow-2"><i class="fas fa-toolbox"></i> Run a Workflow</h2> -<p>.left-column[</p> -<h3 id="setup-2">Setup</h3> -<h3 id="initwf-1"><code>initWF</code></h3> -<h3 id="configwf"><code>configWF</code></h3> -<p>]</p> -<p>.right-column[</p> -<pre><code class="language-r">sysargslist &lt;- configWF(sysargslist, input_steps = &quot;1:3&quot;) +</code></pre> +<p>]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-run-a-workflow-2"><i class="fas fa-toolbox"></i> Run a Workflow</h2> +<p>.left-column[</p> +<h3 id="setup-2">Setup</h3> +<h3 id="initwf-1"><code>initWF</code></h3> +<h3 id="configwf"><code>configWF</code></h3> +<p>]</p> +<p>.right-column[</p> +<pre><code class="language-r">sysargslist &lt;- configWF(sysargslist, input_steps = &quot;1:3&quot;) sysargslist -# Instance of 'SYSargsList': -# WF Steps: +# Instance of 'SYSargsList': +# WF Steps: # 1. Rmarkdown/HTML setting # 2. Introduction # 3. Samples and environment settings -# 3.1. Environment settings and input data -# 3.2. Required packages and resources -# 3.3. Experiment definition provided by `targets` file -</code></pre> -<p>]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-run-a-workflow-3"><i class="fas fa-toolbox"></i> Run a Workflow</h2> -<p>.left-column[</p> -<h3 id="setup-3">Setup</h3> -<h3 id="initwf-2"><code>initWF</code></h3> -<h3 id="configwf-1"><code>configWF</code></h3> -<h3 id="runwf"><code>runWF</code></h3> -<p>]</p> -<p>.right-column[</p> -<pre><code class="language-r">sysargslist &lt;- runWF(sysargslist, steps = &quot;1:2&quot;) -# Step: 1: Introduction --&gt; DONE -# Step: 2: Samples and environment settings --&gt; DONE -# Step: 2.1: Environment settings and input data --&gt; DONE -# Step: 2.2: Required packages and resources --&gt; DONE -# Step: 2.3: Experiment definition provided by `targets` file --&gt; DONE -</code></pre> -<pre><code class="language-r">sysargslist &lt;- runWF(sysargslist, steps = &quot;ALL&quot;) -</code></pre> -<p>]</p> -<hr> -<h2 id="i-classfas-fa-toolboxi-run-a-workflow-4"><i class="fas fa-toolbox"></i> Run a Workflow</h2> -<p>.left-column[</p> -<h3 id="setup-4">Setup</h3> -<h3 id="initwf-3"><code>initWF</code></h3> -<h3 id="configwf-2"><code>configWF</code></h3> -<h3 id="runwf-1"><code>runWF</code></h3> -<h3 id="renderreport"><code>renderReport</code></h3> -<p>]</p> -<p>.right-column[</p> -<pre><code class="language-r">sysargslist &lt;- renderReport(sysargslist = sysargslist) -</code></pre> -<p>]</p> -<hr> -<h2 id="how-to-use-pipes-">How to Use Pipes <code>%&gt;%</code></h2> -<p>Consider the following example, in which the steps are the initialization, configuration and running the entire workflow.</p> -<pre><code class="language-r">library(systemPipeR) +# 3.1. Environment settings and input data +# 3.2. Required packages and resources +# 3.3. Experiment definition provided by `targets` file +</code></pre> +<p>]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-run-a-workflow-3"><i class="fas fa-toolbox"></i> Run a Workflow</h2> +<p>.left-column[</p> +<h3 id="setup-3">Setup</h3> +<h3 id="initwf-2"><code>initWF</code></h3> +<h3 id="configwf-1"><code>configWF</code></h3> +<h3 id="runwf"><code>runWF</code></h3> +<p>]</p> +<p>.right-column[</p> +<pre><code class="language-r">sysargslist &lt;- runWF(sysargslist, steps = &quot;1:2&quot;) +# Step: 1: Introduction --&gt; DONE +# Step: 2: Samples and environment settings --&gt; DONE +# Step: 2.1: Environment settings and input data --&gt; DONE +# Step: 2.2: Required packages and resources --&gt; DONE +# Step: 2.3: Experiment definition provided by `targets` file --&gt; DONE +</code></pre> +<pre><code class="language-r">sysargslist &lt;- runWF(sysargslist, steps = &quot;ALL&quot;) +</code></pre> +<p>]</p> +<hr> +<h2 id="i-classfas-fa-toolboxi-run-a-workflow-4"><i class="fas fa-toolbox"></i> Run a Workflow</h2> +<p>.left-column[</p> +<h3 id="setup-4">Setup</h3> +<h3 id="initwf-3"><code>initWF</code></h3> +<h3 id="configwf-2"><code>configWF</code></h3> +<h3 id="runwf-1"><code>runWF</code></h3> +<h3 id="renderreport"><code>renderReport</code></h3> +<p>]</p> +<p>.right-column[</p> +<pre><code class="language-r">sysargslist &lt;- renderReport(sysargslist = sysargslist) +</code></pre> +<p>]</p> +<hr> +<h2 id="how-to-use-pipes-">How to Use Pipes <code>%&gt;%</code></h2> +<p>Consider the following example, in which the steps are the initialization, configuration and running the entire workflow.</p> +<pre><code class="language-r">library(systemPipeR) sysargslist &lt;- initWF(script =&quot;systemPipeRNAseq.Rmd&quot;, overwrite = TRUE) %&gt;% -configWF(input_steps = &quot;1:6&quot;) %&gt;% -runWF(steps = &quot;1:2&quot;) -</code></pre> -<hr> -<p>class: inverse, center, middle</p> -<h1 id="i-classfas-fa-tasksi-project-updates"><i class="fas fa-tasks"></i> Project Updates</h1> -<hr> -<h3 id="targets-x-summarizedexperiment"><em>targets</em> x <em>SummarizedExperiment</em></h3> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Extension &ldquo;SummarizedExperiment&rdquo; methods:</p> -<pre><code class="language-r">sprSE &lt;- addAssay(sprSE, assay(countMatrix), xName=&quot;countMatrix&quot;) + configWF(input_steps = &quot;1:6&quot;) %&gt;% + runWF(steps = &quot;1:2&quot;) +</code></pre> +<hr> +<p>class: inverse, center, middle</p> +<h1 id="i-classfas-fa-tasksi-project-updates"><i class="fas fa-tasks"></i> Project Updates</h1> +<hr> +<h3 id="targets-x-summarizedexperiment"><em>targets</em> x <em>SummarizedExperiment</em></h3> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Extension &ldquo;SummarizedExperiment&rdquo; methods:</p> +<pre><code class="language-r">sprSE &lt;- addAssay(sprSE, assay(countMatrix), xName=&quot;countMatrix&quot;) sprSE &lt;- addMetadata(sprSE, list(targets), xName=&quot;metadata&quot;) -</code></pre> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -New Function:</p> -<pre><code class="language-r">## Create empty SummarizedExperiment +</code></pre> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +New Function:</p> +<pre><code class="language-r">## Create empty SummarizedExperiment sprSE &lt;- SPRdata() + ## Create an object with targets file and comparison and count table sprSE &lt;- SPRdata(counts = countMatrix, cmp=TRUE, targetspath = targetspath) metadata(sprSE) colData(sprSE) assays(sprSE) -</code></pre> -<hr> -<h2 id="spr-paper">SPR Paper</h2> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -<a href="https://www.overleaf.com/project/5e94948a23918a000116311c">Link to draft</a></p> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Added the main points to discuss in the draft</p> -<p><i class="fas fa-arrow-circle-right" style="color:#00758a;"></i> -Writing: Results and introduction</p> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Improve Graphical Abstract</p> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Show case?</p> -<hr> -<h2 id="sysargslist"><em>SYSargsList</em></h2> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Explain how <em>SYSargsList</em> is implemented - Vignette</p> -<p>.small[</p> -<table> -<thead> -<tr> -<th>Function Name</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>initWF</code></td> -<td>Constructs <code>SYSargsList</code> workflow control module (S4 object) from script file</td> -</tr> -<tr> -<td><code>configWF</code></td> -<td>Control of which step of the workflow will be run and the generation of the new RMarkdown</td> -</tr> -<tr> -<td><code>runWF</code></td> -<td>Runs all the R chunk define in the RMarkdown file or a subset, e.g. <code>runWF[1:3]</code></td> -</tr> -<tr> -<td><code>renderReport</code></td> -<td>Render Scientific Report based on RMarkdown</td> -</tr> -<tr> -<td><code>renderLog</code></td> -<td>Render logs Report based on RMarkdown</td> -</tr> -<tr> -<td><code>updateWF</code></td> -<td>Recover the <code>SYSargsList</code> workflow previous ran and restarts the WF</td> -</tr> -<tr> -<td><code>plotWF</code></td> -<td>Plot visual workflow designs and topologies with different graphical layouts</td> -</tr> -<tr> -<td><code>statusWF</code></td> -<td>Return the overview of the workflow steps computational status</td> -</tr> -<tr> -<td><code>evalCode</code></td> -<td>Turn eval option <code>TRUE</code> or <code>FALSE</code> on RMarkdown file</td> -</tr> -<tr> -<td><code>tryCL</code></td> -<td>Checks if third-party software or utility is installed and set in the PATH</td> -</tr> -<tr> -<td>]</td> -<td></td> -</tr> -</tbody> -</table> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Improve <code>statusWF()</code></p> -<hr> -<h2 id="visualization-in-systempiper">Visualization in <em>systemPipeR</em></h2> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Add to vignette (SPR or SPS)</p> -<ul> -<li><code>exploreDDS</code>, <code>exploreDDSplot</code>, <code>GLMplot</code>, <code>MAplot</code>, <code>MDSplot</code>, <code>PCAplot</code>, <code>hclustplot</code>, <code>heatMaplot</code>, <code>tSNEplot</code>, <code>volcanoplot</code></li> -</ul> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Enrichment analysis and visualization tool for SPR</p> -<ul> -<li>Integration with <code>FGSEA</code></li> -</ul> -<hr> -<h2 id="website">WebSite</h2> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Updated the vignette</p> -<p><i class="fas fa-check-circle" style="color:#00758a;"></i> -Added <em>systemPipeRdata</em> vignette and presentation: <a href="https://systempipe.org/docs/systemPipeRdata/">link</a></p> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Redirect <a href="http://girke.bioinformatics.ucr.edu/systemPipeR/">http://girke.bioinformatics.ucr.edu/systemPipeR/</a> to new page</p> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Add content to FAQ section</p> -<p><i class="fas fa-circle" style="color:#00758a;"></i> -Add tutorials videos</p> -<hr> -<p>class: middle</p> -<h1 id="thanks">Thanks!</h1> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -Browse source code at <a href="https://github.com/tgirke/systemPipeR/"> <i class="fab fa-github fa-2x"></i></a></p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +</code></pre> +<hr> +<h2 id="spr-paper">SPR Paper</h2> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +<a href="https://www.overleaf.com/project/5e94948a23918a000116311c">Link to draft</a></p> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Added the main points to discuss in the draft</p> +<p><i class="fas fa-arrow-circle-right" style="color:#00758a;"></i> +Writing: Results and introduction</p> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Improve Graphical Abstract</p> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Show case?</p> +<hr> +<h2 id="sysargslist"><em>SYSargsList</em></h2> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Explain how <em>SYSargsList</em> is implemented - Vignette</p> +<p>.small[</p> +<table> +<thead> +<tr> +<th>Function Name</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>initWF</code></td> +<td>Constructs <code>SYSargsList</code> workflow control module (S4 object) from script file</td> +</tr> +<tr> +<td><code>configWF</code></td> +<td>Control of which step of the workflow will be run and the generation of the new RMarkdown</td> +</tr> +<tr> +<td><code>runWF</code></td> +<td>Runs all the R chunk define in the RMarkdown file or a subset, e.g. <code>runWF[1:3]</code></td> +</tr> +<tr> +<td><code>renderReport</code></td> +<td>Render Scientific Report based on RMarkdown</td> +</tr> +<tr> +<td><code>renderLog</code></td> +<td>Render logs Report based on RMarkdown</td> +</tr> +<tr> +<td><code>updateWF</code></td> +<td>Recover the <code>SYSargsList</code> workflow previous ran and restarts the WF</td> +</tr> +<tr> +<td><code>plotWF</code></td> +<td>Plot visual workflow designs and topologies with different graphical layouts</td> +</tr> +<tr> +<td><code>statusWF</code></td> +<td>Return the overview of the workflow steps computational status</td> +</tr> +<tr> +<td><code>evalCode</code></td> +<td>Turn eval option <code>TRUE</code> or <code>FALSE</code> on RMarkdown file</td> +</tr> +<tr> +<td><code>tryCL</code></td> +<td>Checks if third-party software or utility is installed and set in the PATH</td> +</tr> +<tr> +<td>]</td> +<td></td> +</tr> +</tbody> +</table> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Improve <code>statusWF()</code></p> +<hr> +<h2 id="visualization-in-systempiper">Visualization in <em>systemPipeR</em></h2> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Add to vignette (SPR or SPS)</p> +<ul> +<li><code>exploreDDS</code>, <code>exploreDDSplot</code>, <code>GLMplot</code>, <code>MAplot</code>, <code>MDSplot</code>, <code>PCAplot</code>, <code>hclustplot</code>, <code>heatMaplot</code>, <code>tSNEplot</code>, <code>volcanoplot</code></li> +</ul> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Enrichment analysis and visualization tool for SPR</p> +<ul> +<li>Integration with <code>FGSEA</code></li> +</ul> +<hr> +<h2 id="website">WebSite</h2> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Updated the vignette</p> +<p><i class="fas fa-check-circle" style="color:#00758a;"></i> +Added <em>systemPipeRdata</em> vignette and presentation: <a href="https://systempipe.org/docs/systemPipeRdata/">link</a></p> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Redirect <a href="http://girke.bioinformatics.ucr.edu/systemPipeR/">http://girke.bioinformatics.ucr.edu/systemPipeR/</a> to new page</p> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Add content to FAQ section</p> +<p><i class="fas fa-circle" style="color:#00758a;"></i> +Add tutorials videos</p> +<hr> +<p>class: middle</p> +<h1 id="thanks">Thanks!</h1> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +Browse source code at <a href="https://github.com/tgirke/systemPipeR/"> <i class="fab fa-github fa-2x"></i></a></p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> Ask a question about systemPipeR at Bioconductor Support Page -<a href="https://support.bioconductor.org/t/systempiper/"><i class="far fa-question-circle fa-2x"></i></a></p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<em>systemPipeRdata</em> at <a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html">Bioconductor</a></p> -<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> -<a href="https://systempipe.org/">https://systempipe.org/</a></p> \ No newline at end of file +<a href="https://support.bioconductor.org/t/systempiper/"><i class="far fa-question-circle fa-2x"></i></a></p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<em>systemPipeRdata</em> at <a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html">Bioconductor</a></p> +<p><i class="fas fa-hand-point-right" style="color:#00758a;"></i> +<a href="https://systempipe.org/">https://systempipe.org/</a></p> + + + + + + diff --git a/public/presentations/spr/spr_project/index.html b/public/presentations/spr/spr_project/index.html index 37060b115..c1d8fb7a8 100644 --- a/public/presentations/spr/spr_project/index.html +++ b/public/presentations/spr/spr_project/index.html @@ -1,52 +1,588 @@ -_systemPipeR_ | sysPipe + + + + + + + + + + + + + + + + + +_systemPipeR_ | sysPipe + + + + + + + + + + + + + + +

layout: true -background-image: url(https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png) + systemPipeR offers many utilities to build, control, and execute workflows entirely from R"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

layout: true +background-image: url(https://raw.githubusercontent.com/tgirke/systemPipeR/gh-pages/images/systemPipeR.png) background-position: 99% 1% -background-size: 10%


class: middle

Outline

Introduction

Design

How to run a Workflow

Workflows Tutorial

Live Demo


class: inverse, center, middle

Introduction


Introduction

systemPipeR provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports

systemPipeR offers many utilities to build, control, and execute -workflows entirely from R

The environment takes advantage of central community S4 classes of the Bioconductor ecosystem

Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software

Simple annotation system targets


systemPipeR’s Core Functionalities

.center[ - -]


Structural Features

– -.left-column[

WF infrastructure

]

.right-column[ +background-size: 10%

+
+

class: middle

+

Outline

+

Introduction

+

Design

+

How to run a Workflow

+

Workflows Tutorial

+

Live Demo

+ + + +
+

class: inverse, center, middle

+

Introduction

+ +
+

Introduction

+

+systemPipeR provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters and cloud systems, while generating at the same time publication quality analysis reports

+

+systemPipeR offers many utilities to build, control, and execute +workflows entirely from R

+

+The environment takes advantage of central community S4 classes of the Bioconductor ecosystem

+

+Workflows are managed by generic workflow management containers supporting both analysis routines implemented in R code and/or command-line software

+

+Simple annotation system targets

+ +
+

systemPipeR’s Core Functionalities

+

.center[ + +]

+ +
+

Structural Features

+

– +.left-column[

+

WF infrastructure

+

]

+

.right-column[ systemPipeR offers many utilities to build, control, and execute workflows entirely from R. The environment takes advantage of central community S4 classes of the Bioconductor ecosystem. Workflows are managed by generic workflow management @@ -54,40 +590,359 @@ software. A layered monitoring infrastructure is provided to design, control and debug each step in a workflow. The run environment allows to execute workflows entirely or with a intuitive to use step-wise execution syntax using R’s standard subsetting syntax -(runWF(sys[1:3])) or pipes (%>%). -]


Structural Features

.left-column[

WF infrastructure

Command-line support

]

.right-column[ +(runWF(sys[1:3])) or pipes (%>%). +]

+
+

Structural Features

+

.left-column[

+

WF infrastructure

+

Command-line support

+

]

+

.right-column[ An important feature of systemPipeR is support for running command-line software by adopting the Common Workflow Language (CWL). The latter is a widely adopted community standard for describing analysis workflows. This design -offers several advantages such as:

seamless integration of most command-line software

support to run systemPipeR workflows from R or many other popular computer languages

efficient sharing of workflows across different workflow environments. -]


Structural Features

.left-column[

WF infrastructure

Command-line support

Parallel evaluation

]

.right-column[ +offers several advantages such as:

+

+seamless integration of most command-line software

+

+support to run systemPipeR workflows from R or many other popular computer languages

+

+efficient sharing of workflows across different workflow environments. +]

+
+

Structural Features

+

.left-column[

+

WF infrastructure

+

Command-line support

+

Parallel evaluation

+

]

+

.right-column[ The processing time of workflows can be greatly reduced by making use of parallel evaluations across several CPU cores on single machines, or multiple nodes of computer clusters and cloud-based systems. systemPipeR simplifies these parallelization tasks without creating any limitations for users who do not have access to high-performance computer resources -]


Structural Features

.left-column[

WF infrastructure

Command-line support

Parallel evaluation

Reports infrastructure

]

.right-column[ +]

+
+

Structural Features

+

.left-column[

+

WF infrastructure

+

Command-line support

+

Parallel evaluation

+

Reports infrastructure

+

]

+

.right-column[ systemPipeR’s reporting infrastructure -includes three types of interconnected reports each serving a different purpose:

a scientific report, based on R Markdown, contains all scientifically relevant results

a technical report captures all technical information important for each workflow step, including parameter -settings, software versions, and warning/error messages, etc.

a visual report depicts the entire workflow topology including its run status in form of a workflow graph

]


Structural Features

.left-column[

WF infrastructure

Command-line support

Parallel evaluation

Reports infrastructure

Shiny Web Interface

]

.right-column[ +includes three types of interconnected reports each serving a different purpose:

+

+a scientific report, based on R Markdown, contains all scientifically relevant results

+

+a technical report captures all technical information important for each workflow step, including parameter +settings, software versions, and warning/error messages, etc.

+

+a visual report depicts the entire workflow topology including its run status in form of a workflow graph

+

]

+
+

Structural Features

+

.left-column[

+

WF infrastructure

+

Command-line support

+

Parallel evaluation

+

Reports infrastructure

+

Shiny Web Interface

+

]

+

.right-column[ Recently, the systemPipeShiny package has been added that allows users to design workflows in an interactive graphical user interface (GUI). In addition to designing workflows, this new interface allows users to run and to monitor workflows in an intuitive manner without the need of knowing R. -]


Structural Features

.left-column[

WF infrastructure

Command-line support

Parallel evaluation

Reports infrastructure

Shiny Web Interface

Workflow Templates

]

.right-column[ +]

+
+

Structural Features

+

.left-column[

+

WF infrastructure

+

Command-line support

+

Parallel evaluation

+

Reports infrastructure

+

Shiny Web Interface

+

Workflow Templates

+

]

+

.right-column[ A rich set of end-to-end workflow templates is provided by this project for a wide range omics applications. In addition, users can contribute and share their workflows with the community by submitting them to a central GitHub repository -]


Important Functions

.small[

Function NameDescriptionCategory
genWorkenvirGenerates workflow templates provided by systemPipeRdata helper package / or from the individuals’ pipelines packagesAccessory
loadWorkflowConstructs SYSargs2 object from CWL param and targets filesSYSargs2
renderWFPopulate all the command-line in an SYSargs2 objectSYSargs2
subsetWFSubsetting SYSargs2 class slotsSYSargs2
runCommandlineExecutes command-line software on samples and parameters specified in SYSargs2 objectSYSargs2
clusterRunRuns command-line software in parallel mode on a computer clusterSYSargs2
writeTargetsoutWrite updated targets out to file/Generate targets file with referenceSYSargs2
output_updateUpdates the output files paths in the SYSargs2 objectSYSargs2
singleYMLCreate automatically the param.ymlSYSargs2
createWFCreate automatically param.cwl and the param.yml based on the command lineSYSargs2
config.paramCustom configuration of the CWL param files from RSYSargs2
]

Important Functions

.small[

Function NameDescriptionCategory
initWFConstructs SYSargsList workflow control module (S4 object) from script fileSYSargsList
configWFControl of which step of the workflow will be run and the generation of the new RMarkdownSYSargsList
runWFRuns all the R chunk define in the RMarkdown file or a subset, e.g. runWF[1:3]SYSargsList
renderReportRender Scientific Report based on RMarkdownSYSargsList
subsetRmdWrite updated subset Rmarkdown of R chunk with text associate in the step selectedSYSargsList
plotWFPlot visual workflow designs and topologies with different graphical layoutsSYSargsList
statusWFReturn the overview of the workflow steps computational statusSYSargsList
evalCodeTurn eval option TRUE or FALSE on RMarkdown fileAccessory
tryCLChecks if third-party software or utility is installed and set in the PATHAccessory
]

class: inverse, center, middle

Design


Workflow Management Solutions

systemPipeR central concept for designing workflows is workflow -management containers (S4 class)

SYSargs2 controls workflow steps with input/output file operations

SYSargs2 requires a targets and a set of workflow definition files (here param.cwl and param.yml)

SYSargsList objects organize one or many SYSargs2 +]

+ +
+

Important Functions

+

.small[

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function NameDescriptionCategory
genWorkenvirGenerates workflow templates provided by systemPipeRdata helper package / or from the individuals’ pipelines packagesAccessory
loadWorkflowConstructs SYSargs2 object from CWL param and targets filesSYSargs2
renderWFPopulate all the command-line in an SYSargs2 objectSYSargs2
subsetWFSubsetting SYSargs2 class slotsSYSargs2
runCommandlineExecutes command-line software on samples and parameters specified in SYSargs2 objectSYSargs2
clusterRunRuns command-line software in parallel mode on a computer clusterSYSargs2
writeTargetsoutWrite updated targets out to file/Generate targets file with referenceSYSargs2
output_updateUpdates the output files paths in the SYSargs2 objectSYSargs2
singleYMLCreate automatically the param.ymlSYSargs2
createWFCreate automatically param.cwl and the param.yml based on the command lineSYSargs2
config.paramCustom configuration of the CWL param files from RSYSargs2
]
+
+

Important Functions

+

.small[

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function NameDescriptionCategory
initWFConstructs SYSargsList workflow control module (S4 object) from script fileSYSargsList
configWFControl of which step of the workflow will be run and the generation of the new RMarkdownSYSargsList
runWFRuns all the R chunk define in the RMarkdown file or a subset, e.g. runWF[1:3]SYSargsList
renderReportRender Scientific Report based on RMarkdownSYSargsList
subsetRmdWrite updated subset Rmarkdown of R chunk with text associate in the step selectedSYSargsList
plotWFPlot visual workflow designs and topologies with different graphical layoutsSYSargsList
statusWFReturn the overview of the workflow steps computational statusSYSargsList
evalCodeTurn eval option TRUE or FALSE on RMarkdown fileAccessory
tryCLChecks if third-party software or utility is installed and set in the PATHAccessory
]
+ + + +
+

class: inverse, center, middle

+

Design

+
+

Workflow Management Solutions

+

+systemPipeR central concept for designing workflows is workflow +management containers (S4 class)

+

+SYSargs2 controls workflow steps with input/output file operations

+

+SYSargs2 requires a targets and a set of workflow definition files (here param.cwl and param.yml)

+ + +

+SYSargsList objects organize one or many SYSargs2 containers in a single compound object capturing all information required to run, control and -monitor complex workflows from start to finish

.center[ - -]


Directory Structure

The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:


Workflows Collection

Browse pipelines that are currently available as part of the systemPipeR toolkit

.small[

WorkFlowDescriptionVersionGitHubCI Testing
systemPipeChIPseqChIP-Seq Workflow Templatev1.0 R-CMD-check
systemPipeRIBOseqRIBO-Seq Workflow Templatev1.0 R-CMD-check
systemPipeRNAseqRNA-Seq Workflow Templatev1.0 R-CMD-check
systemPipeVARseqVAR-Seq Workflow Templatev1.0 R-CMD-check
systemPipeMethylseqMethyl-Seq Workflow Templatedevel R-CMD-check
systemPipeDeNovoDe novo transcriptome assembly Workflow Templatedevel R-CMD-check
systemPipeCLIPseqCLIP-Seq Workflow Templatedevel R-CMD-check
systemPipeMetaTransMetatranscriptomic Sequencing Workflow Templatedevel R-CMD-check
]

class: inverse, center, middle

CWL


CWL

TODO: -Add section with CWL details

.center[ - -]


CWL and SPR

TODO: -How to use CWL definition with systemPipeR

  • SYSargs2 instances are constructed from a targets file and two param file
    • hisat2-mapping-se.cwl file contains the settings for running command-line software
    • hisat2-mapping-se.yml file define all the variables to be input in the specific command-line step
targets <- system.file("extdata", "targets.txt", package="systemPipeR")
+monitor complex workflows from start to finish

+

.center[ + +]

+
+

Directory Structure

+

The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:

+

+
+

Workflows Collection

+

Browse pipelines that are currently available as part of the systemPipeR toolkit

+

.small[

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WorkFlowDescriptionVersionGitHubCI Testing
systemPipeChIPseqChIP-Seq Workflow Templatev1.0 R-CMD-check
systemPipeRIBOseqRIBO-Seq Workflow Templatev1.0 R-CMD-check
systemPipeRNAseqRNA-Seq Workflow Templatev1.0 R-CMD-check
systemPipeVARseqVAR-Seq Workflow Templatev1.0 R-CMD-check
systemPipeMethylseqMethyl-Seq Workflow Templatedevel R-CMD-check
systemPipeDeNovoDe novo transcriptome assembly Workflow Templatedevel R-CMD-check
systemPipeCLIPseqCLIP-Seq Workflow Templatedevel R-CMD-check
systemPipeMetaTransMetatranscriptomic Sequencing Workflow Templatedevel R-CMD-check
]
+
+

class: inverse, center, middle

+

CWL

+
+

CWL

+

TODO: +Add section with CWL details

+

.center[ + +]

+
+

CWL and SPR

+

TODO: +How to use CWL definition with systemPipeR

+
    +
  • SYSargs2 instances are constructed from a targets file and two param file +
      +
    • hisat2-mapping-se.cwl file contains the settings for running command-line software
    • +
    • hisat2-mapping-se.yml file define all the variables to be input in the specific command-line step
    • +
    +
  • +
+
targets <- system.file("extdata", "targets.txt", package="systemPipeR")
 dir_path <- system.file("extdata/cwl/hisat2/hisat2-se", package="systemPipeR")
 align <- loadWF(targets=targets, wf_file="hisat2-mapping-se.cwl",
                    input_file="hisat2-mapping-se.yml", dir_path=dir_path)
@@ -102,27 +957,57 @@
 ##       cmdlist: 18
 ##    WF Steps:
 ##       1. hisat2-mapping-se.cwl (rendered: TRUE)
-

CWL and SPR

SYSargs2 instance

  • Slots and accessor functions have the same names
names(align)
+
+
+

CWL and SPR

+

SYSargs2 instance

+
    +
  • Slots and accessor functions have the same names
  • +
+
names(align)
 #  [1] "targets"       "targetsheader" "modules"       "wf"            "clt"          
 #  [6] "yamlinput"     "cmdlist"       "input"         "output"        "cwlfiles"     
 # [11] "inputvars" 
-
  • cmdlist return command-line arguments for the specific software, here HISAT2 for the first sample
cmdlist(align)[1]
+
+
    +
  • cmdlist return command-line arguments for the specific software, here HISAT2 for the first sample
  • +
+
cmdlist(align)[1]
 # $M1A
 # $M1A$`hisat2-mapping-se.cwl`
 # [1] "hisat2 -S results/M1A.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446027_1.fastq.gz --threads 4"
-
  • The output components of SYSargs2 define all the expected output files for each step in the workflow; some of which are the input for the next workflow step
output(align)[1]
+
+
    +
  • The output components of SYSargs2 define all the expected output files for each step in the workflow; some of which are the input for the next workflow step
  • +
+
output(align)[1]
 # $M1A
 # $M1A$`hisat2-mapping-se.cwl`
 # [1] "results/M1A.sam"
-

class: inverse, center, middle

Metadata


Targets file organizes samples

  • Structure of targets file for single-end (SE) library
targetspath <- system.file("extdata", "targets.txt", package="systemPipeR")
+
+
+

class: inverse, center, middle

+

Metadata

+
+

Targets file organizes samples

+
    +
  • Structure of targets file for single-end (SE) library
  • +
+
targetspath <- system.file("extdata", "targets.txt", package="systemPipeR")
 read.delim(targetspath, comment.char = "#")[1:3,1:4]
-
##                      FileName SampleName Factor SampleLong
+
+
##                      FileName SampleName Factor SampleLong
 ## 1 ./data/SRR446027_1.fastq.gz        M1A     M1  Mock.1h.A
 ## 2 ./data/SRR446028_1.fastq.gz        M1B     M1  Mock.1h.B
 ## 3 ./data/SRR446029_1.fastq.gz        A1A     A1   Avr.1h.A
-
  • Structure of targets file for paired-end (PE) library
targetspath <- system.file("extdata", "targetsPE.txt", package="systemPipeR")
+
+
    +
  • Structure of targets file for paired-end (PE) library
  • +
+
targetspath <- system.file("extdata", "targetsPE.txt", package="systemPipeR")
 read.delim(targetspath, comment.char = "#")[1:3,1:5]
-
##                     FileName1                   FileName2 SampleName Factor
+
+
##                     FileName1                   FileName2 SampleName Factor
 ## 1 ./data/SRR446027_1.fastq.gz ./data/SRR446027_2.fastq.gz        M1A     M1
 ## 2 ./data/SRR446028_1.fastq.gz ./data/SRR446028_2.fastq.gz        M1B     M1
 ## 3 ./data/SRR446029_1.fastq.gz ./data/SRR446029_2.fastq.gz        A1A     A1
@@ -130,7 +1015,13 @@
 ## 1  Mock.1h.A
 ## 2  Mock.1h.B
 ## 3   Avr.1h.A
-

Integration with SummarizedExperiment

  • Integrates targets files and count table from systemPipeR to a SummarizedExperiment object
## Create an object with targets file and comparison and count table
+
+
+

Integration with SummarizedExperiment

+
    +
  • Integrates targets files and count table from systemPipeR to a SummarizedExperiment object
  • +
+
## Create an object with targets file and comparison and count table
 sprSE <- SPRdata(targetspath = targetspath, cmp=TRUE)
 metadata(sprSE)
 # $version
@@ -152,16 +1043,55 @@
 # M1B  ./data/SRR446028_1.f..         M1B          M1   Mock.1h.B 
 # ...                     ...         ...         ...         ... 
 # M12B ./data/SRR446040_1.f..        M12B         M12  Mock.12h.B
-

class: inverse, center, middle

Live Demo


Install Package

Install the systemPipeRdata package from Bioconductor:

if (!requireNamespace("BiocManager", quietly=TRUE))
+
+
+

class: inverse, center, middle

+

Live Demo

+
+

Install Package

+

Install the systemPipeRdata package from Bioconductor:

+
if (!requireNamespace("BiocManager", quietly=TRUE))
     install.packages("BiocManager")
 BiocManager::install("systemPipeR")
-

Load Package and Documentation

Load package:

library("systemPipeR")
-

Access help:

library(help="systemPipeR")
+
+

Load Package and Documentation

+

+Load package:

+
library("systemPipeR")
+
+

+Access help:

+
library(help="systemPipeR")
 vignette("systemPipeR")
-

Quick Start

Load Sample Workflow

systemPipeRdata

  • Helper package to generate with a single command workflow templates for systemPipeR
  • Includes sample data for testing
  • User can create new workflows or change and extend existing ones
  • Template Workflows:
    • Sample workflows can be loaded with the genWorkenvir function from systemPipeRdata

Generate workflow template:

library(systemPipeRdata)
+
+
+

Quick Start

+

Load Sample Workflow

+

+systemPipeRdata

+
    +
  • Helper package to generate with a single command workflow templates for systemPipeR
  • +
  • Includes sample data for testing
  • +
  • User can create new workflows or change and extend existing ones
  • +
  • Template Workflows: +
      +
    • Sample workflows can be loaded with the genWorkenvir function from systemPipeRdata
    • +
    +
  • +
+

+Generate workflow template:

+
library(systemPipeRdata)
 genWorkenvir(workflow="rnaseq")
 setwd("rnaseq")
-

More details about systemPipeRdata package here


Install Workflow

Check the workflow template availability

availableWF(github = TRUE)
+
+

+More details about systemPipeRdata package here

+
+

Install Workflow

+

+Check the workflow template availability

+
availableWF(github = TRUE)
 
 # $systemPipeRdata
 # [1] "chipseq" "new"     "riboseq" "rnaseq"  "varseq" 
@@ -176,21 +1106,55 @@
 # 6    systemPipeR/systemPipeDeNovo                         master   devel    https://github.com/systemPipeR/systemPipeDeNovo Workflow Template
 # 7 systemPipeR/systemPipeMetaTrans                         master   devel https://github.com/systemPipeR/systemPipeMetaTrans Workflow Template
 # 8 systemPipeR/systemPipeMethylseq                         master   devel https://github.com/systemPipeR/systemPipeMethylseq Workflow Template
-

Dynamic Workflow Template

Create dynamic Workflow Templates with RStudio

File -> New File -> R Markdown -> From Template +

+
+

Dynamic Workflow Template

+

+Create dynamic Workflow Templates with RStudio

+

+File -> New File -> R Markdown -> From Template .center[ - -]


Run a Workflow

.left-column[

Setup

]

.right-column[

library(systemPipeR)
+
+]

+
+

Run a Workflow

+

.left-column[

+

Setup

+

]

+

.right-column[

+
library(systemPipeR)
 targetspath <- system.file("extdata", "targets.txt", package="systemPipeR") 
 read.delim(targetspath, comment.char = "#")[1:4,1:4]
-
##                      FileName SampleName Factor SampleLong
+
+
##                      FileName SampleName Factor SampleLong
 ## 1 ./data/SRR446027_1.fastq.gz        M1A     M1  Mock.1h.A
 ## 2 ./data/SRR446028_1.fastq.gz        M1B     M1  Mock.1h.B
 ## 3 ./data/SRR446029_1.fastq.gz        A1A     A1   Avr.1h.A
 ## 4 ./data/SRR446030_1.fastq.gz        A1B     A1   Avr.1h.B
-
script <- system.file("extdata/workflows/rnaseq", "systemPipeRNAseq.Rmd", package="systemPipeRdata")
-

]


Run a Workflow

.left-column[

Setup

initWF

]

.right-column[

sysargslist <- initWF(script = script, targets = targetspath, overwrite = TRUE)
+
+
script <- system.file("extdata/workflows/rnaseq", "systemPipeRNAseq.Rmd", package="systemPipeRdata")
+
+

]

+
+

Run a Workflow

+

.left-column[

+

Setup

+

initWF

+

]

+

.right-column[

+
sysargslist <- initWF(script = script, targets = targetspath, overwrite = TRUE)
 # Project started with success: ./SYSproject and SYSconfig.yml were created.
-

]


Run a Workflow

.left-column[

Setup

initWF

configWF

]

.right-column[

sysargslist <- configWF(sysargslist, input_steps = "1:3")
+
+

]

+
+

Run a Workflow

+

.left-column[

+

Setup

+

initWF

+

configWF

+

]

+

.right-column[

+
sysargslist <- configWF(sysargslist, input_steps = "1:3")
 sysargslist
 # Instance of 'SYSargsList':
 #    WF Steps:
@@ -200,21 +1164,61 @@
 #     3.1. Environment settings and input data
 #     3.2. Required packages and resources
 #     3.3. Experiment definition provided by `targets` file
-

]


Run a Workflow

.left-column[

Setup

initWF

configWF

runWF

]

.right-column[

sysargslist <- runWF(sysargslist, steps = "1:2")
+
+

]

+
+

Run a Workflow

+

.left-column[

+

Setup

+

initWF

+

configWF

+

runWF

+

]

+

.right-column[

+
sysargslist <- runWF(sysargslist, steps = "1:2")
 # Step: 1: Introduction --> DONE 
 # Step: 2: Samples and environment settings --> DONE 
 # Step: 2.1: Environment settings and input data --> DONE 
 # Step: 2.2: Required packages and resources --> DONE 
 # Step: 2.3: Experiment definition provided by `targets` file --> DONE 
-
sysargslist <- runWF(sysargslist, steps = "ALL")
-

]


Run a Workflow

.left-column[

Setup

initWF

configWF

runWF

renderReport

]

.right-column[

sysargslist <- renderReport(sysargslist = sysargslist)
-

]


How to Use Pipes %>%

Consider the following example, in which the steps are the initialization, configuration and running the entire workflow.

library(systemPipeR)
+
+
sysargslist <- runWF(sysargslist, steps = "ALL")
+
+

]

+
+

Run a Workflow

+

.left-column[

+

Setup

+

initWF

+

configWF

+

runWF

+

renderReport

+

]

+

.right-column[

+
sysargslist <- renderReport(sysargslist = sysargslist)
+
+

]

+
+

How to Use Pipes %>%

+

Consider the following example, in which the steps are the initialization, configuration and running the entire workflow.

+
library(systemPipeR)
 sysargslist <- initWF(script ="systemPipeRNAseq.Rmd", overwrite = TRUE) %>%
     configWF(input_steps = "1:6") %>%
     runWF(steps = "1:2")
-

class: inverse, center, middle

Project Updates


targets x SummarizedExperiment

Extension “SummarizedExperiment” methods:

sprSE <- addAssay(sprSE, assay(countMatrix), xName="countMatrix")
+
+
+

class: inverse, center, middle

+

Project Updates

+
+

targets x SummarizedExperiment

+

+Extension “SummarizedExperiment” methods:

+
sprSE <- addAssay(sprSE, assay(countMatrix), xName="countMatrix")
 sprSE <- addMetadata(sprSE, list(targets), xName="metadata")
-

New Function:

## Create empty SummarizedExperiment
+
+

+New Function:

+
## Create empty SummarizedExperiment
 sprSE <- SPRdata()
 
 ## Create an object with targets file and comparison and count table
@@ -222,10 +1226,203 @@
 metadata(sprSE)
 colData(sprSE)
 assays(sprSE)
-

SPR Paper

Link to draft

Added the main points to discuss in the draft

Writing: Results and introduction

Improve Graphical Abstract

Show case?


SYSargsList

Explain how SYSargsList is implemented - Vignette

.small[

Function NameDescription
initWFConstructs SYSargsList workflow control module (S4 object) from script file
configWFControl of which step of the workflow will be run and the generation of the new RMarkdown
runWFRuns all the R chunk define in the RMarkdown file or a subset, e.g. runWF[1:3]
renderReportRender Scientific Report based on RMarkdown
renderLogRender logs Report based on RMarkdown
updateWFRecover the SYSargsList workflow previous ran and restarts the WF
plotWFPlot visual workflow designs and topologies with different graphical layouts
statusWFReturn the overview of the workflow steps computational status
evalCodeTurn eval option TRUE or FALSE on RMarkdown file
tryCLChecks if third-party software or utility is installed and set in the PATH
]

Improve statusWF()


Visualization in systemPipeR

Add to vignette (SPR or SPS)

  • exploreDDS, exploreDDSplot, GLMplot, MAplot, MDSplot, PCAplot, hclustplot, heatMaplot, tSNEplot, volcanoplot

Enrichment analysis and visualization tool for SPR

  • Integration with FGSEA

WebSite

Updated the vignette

Added systemPipeRdata vignette and presentation: link

Redirect http://girke.bioinformatics.ucr.edu/systemPipeR/ to new page

Add content to FAQ section

Add tutorials videos


class: middle

Thanks!

Browse source code at

Ask a question about systemPipeR at Bioconductor Support Page -

systemPipeRdata at Bioconductor

https://systempipe.org/

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/presentations/sps/sps_intro/index.html b/public/presentations/sps/sps_intro/index.html index f8be5f9ad..82eac0303 100644 --- a/public/presentations/sps/sps_intro/index.html +++ b/public/presentations/sps/sps_intro/index.html @@ -1,43 +1,624 @@ -![](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png){width=1in} -<br/>_systemPipeShiny_ -| sysPipe

layout: true -background-image: url(https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png) + + + + + + + + + + + + + + + + + + + +![](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png){width=1in} +<br/>_systemPipeShiny_ + | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+ + + +

layout: true +background-image: url(https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/app/www/img/sps_small.png) background-position: 100% 0% -background-size: 10%

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/rmarkdown-libs/datatables-binding/datatables.js b/public/rmarkdown-libs/datatables-binding/datatables.js index e4148252a..fc04fd225 100644 --- a/public/rmarkdown-libs/datatables-binding/datatables.js +++ b/public/rmarkdown-libs/datatables-binding/datatables.js @@ -469,10 +469,10 @@ HTMLWidgets.widget({ 'background-color': '#fff', 'border': '1px #ddd solid', 'border-radius': '4px', - 'padding': '20px 20px 10px 20px' + 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' }); var $spans = $x0.children('span').css({ - 'margin-top': '10px', + 'margin-top': data.vertical ? '0' : '10px', 'white-space': 'nowrap' }); var $span1 = $spans.first(), $span2 = $spans.last(); @@ -499,9 +499,9 @@ HTMLWidgets.widget({ // first, make sure the slider div leaves at least 20px between // the two (slider value) span's $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); - // then, if the input is really wide, make the slider the same - // width as the input - if ($x0.outerWidth() < $input.outerWidth()) { + // then, if the input is really wide or slider is vertical, + // make the slider the same width as the input + if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { $x0.outerWidth($input.outerWidth()); } // make sure the slider div does not reach beyond the right margin @@ -566,6 +566,10 @@ HTMLWidgets.widget({ }; var opts = type === 'date' ? { step: 60 * 60 * 1000 } : type === 'integer' ? { step: 1 } : {}; + + opts.orientation = data.vertical ? 'vertical': 'horizontal'; + opts.direction = data.vertical ? 'rtl': 'ltr'; + filter = $x.noUiSlider($.extend({ start: [r1, r2], range: {min: r1, max: r2}, @@ -749,39 +753,44 @@ HTMLWidgets.widget({ throw 'The editable parameter must be "cell", "row", "column", or "all"'; } var disableCols = data.editable.disable ? data.editable.disable.columns : null; + var numericCols = data.editable.numeric; + var areaCols = data.editable.area; for (var i = 0; i < target.length; i++) { (function(cell, current) { var $cell = $(cell), html = $cell.html(); - var _cell = table.cell(cell), value = _cell.data(); - var $input = $(''), changed = false; + var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; + var $input; + if (inArray(index, numericCols)) { + $input = $(''); + } else if (inArray(index, areaCols)) { + $input = $(''); + } else { + $input = $(''); + } if (!immediate) { $cell.data('input', $input).data('html', html); $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); } $input.val(value); - if (inArray(_cell.index().column, disableCols)) { + if (inArray(index, disableCols)) { $input.attr('readonly', '').css('filter', 'invert(25%)'); } $cell.empty().append($input); if (cell === current) $input.focus(); $input.css('width', '100%'); - if (immediate) $input.on('change', function() { - changed = true; + if (immediate) $input.on('blur', function(e) { var valueNew = $input.val(); if (valueNew != value) { _cell.data(valueNew); if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: "event"}); + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); } // for server-side processing, users have to call replaceData() to update the table if (!server) table.draw(false); } else { $cell.html(html); } - $input.remove(); - }).on('blur', function() { - if (!changed) $input.trigger('change'); }).on('keyup', function(e) { // hit Escape to cancel editing if (e.keyCode === 27) $input.trigger('blur'); diff --git a/public/rmarkdown-libs/htmlwidgets/htmlwidgets.js b/public/rmarkdown-libs/htmlwidgets/htmlwidgets.js index 3d2276248..da8b23678 100644 --- a/public/rmarkdown-libs/htmlwidgets/htmlwidgets.js +++ b/public/rmarkdown-libs/htmlwidgets/htmlwidgets.js @@ -251,7 +251,7 @@ try { result = eval("(" + code + ")"); } catch(error) { - if (!error instanceof SyntaxError) { + if (!(error instanceof SyntaxError)) { throw error; } try { diff --git a/static/en/sp/spr/gettingstarted_files/jquery/jquery.js b/public/rmarkdown-libs/jquery/jquery-3.6.0.js similarity index 98% rename from static/en/sp/spr/gettingstarted_files/jquery/jquery.js rename to public/rmarkdown-libs/jquery/jquery-3.6.0.js index 50937333b..fc6c299b7 100644 --- a/static/en/sp/spr/gettingstarted_files/jquery/jquery.js +++ b/public/rmarkdown-libs/jquery/jquery-3.6.0.js @@ -1,15 +1,15 @@ /*! - * jQuery JavaScript Library v3.5.1 + * jQuery JavaScript Library v3.6.0 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * - * Copyright JS Foundation and other contributors + * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2020-05-04T22:49Z + * Date: 2021-03-02T17:08Z */ ( function( global, factory ) { @@ -76,12 +76,16 @@ var support = {}; var isFunction = function isFunction( obj ) { - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; var isWindow = function isWindow( obj ) { @@ -147,7 +151,7 @@ function toType( obj ) { var - version = "3.5.1", + version = "3.6.0", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -401,7 +405,7 @@ jQuery.extend( { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? - [ arr ] : arr + [ arr ] : arr ); } else { push.call( ret, arr ); @@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) { // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); function isArrayLike( obj ) { @@ -518,14 +522,14 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.5 + * Sizzle CSS Selector Engine v2.3.6 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * - * Date: 2020-03-14 + * Date: 2021-02-16 */ ( function( window ) { var i, @@ -1108,8 +1112,8 @@ support = Sizzle.support = {}; * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes @@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); -}; +} var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); @@ -3997,8 +4001,8 @@ jQuery.extend( { resolveContexts = Array( i ), resolveValues = slice.call( arguments ), - // the master Deferred - master = jQuery.Deferred(), + // the primary Deferred + primary = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { @@ -4006,30 +4010,30 @@ jQuery.extend( { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); + primary.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || + if ( primary.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - return master.then(); + return primary.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); } - return master.promise(); + return primary.promise(); } } ); @@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } @@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { } -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; @@ -5387,8 +5388,8 @@ jQuery.event = { event = jQuery.event.fix( nativeEvent ), handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event @@ -5512,12 +5513,12 @@ jQuery.event = { get: isFunction( hook ) ? function() { if ( this.originalEvent ) { - return hook( this.originalEvent ); + return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { - return this.originalEvent[ name ]; + return this.originalEvent[ name ]; } }, @@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - return result.value; + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate @@ -5821,34 +5828,7 @@ jQuery.each( { targetTouches: true, toElement: true, touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } + which: true }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { @@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + delegateType: delegateType }; } ); @@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { @@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); - table.style.cssText = "position:absolute;left:-11111px"; + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. tr.style.height = "1px"; trChild.style.height = "9px"; + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; documentElement.removeChild( table ); } @@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) { // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); } }, @@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) - ) + "px"; + ) + "px"; } } ); @@ -7223,7 +7228,7 @@ Tween.propHooks = { if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || + jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { @@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) { anim.done( function() { - /* eslint-enable no-loop-func */ + /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { @@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) { tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, @@ -7761,7 +7766,8 @@ jQuery.fn.extend( { anim.stop( true ); } }; - doAnimation.finish = doAnimation; + + doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : @@ -8401,8 +8407,8 @@ jQuery.fn.extend( { if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" + "" : + dataPriv.get( this, "__className__" ) || "" ); } } @@ -8417,7 +8423,7 @@ jQuery.fn.extend( { while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; + return true; } } @@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, { special.bindType || type; // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); @@ -8856,7 +8860,7 @@ var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { - var xml; + var xml, parserErrorElem; if ( !data || typeof data !== "string" ) { return null; } @@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) { // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } + } catch ( e ) {} - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); } return xml; }; @@ -8971,16 +8980,14 @@ jQuery.fn.extend( { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { + } ).filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { + } ).map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { @@ -9033,7 +9040,8 @@ var // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; + +originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { @@ -9414,8 +9422,8 @@ jQuery.extend( { // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, + jQuery( callbackContext ) : + jQuery.event, // Deferreds deferred = jQuery.Deferred(), @@ -9727,8 +9735,10 @@ jQuery.extend( { response = ajaxHandleResponses( s, jqXHR, responses ); } - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { s.converters[ "text script" ] = function() {}; } @@ -10466,12 +10476,6 @@ jQuery.offset = { options.using.call( elem, props ); } else { - if ( typeof props.top === "number" ) { - props.top += "px"; - } - if ( typeof props.left === "number" ) { - props.left += "px"; - } curElem.css( props ); } } @@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) { // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { + jQuery.each( { + padding: "inner" + name, + content: type, + "": "outer" + name + }, function( defaultExtra, funcName ) { // Margin is only for outerHeight, outerWidth jQuery.fn[ funcName ] = function( margin, value ) { @@ -10726,7 +10733,8 @@ jQuery.fn.extend( { } } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + +jQuery.each( + ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( _i, name ) { @@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + this.on( name, null, data, fn ) : this.trigger( name ); }; - } ); + } +); diff --git a/public/rmarkdown-libs/jquery/jquery-3.6.0.min.js b/public/rmarkdown-libs/jquery/jquery-3.6.0.min.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/public/rmarkdown-libs/jquery/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/public/search/index.html b/public/search/index.html index 1066d20b8..b67f25128 100644 --- a/public/search/index.html +++ b/public/search/index.html @@ -1,35 +1,615 @@ -Search Results | sysPipe

Search Results

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

Search Results

+ +
+
+ + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index bd4fac425..23a28fcea 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1 +1,378 @@ -/news/release_3_13/2021-10-21T13:57:33-07:00/sps/adv_features/config/2021-10-21T13:57:33-07:00/sp/spt/systempipetools/2021-10-21T13:57:33-07:00/sp/spr/introduction/2021-10-21T13:57:33-07:00/sps/intro/2021-10-21T13:57:33-07:00/outreach/2021-10-21T13:57:33-07:00/about/overview/2021-10-21T13:57:33-07:00/outreach/presentations/2021-10-21T13:57:33-07:00/sps/dev/spscomps/2021-10-21T13:57:33-07:00/sp/spr/2021-10-21T13:57:33-07:00/sps/dev/spscomps/ui/2021-10-21T13:57:33-07:00/sps/modules/workflow/2021-10-21T13:57:33-07:00/sp/sprdata/systempiperdata/2021-10-21T13:57:33-07:00/news/release_3_12/2021-10-21T13:57:33-07:00/sps/dev/drawer/shiny/2021-10-21T13:57:33-07:00/sp/spr/gettingstarted/2021-10-21T13:57:33-07:00/sps/install/2021-10-21T13:57:33-07:00/sps/adv_features/tabs/2021-10-21T13:57:33-07:00/about/team/2021-10-21T13:57:33-07:00/sps/adv_features/overwritetabs/2021-10-21T13:57:33-07:00/sps/modules/rnaseq/2021-10-21T13:57:33-07:00/sp/sprdata/newwf/2021-10-21T13:57:33-07:00/sps/dev/spscomps/server/2021-10-21T13:57:33-07:00/sp/spt/2021-10-21T13:57:33-07:00/outreach/videos/2021-10-21T13:57:33-07:00/sps/dev/drawer/2021-10-21T13:57:33-07:00/sps/dev/drawer/rmd/2021-10-21T13:57:33-07:00/sp/spr/spr_run/2021-10-21T13:57:33-07:00/outreach/posters/2021-10-21T13:57:33-07:00/about/publications/2021-10-21T13:57:33-07:00/sps/modules/ggplot/2021-10-21T13:57:33-07:00/sps/quick_start/2021-10-21T13:57:33-07:00/sps/dev/spsutil/2021-10-21T13:57:33-07:00/sp/sprdata/2021-10-21T13:57:33-07:00/sps/adv_features/displaytabs/2021-10-21T13:57:33-07:00/about/acknowledgement/2021-10-21T13:57:33-07:00/outreach/conferences/2021-10-21T13:57:33-07:00/sps/modules/2021-10-21T13:57:33-07:00/sps/adv_features/notification/2021-10-21T13:57:33-07:00/sp/sp_docker/2021-10-21T13:57:33-07:00/sp/spr/steps/2021-10-21T13:57:33-07:00/sps/canvas/2021-10-21T13:57:33-07:00/about/contact/2021-10-21T13:57:33-07:00/sps/adv_features/guide/2021-10-21T13:57:33-07:00/sp/spr/templates/2021-10-21T13:57:33-07:00/sp/spr/spr_funcs/2021-10-21T13:57:33-07:00/sps/sps_funcs/2021-10-21T13:57:33-07:00/sps/adv_features/2021-10-21T13:57:33-07:00/sp/spr/sprinstall/2021-10-21T13:57:33-07:00/sps/adv_features/app_security/2021-10-21T13:57:33-07:00/sp/spr/sp_docker/2021-10-21T13:57:33-07:00/sps/deploy/2021-10-21T13:57:33-07:00/sps/dev/2021-10-21T13:57:33-07:00/sps/adv_features/database/2021-10-21T13:57:33-07:00/sps/adv_features/login/2021-10-21T13:57:33-07:00/sps/adv_features/debug/2021-10-21T13:57:33-07:00/sps/adv_features/other_customizations/2021-10-21T13:57:33-07:00/sps/screenshots/2021-10-21T13:57:33-07:00/sp/spr/editor/2021-10-21T13:57:33-07:00/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/2021-10-21T13:57:33-07:00/presentations/sps/sps_intro/2021-10-21T13:57:33-07:00/presentations/spr/spr_project/2021-10-21T13:57:33-07:00/community/2021-10-21T13:57:33-07:00/sp/2021-10-21T13:57:33-07:00/spr_wf/installwf/2021-10-21T13:57:33-07:00/news/2021-10-21T13:57:33-07:00/presentations/2021-10-21T13:57:33-07:00/spr_wf/newwf/2021-10-21T13:57:33-07:00/search/2021-10-21T13:57:33-07:00/spr_wf/2021-10-21T13:57:33-07:00/about/2021-10-21T13:57:33-07:00/2021-10-21T13:57:33-07:00/sps/2021-10-21T13:57:33-07:00 \ No newline at end of file + + + + + /news/release_3_13/ + 2021-08-06T17:01:17-07:00 + + + + /sps/adv_features/config/ + 2021-04-25T19:44:32-07:00 + + + + /sp/spt/systempipetools/ + 2021-05-05T18:04:36-07:00 + + + + /sp/spr/introduction/ + 2021-08-06T17:01:17-07:00 + + + + /sps/intro/ + 2021-04-16T22:00:01-07:00 + + + + /outreach/ + 2021-08-06T17:01:17-07:00 + + + + /about/overview/ + 2021-08-06T17:01:17-07:00 + + + + /outreach/presentations/ + 2021-08-06T17:01:17-07:00 + + + + /sps/dev/spscomps/ + 2021-05-17T23:35:48-07:00 + + + + /sp/spr/ + 2021-04-26T10:05:30-07:00 + + + + /sps/dev/spscomps/ui/ + 2021-05-17T23:35:48-07:00 + + + + /sps/modules/workflow/ + 2021-08-09T11:00:29-07:00 + + + + /sp/sprdata/systempiperdata/ + 2021-05-05T17:52:13-07:00 + + + + /news/release_3_12/ + 2021-08-06T17:01:17-07:00 + + + + /sps/dev/drawer/shiny/ + 2021-03-03T18:23:48-08:00 + + + + /sp/spr/gettingstarted/ + 2021-08-06T17:06:26-07:00 + + + + /sps/install/ + 2021-08-09T12:22:32-07:00 + + + + /sps/adv_features/tabs/ + 2021-04-20T12:50:43-07:00 + + + + /about/team/ + 2021-05-05T11:02:58-07:00 + + + + /sps/adv_features/overwritetabs/ + 2021-04-22T15:46:31-07:00 + + + + /sps/modules/rnaseq/ + 2021-04-26T17:13:06-07:00 + + + + /sp/sprdata/newwf/ + 2021-04-26T10:05:30-07:00 + + + + /sps/dev/spscomps/server/ + 2021-04-29T15:56:28-07:00 + + + + /sp/spt/ + 2021-04-26T10:05:30-07:00 + + + + /outreach/videos/ + 2021-08-06T17:01:17-07:00 + + + + /sps/dev/drawer/ + 2021-04-16T22:00:01-07:00 + + + + /sps/dev/drawer/rmd/ + 2021-03-01T00:27:10-08:00 + + + + /sp/spr/spr_run/ + 2021-08-06T17:01:17-07:00 + + + + /outreach/posters/ + 2021-08-06T17:01:17-07:00 + + + + /about/publications/ + 2021-05-05T11:02:58-07:00 + + + + /sps/modules/ggplot/ + 2021-04-22T15:46:31-07:00 + + + + /sps/quick_start/ + 2021-04-12T11:56:01-07:00 + + + + /sps/dev/spsutil/ + 2021-04-12T11:56:01-07:00 + + + + /sp/sprdata/ + 2021-04-26T10:05:30-07:00 + + + + /sps/adv_features/displaytabs/ + 2021-04-22T15:46:31-07:00 + + + + /about/acknowledgement/ + 2021-05-05T11:02:58-07:00 + + + + /outreach/conferences/ + 2021-08-06T17:01:17-07:00 + + + + /sps/modules/ + 2021-02-08T11:15:56-08:00 + + + + /sps/adv_features/notification/ + 2021-04-22T15:46:31-07:00 + + + + /sp/sp_docker/ + 2021-04-23T17:35:30-07:00 + + + + /sp/spr/steps/ + 2021-04-26T10:05:30-07:00 + + + + /sps/canvas/ + 2021-04-16T22:00:01-07:00 + + + + /about/contact/ + 2021-05-05T11:02:58-07:00 + + + + /sps/adv_features/guide/ + 2021-04-22T15:46:31-07:00 + + + + /sp/spr/templates/ + 2021-04-26T10:05:30-07:00 + + + + /sp/spr/cwl_syntax/ + + + + /sps/sps_funcs/ + 2021-05-09T16:12:33-07:00 + + + + /sps/adv_features/ + 2021-02-12T17:56:49-08:00 + + + + /sp/spr/cwl_and_spr/ + + + + /sps/adv_features/app_security/ + 2021-05-17T22:13:17-07:00 + + + + /sp/spr/sprinstall/ + 2021-04-26T10:05:30-07:00 + + + + /sps/deploy/ + 2021-04-25T19:44:32-07:00 + + + + /sps/dev/ + 2021-08-10T16:09:15-07:00 + + + + /sp/spr/spr_funcs/ + 2021-04-26T10:05:30-07:00 + + + + /sps/adv_features/database/ + 2021-04-22T15:46:31-07:00 + + + + /sps/adv_features/login/ + 2021-04-16T22:00:01-07:00 + + + + /sp/spr/sp_docker/ + 2021-08-06T17:01:17-07:00 + + + + /sps/adv_features/debug/ + 2021-04-16T22:00:01-07:00 + + + + /sps/adv_features/other_customizations/ + 2021-04-16T22:00:01-07:00 + + + + /sps/screenshots/ + 2021-08-06T18:49:34-07:00 + + + + /sp/spr/editor/ + 2021-07-09T16:19:30-07:00 + + + + /sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ + 2021-06-14T11:56:54-07:00 + + + + /presentations/sps/sps_intro/ + 2021-04-26T10:05:30-07:00 + + + + /presentations/spr/spr_project/ + 2021-04-26T10:17:51-07:00 + + + + /community/ + 2021-05-05T11:02:58-07:00 + + + + /sp/ + 2021-04-23T18:05:03-07:00 + + + + /spr_wf/installwf/ + 2021-04-12T11:56:01-07:00 + + + + /news/ + 2021-03-01T10:13:47-08:00 + + + + /presentations/ + 2021-04-26T10:17:51-07:00 + + + + /spr_wf/newwf/ + 2021-04-10T18:13:53-07:00 + + + + /search/ + 2021-02-21T18:25:19-08:00 + + + + /spr_wf/ + 2021-03-22T19:07:21+00:00 + + + + /about/ + 2021-05-05T11:02:58-07:00 + + + + / + 2021-07-30T10:53:50-07:00 + + + + /sps/ + 2021-04-25T19:44:32-07:00 + + + diff --git a/public/sp/index.html b/public/sp/index.html index a4bffe58d..70d11d82c 100644 --- a/public/sp/index.html +++ b/public/sp/index.html @@ -1,77 +1,1103 @@ -systemPipeR Documentation | sysPipe

systemPipeR Documentation

Find here all the documentation!

Motivation

The analysis of Next-generation sequencing (NGS) data remains a -major obstacle to the efficient utilization of the technology. While + + + + + + + + + + + + + + + + + + + + +systemPipeR Documentation | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

systemPipeR Documentation

+ + + + +
+

Find here all the documentation!

+ +
+ +

Motivation

+

The analysis of Next-generation sequencing (NGS) data remains a +major obstacle to the efficient utilization of the technology. While substantial effort has been invested on the development of software dedicated to the individual analysis steps of NGS experiments, insufficient resources are currently available for integrating the individual software components within the widely used R/Bioconductor environment into automated workflows capable of running the analysis of most types of NGS applications from start-to-finish in -a time-efficient and reproducible manner.

Results

To address this need, we have developed the R/Bioconductor package +a time-efficient and reproducible manner.

+

Results

+

To address this need, we have developed the R/Bioconductor package systemPipeR. It is an extensible environment for both building and running end-to-end analysis workflows with automated report generation for a wide range of NGS applications. Its unique features include a uniform workflow interface across different NGS applications, automated report generation, and support for running both R and command-line software on local computers and computer clusters. A flexible sample annotation infrastructure efficiently -handles complex sample sets and experimental designs.

To simplify the analysis +handles complex sample sets and experimental designs.

+

To simplify the analysis of widely used NGS applications, the package provides pre-configured workflows and reporting templates for a wide range of NGS applications that are listed on -the Workflow Collection +the Workflow Collection page of this site. Additional workflow templates will be provided in the future. systemPipeR accelerates the extraction of reproducible analysis results from NGS experiments. By combining the capabilities of many R/Bioconductor and command-line tools, it makes efficient use of existing software resources -without limiting the user to a set of predefined methods or environments.

Availability

systemPipeR is freely available for all common operating systems from -Bioconductor. Its GitHub -repository is here.

Acknowledgement

This project is funded by NSF award ABI-1661152.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/index.xml b/public/sp/index.xml index c54a89a04..e56392277 100644 --- a/public/sp/index.xml +++ b/public/sp/index.xml @@ -1,35 +1,64 @@ -sysPipe – systemPipeR Documentation/sp/Recent content in systemPipeR Documentation on sysPipeHugo -- gohugo.ioSp:/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ -<p>Hi there!</p> -<p>Thanks for submitting an issue to svg-pan-zoom.</p> -<p>To help us help you better, please do the following before submitting an issue:</p> -<ol> -<li>Review the available <a href="https://github.com/ariutta/svg-pan-zoom/blob/master/README.md">documentation</a> and existing <a href="https://github.com/ariutta/svg-pan-zoom#demos">examples</a></li> -<li>Check if the same bug/feature request <a href="https://github.com/ariutta/svg-pan-zoom/issues?q=is%3Aissue%20">wasn&rsquo;t previously reported</a></li> -<li>Make sure you are not asking a usage or debugging question. If you are, use <a href="http://stackoverflow.com/questions/tagged/svgpanzoom">StackOverflow</a>.</li> -<li>Fill in the information that corresponds to your type of issue below</li> -<li>If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via <a href="https://jsfiddle.net">https://jsfiddle.net</a> or similar (template: <a href="http://jsfiddle.net/bumbu/167usffr/)">http://jsfiddle.net/bumbu/167usffr/)</a>.</li> -<li>Delete this intro and any unrelated text :smile: (if you do not we&rsquo;ll assume you haven&rsquo;t read these instructions and automatically close the issue)</li> -</ol> -<h2 id="bug-report">Bug report</h2> -<h3 id="expected-behaviour">Expected behaviour</h3> -<p><em>your text here</em></p> -<h3 id="actual-behaviour">Actual behaviour</h3> -<p><em>your text here</em></p> -<h3 id="steps-to-reproduce-the-behaviour">Steps to reproduce the behaviour</h3> -<ol> -<li></li> -<li></li> -</ol> -<h3 id="configuration">Configuration</h3> -<ul> -<li>svg-pan-zoom version: ``</li> -<li>Browser(s): ``</li> -<li>Operating system(s): ``</li> -<li>A relevant example URL:</li> -</ul> -<h2 id="feature-request">Feature Request</h2> -<ul> -<li>Feature description</li> -<li>Reasons for adopting new feature</li> -<li>Is this a breaking change? (How will this affect existing functionality)</li> -</ul> \ No newline at end of file + + + sysPipe – systemPipeR Documentation + /sp/ + Recent content in systemPipeR Documentation on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sp: + /sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ + + + + <p>Hi there!</p> +<p>Thanks for submitting an issue to svg-pan-zoom.</p> +<p>To help us help you better, please do the following before submitting an issue:</p> +<ol> +<li>Review the available <a href="https://github.com/ariutta/svg-pan-zoom/blob/master/README.md">documentation</a> and existing <a href="https://github.com/ariutta/svg-pan-zoom#demos">examples</a></li> +<li>Check if the same bug/feature request <a href="https://github.com/ariutta/svg-pan-zoom/issues?q=is%3Aissue%20">wasn&rsquo;t previously reported</a></li> +<li>Make sure you are not asking a usage or debugging question. If you are, use <a href="http://stackoverflow.com/questions/tagged/svgpanzoom">StackOverflow</a>.</li> +<li>Fill in the information that corresponds to your type of issue below</li> +<li>If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via <a href="https://jsfiddle.net">https://jsfiddle.net</a> or similar (template: <a href="http://jsfiddle.net/bumbu/167usffr/)">http://jsfiddle.net/bumbu/167usffr/)</a>.</li> +<li>Delete this intro and any unrelated text :smile: (if you do not we&rsquo;ll assume you haven&rsquo;t read these instructions and automatically close the issue)</li> +</ol> +<h2 id="bug-report">Bug report</h2> +<h3 id="expected-behaviour">Expected behaviour</h3> +<p><em>your text here</em></p> +<h3 id="actual-behaviour">Actual behaviour</h3> +<p><em>your text here</em></p> +<h3 id="steps-to-reproduce-the-behaviour">Steps to reproduce the behaviour</h3> +<ol> +<li></li> +<li></li> +</ol> +<h3 id="configuration">Configuration</h3> +<ul> +<li>svg-pan-zoom version: ``</li> +<li>Browser(s): ``</li> +<li>Operating system(s): ``</li> +<li>A relevant example URL:</li> +</ul> +<h2 id="feature-request">Feature Request</h2> +<ul> +<li>Feature description</li> +<li>Reasons for adopting new feature</li> +<li>Is this a breaking change? (How will this affect existing functionality)</li> +</ul> + + + + + + diff --git a/public/sp/sp_docker/index.html b/public/sp/sp_docker/index.html index a08c4b25c..b0d45ca15 100644 --- a/public/sp/sp_docker/index.html +++ b/public/sp/sp_docker/index.html @@ -1,71 +1,1002 @@ -SPR Docker container | sysPipe

SPR Docker container

Guidelines from bioconductor_docker.

Running the systemPipeR with Docker

Get a copy of the public docker image

docker pull systempipe/systempipe_docker:latest
-

To run RStudio Server:

docker run -e PASSWORD=systemPipe -p 8787:8787 \
+
+
+  
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SPR Docker container | sysPipe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

SPR Docker container

+ + +
+

Guidelines from bioconductor_docker.

+
+

Running the systemPipeR with Docker

+

Get a copy of the public docker image

+
docker pull systempipe/systempipe_docker:latest
+
+

To run RStudio Server:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 \
         systempipe/systempipe_docker:latest
-

You can then open a web browser pointing to your docker host on -port 8787. If you’re on Linux and using default settings, the docker +

+

You can then open a web browser pointing to your docker host on +port 8787. If you’re on Linux and using default settings, the docker host is 127.0.0.1 (or localhost, so the full URL to RStudio would be http://localhost:8787). If you are on Mac or Windows and running Docker Toolbox, you can determine the docker host with the -docker-machine ip default command.

In the above command, -e PASSWORD= is setting the RStudio password +docker-machine ip default command.

+

In the above command, -e PASSWORD= is setting the RStudio password and is required by the RStudio Docker image. It can be whatever you like except it cannot be rstudio. Log in to RStudio with the username rstudio and whatever password was specified, in this -example systemPipe.

To run R from the command line:

docker run -it --user rstudio systempipe/systempipe_docker:latest R
-

To open a Bash shell on the container:

docker run -it --user rstudio systempipe/systempipe_docker:latest bash
-

Install

Prerequisites: -Linux -Mac -Windows

Instructions here on how to install Docker Engine on Ubuntu.

sudo apt-get update
+example systemPipe.

+

To run R from the command line:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest R
+
+

To open a Bash shell on the container:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest bash
+
+ + + + + + + + + + + + + + +
+
+

Install

+

Prerequisites: +Linux +Mac +Windows

+

Instructions here on how to install Docker Engine on Ubuntu.

+
sudo apt-get update
 sudo apt-get install \
     apt-transport-https \
     ca-certificates \
@@ -80,28 +1011,73 @@
  
 ## Verify that Docker Engine is installed correctly by running the hello-world image.
 sudo docker run hello-world
-

Uninstall

sudo apt-get remove docker docker-engine docker.io containerd runc
-

Docker Hub Account

To be able to share a custom image, please go to https://hub.docker.com and -create a free account.


Log in to the Docker Hub locally

Login with your Docker ID to push and pull images from Docker Hub. If you don’t -have a Docker ID, head over to https://hub.docker.com to create one.

docker login
+
+

Uninstall

+
sudo apt-get remove docker docker-engine docker.io containerd runc
+
+
+
+

Docker Hub Account

+

To be able to share a custom image, please go to https://hub.docker.com and +create a free account.

+
+
+

Log in to the Docker Hub locally

+

Login with your Docker ID to push and pull images from Docker Hub. If you don’t +have a Docker ID, head over to https://hub.docker.com to create one.

+
docker login
 # Username: XXXX
 # Password: xxx
 # Login Succeeded
-

Run Docker

docker run-dP systempipe/systempipe_docker:latest
-

Make sure the container is running:

docker ps
+
+
+
+

Run Docker

+
docker run-dP systempipe/systempipe_docker:latest
+
+

Make sure the container is running:

+
docker ps
 # CONTAINER ID   IMAGE                                    COMMAND   CREATED         STATUS         PORTS                     # NAMES
 #5d007f66a7b3   systempipe/systempipe_docker:latest   "/init"   5 minutes ago   Up 5 minutes   0.0.0.0:49153->8787/tcp   determined_easle
-

Login to the container

Please check the NAMES in this example, determined_easle, to login into the container.

docker exec -it determined_easle /bin/bash
-

Other alternatives to run the container

To run RStudio Server:

docker run -e PASSWORD=systemPipe -p 8787:8787 \
+
+

Login to the container

+

Please check the NAMES in this example, determined_easle, to login into the container.

+
docker exec -it determined_easle /bin/bash
+
+

Other alternatives to run the container

+

To run RStudio Server:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 \
     systempipe/systempipe_docker:latest
-

To run R from the command line:

docker run -it --user rstudio systempipe/systempipe_docker:latest R
-

To open a Bash shell on the container:

docker run -it --user rstudio systempipe/systempipe_docker:latest bash
-

Check R Version into the container

R --version
-

Stop Docker

docker stop determined_easle
-

Create your first repository Link

Create a repository:

  • Sign in to Docker Hub.
  • Click Create a Repository on the Docker Hub welcome page:
  • Name it /my-repo.
  • Click Create.

Build and push a container image to Docker Hub from your computer

Start by creating a Dockerfile to specify your application

mkdir docker_test
+
+

To run R from the command line:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest R
+
+

To open a Bash shell on the container:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest bash
+
+

Check R Version into the container

+
R --version
+
+

Stop Docker

+
docker stop determined_easle
+
+
+
+

Create your first repository Link

+

Create a repository:

+
    +
  • Sign in to Docker Hub.
  • +
  • Click Create a Repository on the Docker Hub welcome page:
  • +
  • Name it /my-repo.
  • +
  • Click Create.
  • +
+

Build and push a container image to Docker Hub from your computer

+

Start by creating a Dockerfile to specify your application

+
mkdir docker_test
 cd docker_test
 touch Dockerfile
-
# Docker inheritance
+
+
# Docker inheritance
 FROM systempipe/systempipe_docker:latest
 
 ## Install BiocStyle
@@ -123,26 +1099,76 @@
       maintainer="email@gmail.com" \
       description="Bioconductor docker image containing the systemPipeR Project" \
       license="Artistic-2.0"
-

Run docker build to build your Docker image

docker build -t systempipe/systempipe_docker . 
-

Run docker run to test your Docker image locally

docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest
-

Run docker push to push your Docker image to Docker Hub

docker push systempipe/systempipe_docker
-
  • Your repository in Docker Hub should now display a new latest tag under Tags

Make changes to the container and Create the new image

Create a folder, for example:

docker run -dP systempipe/systempipe_docker
+
+

Run docker build to build your Docker image

+
docker build -t systempipe/systempipe_docker . 
+
+

Run docker run to test your Docker image locally

+
docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest
+
+

Run docker push to push your Docker image to Docker Hub

+
docker push systempipe/systempipe_docker
+
+
    +
  • Your repository in Docker Hub should now display a new latest tag under Tags
  • +
+
+
+

Make changes to the container and Create the new image

+

Create a folder, for example:

+
docker run -dP systempipe/systempipe_docker
 docker ps ## To check the NAME <lucid_grothendieck>
 docker exec -it lucid_grothendieck /bin/bash
 root@33c758eb1626:/# R
-
setwd("home/rstudio/")
+
+
setwd("home/rstudio/")
 systemPipeRdata::genWorkenvir("rnaseq")
-
exit
+
+
exit
 docker commit -m "Added rnaseq template" -a "Dani Cassol" lucid_grothendieck dcassol/systempipeworkshop2021:rnaseq
 docker push systempipe/systempipe_docker:rnaseq
-

Run the new image:

docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq
-

Commands

List which docker machines are available locally

{bash, eval=FALSE}docker images

List running containers

{bash, eval=FALSE}docker ps

List all containers

{bash, eval=FALSE}docker ps -a

Resume a stopped container

{bash, eval=FALSE}docker start <CONTAINER ID>

Shell into a running container

{bash, eval=FALSE}docker exec -it <CONTAINER ID> /bin/bash

Stop OR remove a cointainer

{bash, eval=FALSE}docker stop <CONTAINER ID> -{bash, eval=FALSE}docker rm <CONTAINER ID>

Remove a image

{bash, eval=FALSE}docker rmi dcassol/systempipeworkshop2021:rnaseq


Docker and GitHub Actions

  1. To create a new token, go to Docker Hub Settings

1.1. Account Settings » Security » New Access Token -1.2. Add Access Token Description » Create -1.3. Copy the Access Token » Copy and Close

  1. Go to the Repository at GitHub

2.1. Settings > Secrets > New repository secret +

+

Run the new image:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq
+
+
+
+

Commands

+

List which docker machines are available locally

+

{bash, eval=FALSE}docker images

+

List running containers

+

{bash, eval=FALSE}docker ps

+

List all containers

+

{bash, eval=FALSE}docker ps -a

+

Resume a stopped container

+

{bash, eval=FALSE}docker start <CONTAINER ID>

+

Shell into a running container

+

{bash, eval=FALSE}docker exec -it <CONTAINER ID> /bin/bash

+

Stop OR remove a cointainer

+

{bash, eval=FALSE}docker stop <CONTAINER ID> +{bash, eval=FALSE}docker rm <CONTAINER ID>

+

Remove a image

+

{bash, eval=FALSE}docker rmi dcassol/systempipeworkshop2021:rnaseq

+
+
+

Docker and GitHub Actions

+
    +
  1. To create a new token, go to Docker Hub Settings
  2. +
+

1.1. Account Settings » Security » New Access Token +1.2. Add Access Token Description » Create +1.3. Copy the Access Token » Copy and Close

+
    +
  1. Go to the Repository at GitHub
  2. +
+

2.1. Settings > Secrets > New repository secret 2.2. Create a new secret with the name DOCKER_HUB_USERNAME and your Docker ID as value 2.3. Click at Add secret -2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)

  1. Set up the GitHub Actions workflow
    steps:
+2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)

+
    +
  1. Set up the GitHub Actions workflow
  2. +
+
    steps:
     
       - name: Checkout Repo 
         uses: actions/checkout@v2
@@ -152,16 +1178,135 @@
         with:
           username: ${{ secrets.DOCKER_HUB_USERNAME }}
           password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
-

Common Problems

## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied
-

Solution:

sudo chmod 666 /var/run/docker.sock
-

Singularity Container

Please download the Docker image of systemPipe, as follow:

singularity pull docker://systempipe/systempipe_docker:latest
-

You can also use the build command to download pre-built images from Docker. +

+
+
+

Common Problems

+
## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied
+
+

Solution:

+
sudo chmod 666 /var/run/docker.sock
+
+
+
+

Singularity Container

+

Please download the Docker image of systemPipe, as follow:

+
singularity pull docker://systempipe/systempipe_docker:latest
+
+

You can also use the build command to download pre-built images from Docker. Unlike pull, build will convert the image to the latest Singularity image format after -downloading it.

singularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest
-

To run the container:

singularity shell systempipe_docker_latest.sif
-

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/cwl_and_spr/index.html b/public/sp/spr/cwl_and_spr/index.html new file mode 100644 index 000000000..db9290794 --- /dev/null +++ b/public/sp/spr/cwl_and_spr/index.html @@ -0,0 +1,1573 @@ + + + + + + + + + + + + + + + + + + + +SPR and CWL | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

SPR and CWL

+ + + + +

How to connect CWL description files within systemPipeR

+

This section will demonstrate how to connect CWL parameters files to create +workflows. In addition, we will show how the workflow can be easily scalable +with systemPipeR.

+

SYSargsList container stores all the information and instructions needed for processing +a set of input files with a single or many command-line steps within a workflow +(i.e. several components of the software or several independent software tools). +The SYSargsList object is created and fully populated with the SYSargsList construct +function. +Full documentation of SYSargsList management instances can be found here +and here.

+

The following imports a .cwl file (here example.cwl) for running the echo Hello World! +example.

+
HW <- SYSargsList(wf_file = "example/workflow_example.cwl", input_file = "example/example_single.yml",
+    dir_path = system.file("extdata/cwl", package = "systemPipeR"))
+HW
+
+
## Instance of 'SYSargsList': 
+##     WF Steps:
+##        1. Step_x --> Status: Pending 
+##            Total Files: 1 | Existing: 0 | Missing: 1 
+##          1.1. echo
+##              cmdlist: 1 | Pending: 1
+## 
+
+
cmdlist(HW)
+
+
## $Step_x
+## $Step_x$defaultid
+## $Step_x$defaultid$echo
+## [1] "echo Hello World! > results/M1.txt"
+
+

However, we are limited to run just one command-line or one sample in this example. +To scale the command-line over many samples, a simple solution offered by systemPipeR +is to provide a variable for each of the parameters that we want to run with multiple samples.

+

Let’s explore the example:

+
dir_path <- system.file("extdata/cwl", package = "systemPipeR")
+yml <- yaml::read_yaml(file.path(dir_path, "example/example.yml"))
+yml
+
+
## $message
+## [1] "_STRING_"
+## 
+## $SampleName
+## [1] "_SAMPLE_"
+## 
+## $results_path
+## $results_path$class
+## [1] "Directory"
+## 
+## $results_path$path
+## [1] "./results"
+
+

For the message and SampleName parameter, we are passing a variable connecting +with a third file called targets.

+

Now, let’s explore the targets file structure:

+
targetspath <- system.file("extdata/cwl/example/targets_example.txt", package = "systemPipeR")
+read.delim(targetspath, comment.char = "#")
+
+
##               Message SampleName
+## 1        Hello World!         M1
+## 2          Hello USA!         M2
+## 3 Hello Bioconductor!         M3
+
+

The targets file defines all input files or values and sample ids of an analysis workflow. +For this example, we have defined a string message for the echo command-line tool, +in the first column that will be evaluated, and the second column is the +SampleName id for each one of the messages. +Any number of additional columns can be added as needed.

+

Users should note here, the usage of targets files is optional when using +systemPipeR's new CWL interface. Since for organizing experimental variables targets +files are extremely useful and user-friendly. Thus, we encourage users to keep using them.

+

How to connect the parameter files and targets file information?

+

The constructor function creates an SYSargsList S4 class object connecting three input files:

+
    +
  • CWL command-line specification file (wf_file argument);
  • +
  • Input variables (input_file argument);
  • +
  • Targets file (targets argument).
  • +
+

As demonstrated above, the latter is optional for workflow steps lacking input files. +The connection between input variables (here defined by input_file argument) +and the targets file are defined under the inputvars argument. +A named vector is required, where each element name needs to match with column +names in the targets file, and the value must match the names of the .yml +variables. This is used to replace the CWL variable and construct all the command-line +for that particular step.

+

The variable pattern _XXXX_ is used to distinguish CWL variables that target +columns will replace. This pattern is recommended for consistency and easy identification +but not enforced.

+

The following imports a .cwl file (same example demonstrated above) for running +the echo Hello World example. However, now we are connecting the variable defined +on the .yml file with the targets file inputs.

+
HW_mul <- SYSargsList(step_name = "echo", targets = targetspath, wf_file = "example/workflow_example.cwl",
+    input_file = "example/example.yml", dir_path = dir_path, inputvars = c(Message = "_STRING_",
+        SampleName = "_SAMPLE_"))
+HW_mul
+
+
## Instance of 'SYSargsList': 
+##     WF Steps:
+##        1. echo --> Status: Pending 
+##            Total Files: 3 | Existing: 0 | Missing: 3 
+##          1.1. echo
+##              cmdlist: 3 | Pending: 3
+## 
+
+
cmdlist(HW_mul)
+
+
## $echo
+## $echo$M1
+## $echo$M1$echo
+## [1] "echo Hello World! > results/M1.txt"
+## 
+## 
+## $echo$M2
+## $echo$M2$echo
+## [1] "echo Hello USA! > results/M2.txt"
+## 
+## 
+## $echo$M3
+## $echo$M3$echo
+## [1] "echo Hello Bioconductor! > results/M3.txt"
+
+
+

WConnectivity between CWL param files and targets files.

+

+Figure 1: WConnectivity between CWL param files and targets files. +

+
+

Creating the CWL param files from the command-line

+

Users need to define the command-line in a pseudo-bash script format:

+
command <- "
+    hisat2 \
+    -S <F, out: ./results/M1A.sam> \
+    -x <F: ./data/tair10.fasta> \
+     -k <int: 1> \
+    -min-intronlen <int: 30> \
+    -max-intronlen <int: 3000> \
+    -threads <int: 4> \
+    -U <F: ./data/SRR446027_1.fastq.gz>
+"
+
+

Define prefix and defaults

+
    +
  • +

    First line is the base command. Each line is an argument with its default value.

    +
  • +
  • +

    For argument lines (starting from the second line), any word before the first +space with leading - or -- in each will be treated as a prefix, like -S or +--min. Any line without this first word will be treated as no prefix.

    +
  • +
  • +

    All defaults are placed inside <...>.

    +
  • +
  • +

    First argument is the input argument type. F for “File,” “int,” “string” are unchanged.

    +
  • +
  • +

    Optional: use the keyword out followed the type with a , comma separation to +indicate if this argument is also an CWL output.

    +
  • +
  • +

    Then, use : to separate keywords and default values, any non-space value after the : +will be treated as the default value.

    +
  • +
  • +

    If any argument has no default value, just a flag, like --verbose, there is no need to add any <...>

    +
  • +
+

createParam Function

+

createParam function requires the string as defined above as an input.

+

First of all, the function will print the three components of the cwl file:

+
    +
  • BaseCommand: Specifies the program to execute.
  • +
  • Inputs: Defines the input parameters of the process.
  • +
  • Outputs: Defines the parameters representing the output of the process.
  • +
+

The four component is the original command-line.

+

If in interactive mode, the function will verify that everything is correct and +will ask you to proceed. Here, the user can answer “no” and provide more +information at the string level. Another question is to save the param created here.

+

If running the workflow in non-interactive mode, the createParam function will +consider “yes” and returning the container.

+
cmd <- createParam(command, writeParamFiles = FALSE)
+
+
## *****BaseCommand*****
+## hisat2 
+## *****Inputs*****
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+## k:
+##     type: int
+##     preF: -k
+##     yml: 1
+## min-intronlen:
+##     type: int
+##     preF: -min-intronlen
+##     yml: 30
+## max-intronlen:
+##     type: int
+##     preF: -max-intronlen
+##     yml: 3000
+## threads:
+##     type: int
+##     preF: -threads
+##     yml: 4
+## U:
+##     type: File
+##     preF: -U
+##     yml: ./data/SRR446027_1.fastq.gz
+## *****Outputs*****
+## output1:
+##     type: File
+##     value: ./results/M1A.sam
+## *****Parsed raw command line*****
+## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz
+
+

If the user chooses not to save the param files on the above operation, +it can use the writeParamFiles function.

+
writeParamFiles(cmd, overwrite = TRUE)
+
+

How to access and edit param files

+ +
printParam(cmd, position = "baseCommand")  ## Print a baseCommand section
+
+
## *****BaseCommand*****
+## hisat2
+
+
printParam(cmd, position = "outputs")
+
+
## *****Outputs*****
+## output1:
+##     type: File
+##     value: ./results/M1A.sam
+
+
printParam(cmd, position = "inputs", index = 1:2)  ## Print by index
+
+
## *****Inputs*****
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+
+
printParam(cmd, position = "inputs", index = -1:-2)  ## Negative indexing printing to exclude certain indices in a position
+
+
## *****Inputs*****
+## k:
+##     type: int
+##     preF: -k
+##     yml: 1
+## min-intronlen:
+##     type: int
+##     preF: -min-intronlen
+##     yml: 30
+## max-intronlen:
+##     type: int
+##     preF: -max-intronlen
+##     yml: 3000
+## threads:
+##     type: int
+##     preF: -threads
+##     yml: 4
+## U:
+##     type: File
+##     preF: -U
+##     yml: ./data/SRR446027_1.fastq.gz
+
+

Subsetting the command-line

+
cmd2 <- subsetParam(cmd, position = "inputs", index = 1:2, trim = TRUE)
+
+
## *****Inputs*****
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+## *****Parsed raw command line*****
+## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta
+
+
cmdlist(cmd2)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta"
+
+
cmd2 <- subsetParam(cmd, position = "inputs", index = c("S", "x"), trim = TRUE)
+
+
## *****Inputs*****
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+## *****Parsed raw command line*****
+## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta
+
+
cmdlist(cmd2)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta"
+
+

Replacing a existing argument in the command-line

+
cmd3 <- replaceParam(cmd, "base", index = 1, replace = list(baseCommand = "bwa"))
+
+
## Replacing baseCommand
+## *****BaseCommand*****
+## bwa 
+## *****Parsed raw command line*****
+## bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz
+
+
cmdlist(cmd3)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz"
+
+
new_inputs <- new_inputs <- list(new_input1 = list(type = "File", preF = "-b", yml = "myfile"),
+    new_input2 = "-L <int: 4>")
+cmd4 <- replaceParam(cmd, "inputs", index = 1:2, replace = new_inputs)
+
+
## Replacing inputs
+## *****Inputs*****
+## new_input1:
+##     type: File
+##     preF: -b
+##     yml: myfile
+## new_input2:
+##     type: int
+##     preF: -L
+##     yml: 4
+## k:
+##     type: int
+##     preF: -k
+##     yml: 1
+## min-intronlen:
+##     type: int
+##     preF: -min-intronlen
+##     yml: 30
+## max-intronlen:
+##     type: int
+##     preF: -max-intronlen
+##     yml: 3000
+## threads:
+##     type: int
+##     preF: -threads
+##     yml: 4
+## U:
+##     type: File
+##     preF: -U
+##     yml: ./data/SRR446027_1.fastq.gz
+## *****Parsed raw command line*****
+## hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz
+
+
cmdlist(cmd4)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz"
+
+

Adding new arguments

+
newIn <- new_inputs <- list(new_input1 = list(type = "File", preF = "-b1", yml = "myfile1"),
+    new_input2 = list(type = "File", preF = "-b2", yml = "myfile2"), new_input3 = "-b3 <F: myfile3>")
+cmd5 <- appendParam(cmd, "inputs", index = 1:2, append = new_inputs)
+
+
## Replacing inputs
+## *****Inputs*****
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+## k:
+##     type: int
+##     preF: -k
+##     yml: 1
+## min-intronlen:
+##     type: int
+##     preF: -min-intronlen
+##     yml: 30
+## max-intronlen:
+##     type: int
+##     preF: -max-intronlen
+##     yml: 3000
+## threads:
+##     type: int
+##     preF: -threads
+##     yml: 4
+## U:
+##     type: File
+##     preF: -U
+##     yml: ./data/SRR446027_1.fastq.gz
+## new_input1:
+##     type: File
+##     preF: -b1
+##     yml: myfile1
+## new_input2:
+##     type: File
+##     preF: -b2
+##     yml: myfile2
+## new_input3:
+##     type: File
+##     preF: -b3
+##     yml: myfile3
+## *****Parsed raw command line*****
+## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3
+
+
cmdlist(cmd5)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3"
+
+
cmd6 <- appendParam(cmd, "inputs", index = 1:2, after = 0, append = new_inputs)
+
+
## Replacing inputs
+## *****Inputs*****
+## new_input1:
+##     type: File
+##     preF: -b1
+##     yml: myfile1
+## new_input2:
+##     type: File
+##     preF: -b2
+##     yml: myfile2
+## new_input3:
+##     type: File
+##     preF: -b3
+##     yml: myfile3
+## S:
+##     type: File
+##     preF: -S
+##     yml: ./results/M1A.sam
+## x:
+##     type: File
+##     preF: -x
+##     yml: ./data/tair10.fasta
+## k:
+##     type: int
+##     preF: -k
+##     yml: 1
+## min-intronlen:
+##     type: int
+##     preF: -min-intronlen
+##     yml: 30
+## max-intronlen:
+##     type: int
+##     preF: -max-intronlen
+##     yml: 3000
+## threads:
+##     type: int
+##     preF: -threads
+##     yml: 4
+## U:
+##     type: File
+##     preF: -U
+##     yml: ./data/SRR446027_1.fastq.gz
+## *****Parsed raw command line*****
+## hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz
+
+
cmdlist(cmd6)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz"
+
+

Editing output param

+
new_outs <- list(sam_out = "<F: $(inputs.results_path)/test.sam>")
+cmd7 <- replaceParam(cmd, "outputs", index = 1, replace = new_outs)
+
+
## Replacing outputs
+## *****Outputs*****
+## sam_out:
+##     type: File
+##     value: $(inputs.results_path)/test.sam
+## *****Parsed raw command line*****
+## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz
+
+
output(cmd7)
+
+
## $defaultid
+## $defaultid$hisat2
+## [1] "./results/test.sam"
+
+ + + +
Last modified 0001-01-01 +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/cwl_syntax/index.html b/public/sp/spr/cwl_syntax/index.html new file mode 100644 index 000000000..dafc65eda --- /dev/null +++ b/public/sp/spr/cwl_syntax/index.html @@ -0,0 +1,1256 @@ + + + + + + + + + + + + + + + + + + + +CWL syntax | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

CWL syntax

+ + + + +

CWL syntax

+

This section will introduce how CWL describes command-line tools and the +specification and terminology of each file. +For complete documentation, please check the CommandLineTools documentation here +and here for Workflows and the user guide here.

+

CWL command-line specifications are written in YAML format.

+

In CWL, files with the extension .cwl define the parameters of a chosen +command-line step or workflow, while files with the extension .yml define +the input variables of command-line steps.

+

CWL CommandLineTool

+

CommandLineTool by CWL definition is a standalone process, with no interaction +if other programs, execute a program, and produce output.

+

Let’s explore the *.cwl file:

+
dir_path <- system.file("extdata/cwl", package = "systemPipeR")
+cwl <- yaml::read_yaml(file.path(dir_path, "example/example.cwl"))
+
+
    +
  • The cwlVersion component shows the CWL specification version used by the document.
  • +
  • The class component shows this document describes a CommandLineTool. +Note that CWL has another class, called Workflow which represents a union of one +or more command-line tools together.
  • +
+
cwl[1:2]
+
+
## $cwlVersion
+## [1] "v1.0"
+## 
+## $class
+## [1] "CommandLineTool"
+
+
    +
  • baseCommand component provides the name of the software that we desire to execute.
  • +
+
cwl[3]
+
+
## $baseCommand
+## [1] "echo"
+
+
    +
  • The inputs section provides the input information to run the tool. Important +components of this section are: +
      +
    • id: each input has an id describing the input name;
    • +
    • type: describe the type of input value (string, int, long, float, double, +File, Directory or Any);
    • +
    • inputBinding: It is optional. This component indicates if the input +parameter should appear on the command-line. If this component is missing +when describing an input parameter, it will not appear in the command-line +but can be used to build the command-line.
    • +
    +
  • +
+
cwl[4]
+
+
## $inputs
+## $inputs$message
+## $inputs$message$type
+## [1] "string"
+## 
+## $inputs$message$inputBinding
+## $inputs$message$inputBinding$position
+## [1] 1
+## 
+## 
+## 
+## $inputs$SampleName
+## $inputs$SampleName$type
+## [1] "string"
+## 
+## 
+## $inputs$results_path
+## $inputs$results_path$type
+## [1] "Directory"
+
+
    +
  • The outputs section should provide a list of the expected outputs after running the command-line tools. Important +components of this section are: +
      +
    • id: each input has an id describing the output name;
    • +
    • type: describe the type of output value (string, int, long, float, double, +File, Directory, Any or stdout);
    • +
    • outputBinding: This component defines how to set the outputs values. The glob component will define the name of the output value.
    • +
    +
  • +
+
cwl[5]
+
+
## $outputs
+## $outputs$string
+## $outputs$string$type
+## [1] "stdout"
+
+
    +
  • stdout: component to specify a filename to capture standard output. +Note here we are using a syntax that takes advantage of the inputs section, +using results_path parameter and also the SampleName to construct the output filename.
  • +
+
cwl[6]
+
+
## $stdout
+## [1] "$(inputs.results_path.basename)/$(inputs.SampleName).txt"
+
+

CWL Workflow

+

Workflow class in CWL is defined by multiple process steps, where can have +interdependencies between the steps, and the output for one step can be used as +input in the further steps.

+
cwl.wf <- yaml::read_yaml(file.path(dir_path, "example/workflow_example.cwl"))
+
+
    +
  • The cwlVersion component shows the CWL specification version used by the document.
  • +
  • The class component shows this document describes a Workflow.
  • +
+
cwl.wf[1:2]
+
+
## $class
+## [1] "Workflow"
+## 
+## $cwlVersion
+## [1] "v1.0"
+
+
    +
  • The inputs section describes the inputs of the workflow.
  • +
+
cwl.wf[3]
+
+
## $inputs
+## $inputs$message
+## [1] "string"
+## 
+## $inputs$SampleName
+## [1] "string"
+## 
+## $inputs$results_path
+## [1] "Directory"
+
+
    +
  • The outputs section describes the outputs of the workflow.
  • +
+
cwl.wf[4]
+
+
## $outputs
+## $outputs$string
+## $outputs$string$outputSource
+## [1] "echo/string"
+## 
+## $outputs$string$type
+## [1] "stdout"
+
+
    +
  • The steps section describes the steps of the workflow. In this simple example, +we demonstrate one step.
  • +
+
cwl.wf[5]
+
+
## $steps
+## $steps$echo
+## $steps$echo$`in`
+## $steps$echo$`in`$message
+## [1] "message"
+## 
+## $steps$echo$`in`$SampleName
+## [1] "SampleName"
+## 
+## $steps$echo$`in`$results_path
+## [1] "results_path"
+## 
+## 
+## $steps$echo$out
+## [1] "[string]"
+## 
+## $steps$echo$run
+## [1] "example/example.cwl"
+
+

CWL Input Parameter

+

Next, let’s explore the .yml file, which provide the input parameter values for all +the components we describe above.

+

For this simple example, we have three parameters defined:

+
yaml::read_yaml(file.path(dir_path, "example/example_single.yml"))
+
+
## $message
+## [1] "Hello World!"
+## 
+## $SampleName
+## [1] "M1"
+## 
+## $results_path
+## $results_path$class
+## [1] "Directory"
+## 
+## $results_path$path
+## [1] "./results"
+
+

Note that if we define an input component in the .cwl file, this value needs +to be also defined here in the .yml file.

+

Reference

+ + + +
Last modified 0001-01-01 +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/editor/index.html b/public/sp/spr/editor/index.html index d9f212de7..09ce18714 100644 --- a/public/sp/spr/editor/index.html +++ b/public/sp/spr/editor/index.html @@ -1,56 +1,1000 @@ -Workflow Plot Editor | sysPipe

Workflow Plot Editor

This is a SPR workflow editor, which will allow you to edit the workflow plot before/after running a workflow in SPR.

  1. Create a SPR workflow with the sysArgsList (sal) object, or directly use the sal object after workflow running.
  2. make a workflow plot with plotWF(sal) to take a glimpse of the plot preview.
  3. Use plotWF(sal, out_format = "dot_print") to print out the plot in DOT language, copy the whole content to your clipboard.
  4. Use this link to open Workflow Plot Editor.
  5. Paste plot code in the editor to start editing.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

Workflow Plot Editor

+ + +

This is a SPR workflow editor, which will allow you to edit the workflow plot before/after running a workflow in SPR.

+
    +
  1. Create a SPR workflow with the sysArgsList (sal) object, or directly use the sal object after workflow running.
  2. +
  3. make a workflow plot with plotWF(sal) to take a glimpse of the plot preview.
  4. +
  5. Use plotWF(sal, out_format = "dot_print") to print out the plot in DOT language, copy the whole content to your clipboard.
  6. +
  7. Use this link to open Workflow Plot Editor.
  8. +
  9. Paste plot code in the editor to start editing.
  10. +
+ + + +
Last modified 2021-07-09: Update editor.md (6a262f4a) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/gettingstarted/index.html b/public/sp/spr/gettingstarted/index.html index 195d27e8e..a9b4bb239 100644 --- a/public/sp/spr/gettingstarted/index.html +++ b/public/sp/spr/gettingstarted/index.html @@ -1,119 +1,1142 @@ -Getting Started | sysPipe

Getting Started

Getting Started

Installation

systemPipeR -environment can be installed from the R console using the BiocManager::install -command. The associated data package systemPipeRdata + + + + + + + + + + + + + + + + + + + +Getting Started | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Getting Started

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

Getting Started

+

Installation

+

systemPipeR +environment can be installed from the R console using the BiocManager::install +command. The associated data package systemPipeRdata can be installed the same way. The latter is a helper package for generating systemPipeR workflow environments with a single command containing all parameter files and -sample data required to quickly test and run workflows.

if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
+sample data required to quickly test and run workflows.

+
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
 BiocManager::install("systemPipeR")
 BiocManager::install("systemPipeRdata")
-

Please note that if you desire to use a third-party command-line tool, the particular +

+

Please note that if you desire to use a third-party command-line tool, the particular tool and dependencies need to be installed and exported in your PATH. -See details.

Loading package and documentation

library("systemPipeR")  # Loads the package
+See details.

+

Loading package and documentation

+
library("systemPipeR")  # Loads the package
 library(help = "systemPipeR")  # Lists package info
 vignette("systemPipeR")  # Opens vignette
-

How to get help for systemPipeR

All questions about the package or any particular function should be posted to -the Bioconductor support site https://support.bioconductor.org.

Please add the “systemPipeR” tag to your question, and the package authors will -automatically receive an alert.

We appreciate receiving reports of bugs in the functions or documentation and +

+

How to get help for systemPipeR

+

All questions about the package or any particular function should be posted to +the Bioconductor support site https://support.bioconductor.org.

+

Please add the “systemPipeR” tag to your question, and the package authors will +automatically receive an alert.

+

We appreciate receiving reports of bugs in the functions or documentation and suggestions for improvement. For that, please consider opening an issue at -GitHub.

Project structure

systemPipeR expects a project directory structure that consists of a directory +GitHub.

+

Project structure

+

systemPipeR expects a project directory structure that consists of a directory where users may store all the raw data, the results directory that will be reserved -for all the outfiles files or new output folders, and the parameters directory.

This structure allows reproducibility and collaboration across the data science +for all the outfiles files or new output folders, and the parameters directory.

+

This structure allows reproducibility and collaboration across the data science team since internally relative paths are used. Users could transfer this project to a different location and still be able to run the entire workflow. Also, it increases efficiency and data management once the raw data is kept in a separate -folder and avoids duplication.

Directory Structure

systemPipeRdata, +folder and avoids duplication.

+

Directory Structure

+

systemPipeRdata, helper package, provides pre-configured workflows, reporting templates, and sample data loaded as demonstrated below. With a single command, the package allows creating the workflow environment containing the structure -described here (see Figure 1).

Directory names are indicated in green. +described here (see Figure 1).

+

Directory names are indicated in green. Users can change this structure as needed, but need to adjust the code in their -workflows accordingly.

  • workflow/ (e.g. myproject/)
    • This is the root directory of the R session running the workflow.
    • Run script ( *.Rmd) and sample annotation (targets.txt) files are located here.
    • Note, this directory can have any name (e.g. myproject). Changing its name does not require any modifications in the run script(s).
    • Important subdirectories:
      • param/
        • param/cwl/: This subdirectory stores all the parameter and configuration files. To organize workflows, each can have its own subdirectory, where all *.cwl and *input.yml files need to be in the same subdirectory.
      • data/
        • Raw data (e.g. FASTQ files)
        • FASTA file of reference (e.g. reference genome)
        • Annotation files
        • Metadata
        • etc.
      • results/
        • Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files
        • Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.

*systemPipeR's* preconfigured directory structure.

Figure 1: *systemPipeR’s* preconfigured directory structure.

The following parameter files are included in each workflow template:

  1. targets.txt: initial one provided by user; downstream targets_*.txt files are generated automatically
  2. *.param/cwl: defines parameter for input/output file operations, e.g.:
    • hisat2/hisat2-mapping-se.cwl
    • hisat2/hisat2-mapping-se.yml
  3. *_run.sh: optional bash scripts
  4. Configuration files for computer cluster environments (skip on single machines):
    • .batchtools.conf.R: defines the type of scheduler for batchtools pointing to template file of cluster, and located in user’s home directory
    • batchtools.*.tmpl: specifies parameters of scheduler used by a system, e.g. Torque, SGE, Slurm, etc.

Structure of initial targets file

The targets file defines all input files (e.g. FASTQ, BAM, BCF) and sample +workflows accordingly.

+
    +
  • workflow/ (e.g. myproject/) +
      +
    • This is the root directory of the R session running the workflow.
    • +
    • Run script ( *.Rmd) and sample annotation (targets.txt) files are located here.
    • +
    • Note, this directory can have any name (e.g. myproject). Changing its name does not require any modifications in the run script(s).
    • +
    • Important subdirectories: +
        +
      • param/ +
          +
        • param/cwl/: This subdirectory stores all the parameter and configuration files. To organize workflows, each can have its own subdirectory, where all *.cwl and *input.yml files need to be in the same subdirectory.
        • +
        +
      • +
      • data/ +
          +
        • Raw data (e.g. FASTQ files)
        • +
        • FASTA file of reference (e.g. reference genome)
        • +
        • Annotation files
        • +
        • Metadata
        • +
        • etc.
        • +
        +
      • +
      • results/ +
          +
        • Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files
        • +
        • Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.
        • +
        +
      • +
      +
    • +
    +
  • +
+
+

systemPipeR's preconfigured directory structure.

+

+Figure 1: systemPipeR’s preconfigured directory structure. +

+
+

The following parameter files are included in each workflow template:

+
    +
  1. targets.txt: initial one provided by user; downstream targets_*.txt files are generated automatically
  2. +
  3. *.param/cwl: defines parameter for input/output file operations, e.g.: +
      +
    • hisat2/hisat2-mapping-se.cwl
    • +
    • hisat2/hisat2-mapping-se.yml
    • +
    +
  4. +
  5. *_run.sh: optional bash scripts
  6. +
  7. Configuration files for computer cluster environments (skip on single machines): +
      +
    • .batchtools.conf.R: defines the type of scheduler for batchtools pointing to template file of cluster, and located in user’s home directory
    • +
    • batchtools.*.tmpl: specifies parameters of scheduler used by a system, e.g. Torque, SGE, Slurm, etc.
    • +
    +
  8. +
+

Structure of initial targets file

+

The targets file defines all input files (e.g. FASTQ, BAM, BCF) and sample comparisons of an analysis workflow. The following shows the format of a sample targets file included in the package. It also can be viewed and downloaded -from systemPipeR’s GitHub repository here. +from systemPipeR’s GitHub repository here. In a target file with a single type of input files, here FASTQ files of single-end (SE) reads, the first column describe the path and the second column represents a unique id name for each sample. The third column called Factor represents the biological replicates. All subsequent columns are additional -information, and any number of extra columns can be added as needed.

Users should note here, the usage of targets files is optional when using +information, and any number of extra columns can be added as needed.

+

Users should note here, the usage of targets files is optional when using systemPipeR's new workflow management interface. They can be replaced by a standard YAML input file used by CWL. Since for organizing experimental variables targets files are extremely useful and user-friendly. Thus, we encourage users to keep using -them.

Structure of targets file for single-end (SE) samples

targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
+them.

+

Structure of targets file for single-end (SE) samples

+
targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
 showDF(read.delim(targetspath, comment.char = "#"))
-

To work with custom data, users need to generate a targets file containing +

+
## Loading required namespace: DT
+
+
+ +

To work with custom data, users need to generate a targets file containing the paths to their own FASTQ files and then provide under targetspath the -path to the corresponding targets file.

Structure of targets file for paired-end (PE) samples

For paired-end (PE) samples, the structure of the targets file is similar, where +path to the corresponding targets file.

+

Structure of targets file for paired-end (PE) samples

+

For paired-end (PE) samples, the structure of the targets file is similar, where users need to provide two FASTQ path columns: FileName1 and FileName2 -with the paths to the PE FASTQ files.

targetspath <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+with the paths to the PE FASTQ files.

+
targetspath <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 showDF(read.delim(targetspath, comment.char = "#"))
-

Structure of targets file for “Hello World” example

In this example, targets file presents only two columns, which the first one +

+
+ +

Structure of targets file for “Hello World” example

+

In this example, targets file presents only two columns, which the first one are the different phrases used by the echo command-line and the second column -it is the sample id. The id column is required, and each sample id should be unique.

targetspath <- system.file("extdata/cwl/example/targets_example.txt", package = "systemPipeR")
+it is the sample id. The id column is required, and each sample id should be unique.

+
targetspath <- system.file("extdata/cwl/example/targets_example.txt", package = "systemPipeR")
 showDF(read.delim(targetspath, comment.char = "#"))
-

Sample comparisons

Sample comparisons are defined in the header lines of the targets file -starting with ‘# <CMP>.’

targetspath <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+
+
+ +

Sample comparisons

+

Sample comparisons are defined in the header lines of the targets file +starting with ‘# <CMP>.’

+
targetspath <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 readLines(targetspath)[1:4]
-
## [1] "# Project ID: Arabidopsis - Pseudomonas alternative splicing study (SRA: SRP010938; PMID: 24098335)"                                                                              
+
+
## [1] "# Project ID: Arabidopsis - Pseudomonas alternative splicing study (SRA: SRP010938; PMID: 24098335)"                                                                              
 ## [2] "# The following line(s) allow to specify the contrasts needed for comparative analyses, such as DEG identification. All possible comparisons can be specified with 'CMPset: ALL'."
 ## [3] "# <CMP> CMPset1: M1-A1, M1-V1, A1-V1, M6-A6, M6-V6, A6-V6, M12-A12, M12-V12, A12-V12"                                                                                             
 ## [4] "# <CMP> CMPset2: ALL"
-

The function readComp imports the comparison information and stores it in a +

+

The function readComp imports the comparison information and stores it in a list. Alternatively, readComp can obtain the comparison information from the corresponding SYSargsList step (see below). Note, these header lines are optional. They are mainly useful for controlling comparative analyses according to certain biological expectations, such as identifying differentially expressed -genes in RNA-Seq experiments based on simple pair-wise comparisons.

readComp(file = targetspath, format = "vector", delim = "-")
-
## $CMPset1
+genes in RNA-Seq experiments based on simple pair-wise comparisons.

+
readComp(file = targetspath, format = "vector", delim = "-")
+
+
## $CMPset1
 ## [1] "M1-A1"   "M1-V1"   "A1-V1"   "M6-A6"   "M6-V6"   "A6-V6"   "M12-A12"
 ## [8] "M12-V12" "A12-V12"
 ## 
@@ -124,22 +1147,133 @@
 ## [22] "M6-A6"   "M6-V6"   "M6-M12"  "M6-A12"  "M6-V12"  "A6-V6"   "A6-M12" 
 ## [29] "A6-A12"  "A6-V12"  "V6-M12"  "V6-A12"  "V6-V12"  "M12-A12" "M12-V12"
 ## [36] "A12-V12"
-

Downstream targets files description

After the step which required the initial targets file information, the downstream -targets files are created automatically (see Figure 2). +

+

Downstream targets files description

+

After the step which required the initial targets file information, the downstream +targets files are created automatically (see Figure 2). Each step that uses the previous step outfiles as an input, the new targets input will be managed internally by the workflow instances, establishing connectivity among the steps in the workflow. systemPipeR provides features to automatically and systematically build this connection, providing security that all the samples will be managed efficiently -and reproducibly.

_`systemPipeR`_ automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. _`systemPipeR`_ (C) manages this connectivity among the steps automatically for the users.

Figure 2: *`systemPipeR`* automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. *`systemPipeR`* (C) manages this connectivity among the steps automatically for the users.

Structure of the new parameters files

The parameters and configuration required for running command-line software are -provided by the widely used community standard Common Workflow Language (CWL) -(Amstutz et al. 2016), which describes parameters analysis workflows in a generic -and reproducible manner. For R-based workflow steps, param files are not required. -For a complete overview of the CWL syntax, please see the section below. +and reproducibly.

+
+

_systemPipeR_ automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. _`systemPipeR`_ (C) manages this connectivity among the steps automatically for the users.

+

+Figure 2: *systemPipeR* automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. *`systemPipeR`* (C) manages this connectivity among the steps automatically for the users. +

+
+

Structure of the new parameters files

+

The parameters and configuration required for running command-line software are +provided by the widely used community standard Common Workflow Language (CWL) (Amstutz et al. 2016), which describes +parameters analysis workflows in a generic and reproducible manner. +For R-based workflow steps, param files are not required. +For a complete overview of the CWL syntax, please see this section. Also, we have a dedicated section explain how to systemPipeR establish the -connection between the CWL parameters files and the targets files. Please see here.

References

Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. https://doi.org/10.6084/m9.figshare.3115156.v2.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/index.html b/public/sp/spr/index.html index 793068653..d477762bd 100644 --- a/public/sp/spr/index.html +++ b/public/sp/spr/index.html @@ -1,53 +1,1108 @@ -systemPipeR | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

systemPipeR

+ + + +
+ + + + + +
+ + + + +
+
+ Introduction +
+

+
+ + + + + + + +
+
+ Getting Started +
+

+
+ + + + + + + +
+
+ How to run a Workflow +
+

+
+ + + + + + + +
+
+ Workflow steps overview +
+

+
+ + + +
+
+ Workflow Templates +
+

+
+ + + +
+
+ CWL syntax +
+

+
+ + + +
+
+ SPR and CWL +
+

+
+ + + +
+
+ SPR detailed installation instructions +
+

+
+ + + +
+
+ Help Manual +
+

+
+ + + +
+
+ SPR Docker container +
+

+
+ + + +
+
+ Workflow Plot Editor +
+

+
+ + + +
+
+ +
+

+
+ + + + + +
+ + + +
Last modified 2021-04-26: fix images path; no_render (7cf5004c) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/index.xml b/public/sp/spr/index.xml index 58fe4810c..f1b9ae969 100644 --- a/public/sp/spr/index.xml +++ b/public/sp/spr/index.xml @@ -1,2070 +1,2156 @@ -sysPipe – systemPipeR/sp/spr/Recent content in systemPipeR on sysPipeHugo -- gohugo.ioSp: Introduction/sp/spr/introduction/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/introduction/ -<!-- + + + sysPipe – systemPipeR + /sp/spr/ + Recent content in systemPipeR on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sp: Introduction + /sp/spr/introduction/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/introduction/ + + + + <!-- - Compile from command-line -Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<p><strong>Note:</strong> if you use <em><code>systemPipeR</code></em> in published research, please cite: -Backman, T.W.H and Girke, T. (2016). <em><code>systemPipeR</code></em>: NGS Workflow and Report Generation Environment. <em>BMC Bioinformatics</em>, 17: 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">10.1186/s12859-016-1241-0</a>.</p> -<h1 id="introduction">Introduction</h1> -<p><a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> +</script> +<p><strong>Note:</strong> if you use <em><code>systemPipeR</code></em> in published research, please cite: +Backman, T.W.H and Girke, T. (2016). <em><code>systemPipeR</code></em>: NGS Workflow and Report Generation Environment. <em>BMC Bioinformatics</em>, 17: 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">10.1186/s12859-016-1241-0</a>.</p> +<h1 id="introduction">Introduction</h1> +<p><a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> provides flexible utilities for designing, building, and running automated nd-to-end analysis workflows for a wide range of research applications, including next-generation sequencing (NGS) experiments (H Backman and Girke 2016). Important features include a uniform workflow interface across different data analysis applications, automated report generation, and support for running both R and command-line software, -on local computers or compute clusters (see Figure <a href="#fig:utilities">1</a>). +on local computers or compute clusters (see Figure <a href="#fig:utilities">1</a>). The latter supports interactive job submissions and batch submissions to queuing -systems of clusters.</p> -<p>It has been designed to improve the reproducibility of large-scale data analysis +systems of clusters.</p> +<p>It has been designed to improve the reproducibility of large-scale data analysis projects while substantially reducing the time it takes to analyze complex omics data sets. Its unique features include a uniform workflow interface and management system that allows the user to run selected steps, customize, and design entirely new workflows. Also, the package features take advantage of central community S4 -classes of the Bioconductor ecosystem and command-line-based software support.</p> -<p>The main motivation and advantages of using <em><code>systemPipeR</code></em> for complex data analysis tasks are:</p> -<ol> -<li>Facilitates the design of complex workflows involving multiple R/Bioconductor packages</li> -<li>Common workflow interface for different applications</li> -<li>Makes analysis with Bioconductor utilities more accessible to new users</li> -<li>Simplifies usage of command-line software from within R</li> -<li>Reduces the complexity of using compute clusters for R and command-line software</li> -<li>Accelerates runtime of workflows via parallelization on computer systems with multiple CPU cores and/or multiple compute nodes</li> -<li>Improves reproducibility by automating analyses and generation of analysis reports</li> -</ol> -<div class="figure" style="text-align: center"> -<p><img src="utilities.png" alt="Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A &amp; B). Examples of *systemPipeR's* visualization functionalities are given under (C)." width="100%" /></p> -<p class="caption"> +classes of the Bioconductor ecosystem and command-line-based software support.</p> +<p>The main motivation and advantages of using <em><code>systemPipeR</code></em> for complex data analysis tasks are:</p> +<ol> +<li>Facilitates the design of complex workflows involving multiple R/Bioconductor packages</li> +<li>Common workflow interface for different applications</li> +<li>Makes analysis with Bioconductor utilities more accessible to new users</li> +<li>Simplifies usage of command-line software from within R</li> +<li>Reduces the complexity of using compute clusters for R and command-line software</li> +<li>Accelerates runtime of workflows via parallelization on computer systems with multiple CPU cores and/or multiple compute nodes</li> +<li>Improves reproducibility by automating analyses and generation of analysis reports</li> +</ol> +<div class="figure" style="text-align: center"> +<p><img src="utilities.png" alt="Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A &amp; B). Examples of *systemPipeR's* visualization functionalities are given under (C)." width="100%" /></p> +<p class="caption"> Figure 1: Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A & B). Examples of *systemPipeR’s* visualization functionalities are given under (C). -</p> -</div> -<p>A central concept for designing workflows within the <em><code>systemPipeR</code></em> environment +</p> +</div> +<p>A central concept for designing workflows within the <em><code>systemPipeR</code></em> environment is the use of workflow management containers. Workflow management containers allow the automation of design, build, run and scale different steps and tools in data analysis. -<em><code>systemPipeR</code></em> adopted the widely used community standard <a href="https://www.commonwl.org/">Common Workflow Language</a> (CWL) +<em><code>systemPipeR</code></em> adopted the widely used community standard <a href="https://www.commonwl.org/">Common Workflow Language</a> (CWL) (Amstutz et al. 2016) for describing parameters analysis workflows in a generic and reproducible -manner. Using this community standard in <em><code>systemPipeR</code></em> -has many advantages. For instance, the integration of CWL allows running <em><code>systemPipeR</code></em> -workflows from a single specification instance either entirely from within R, from various command-line wrappers (e.g., <em>cwl-runner</em>) or from other languages (<em>, e.g.,</em> Bash or Python). -<em><code>systemPipeR</code></em> includes support for both command-line and R/Bioconductor software +manner. Using this community standard in <em><code>systemPipeR</code></em> +has many advantages. For instance, the integration of CWL allows running <em><code>systemPipeR</code></em> +workflows from a single specification instance either entirely from within R, from various command-line wrappers (e.g., <em>cwl-runner</em>) or from other languages (<em>, e.g.,</em> Bash or Python). +<em><code>systemPipeR</code></em> includes support for both command-line and R/Bioconductor software as well as resources for containerization, parallel evaluations on computer clusters -along with the automated generation of interactive analysis reports.</p> -<p>An important feature of <em><code>systemPipeR's</code></em> CWL interface is that it provides two +along with the automated generation of interactive analysis reports.</p> +<p>An important feature of <em><code>systemPipeR's</code></em> CWL interface is that it provides two options to run command-line tools and workflows based on CWL. First, one can -run CWL in its native way via an R-based wrapper utility for <em>cwl-runner</em> or -<em>cwl-tools</em> (CWL-based approach). Second, one can run workflows using CWL’s +run CWL in its native way via an R-based wrapper utility for <em>cwl-runner</em> or +<em>cwl-tools</em> (CWL-based approach). Second, one can run workflows using CWL’s command-line and workflow instructions from within R (R-based approach). In the -latter case the same CWL workflow definition files (<em>e.g.</em> <code>*.cwl</code> and <code>*.yml</code>) +latter case the same CWL workflow definition files (<em>e.g.</em> <code>*.cwl</code> and <code>*.yml</code>) are used but rendered and executed entirely with R functions defined by -<em><code>systemPipeR</code></em>, and thus use CWL mainly as a command-line and workflow +<em><code>systemPipeR</code></em>, and thus use CWL mainly as a command-line and workflow definition format rather than software to run workflows. In this regard -<em><code>systemPipeR</code></em> also provides several convenience functions that are useful for +<em><code>systemPipeR</code></em> also provides several convenience functions that are useful for designing and debugging workflows, such as a command-line rendering function to retrieve the exact command-line strings for each data set and processing step -prior to running a command-line.</p> -<p>This overview introduces the design of a workflow management container, an S4 -class in <em><code>systemPipeR</code></em>, as well as the custom command-line interface, -combined with the overview of all the common analysis steps of NGS experiments.</p> -<h2 id="new-workflow-management-interface">New workflow management interface</h2> -<p><em><code>systemPipeR</code></em> allows creation (multi-step analyses) and execution of workflow +prior to running a command-line.</p> +<p>This overview introduces the design of a workflow management container, an S4 +class in <em><code>systemPipeR</code></em>, as well as the custom command-line interface, +combined with the overview of all the common analysis steps of NGS experiments.</p> +<h2 id="new-workflow-management-interface">New workflow management interface</h2> +<p><em><code>systemPipeR</code></em> allows creation (multi-step analyses) and execution of workflow entirely for R, with control, flexibility, and scalability of the all process. The execution of the workflow can be sent to a HPC, can be parallelizes, -accelerating results acquisition.</p> -<p>The flexibility of <em><code>systemPipeR's</code></em> new interface workflow management class is +accelerating results acquisition.</p> +<p>The flexibility of <em><code>systemPipeR's</code></em> new interface workflow management class is the driving factor behind the use of as many steps necessary for the analysis, as well as the connection between command-line- or R-based software. The -connectivity among all workflow steps is achieved by the <code>SYSargsList</code> workflow -management class.</p> -<p><code>SYSargsList</code> S4 class is a list-like container where each instance stores all the +connectivity among all workflow steps is achieved by the <code>SYSargsList</code> workflow +management class.</p> +<p><code>SYSargsList</code> S4 class is a list-like container where each instance stores all the input/output paths and parameter components required for a particular data -analysis step (see Figure <a href="#fig:sysargslistImage">2</a>).</p> -<p>The <code>SYSargsList</code> constructor function will generate the instances, using as data +analysis step (see Figure <a href="#fig:sysargslistImage">2</a>).</p> +<p>The <code>SYSargsList</code> constructor function will generate the instances, using as data input initial targets files, as well as two-parameter files (for details, see below). When running preconfigured workflows, the only input the user needs to provide is the initial targets file containing the paths to the input files (e.g., FASTQ) along with unique sample labels. Subsequent targets instances are created automatically, based on the connectivity establish between the steps. The parameters required for running command-line software is provided by the -parameter (<code>*.cwl</code> and <code>*.yml</code>)) files described below.</p> -<p>The class store one or multiple steps, allowing central control for running, +parameter (<code>*.cwl</code> and <code>*.yml</code>)) files described below.</p> +<p>The class store one or multiple steps, allowing central control for running, checking status, and monitor complex workflows from start to finish. This design enhances the systemPipeR workflow framework with a generalized, flexible, and -robust design.</p> -<div class="figure" style="text-align: center"> -<p><img src="sysargslist.png" alt="Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container." width="100%" /></p> -<p class="caption"> +robust design.</p> +<div class="figure" style="text-align: center"> +<p><img src="sysargslist.png" alt="Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container." width="100%" /></p> +<p class="caption"> Figure 2: Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container. -</p> -</div> -<h3 id="reference">Reference</h3> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-Amstutz2016-ka" class="csl-entry"> -<p>Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. <a href="https://doi.org/10.6084/m9.figshare.3115156.v2">https://doi.org/10.6084/m9.figshare.3115156.v2</a>.</p> -</div> -<div id="ref-H_Backman2016-bt" class="csl-entry"> -<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> -</div> -</div>Sp: Getting Started/sp/spr/gettingstarted/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/gettingstarted/ -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> -<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> -<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> -<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> -<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> -<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> -<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> -<!-- -- Compile from command-line -Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +</p> +</div> +<h3 id="reference">Reference</h3> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-Amstutz2016-ka" class="csl-entry"> +<p>Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. <a href="https://doi.org/10.6084/m9.figshare.3115156.v2">https://doi.org/10.6084/m9.figshare.3115156.v2</a>.</p> +</div> +<div id="ref-H_Backman2016-bt" class="csl-entry"> +<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> +</div> +</div> + + + + + + Sp: Getting Started + /sp/spr/gettingstarted/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/gettingstarted/ + + + + <script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> +<script src="../../rmarkdown-libs/jquery/jquery-3.6.0.min.js"></script> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> +<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> +<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> +<script src="../../rmarkdown-libs/jquery/jquery-3.6.0.min.js"></script> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> +<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> +<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> +<script src="../../rmarkdown-libs/jquery/jquery-3.6.0.min.js"></script> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> +<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h2 id="getting-started">Getting Started</h2> -<h3 id="installation">Installation</h3> -<p><a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> -environment can be installed from the R console using the <a href="https://cran.r-project.org/web/packages/BiocManager/index.html"><em><code>BiocManager::install</code></em></a> -command. The associated data package <a href="http://www.bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html"><em><code>systemPipeRdata</code></em></a> -can be installed the same way. The latter is a helper package for generating <em><code>systemPipeR</code></em> +</script> +<h2 id="getting-started">Getting Started</h2> +<h3 id="installation">Installation</h3> +<p><a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> +environment can be installed from the R console using the <a href="https://cran.r-project.org/web/packages/BiocManager/index.html"><em><code>BiocManager::install</code></em></a> +command. The associated data package <a href="http://www.bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html"><em><code>systemPipeRdata</code></em></a> +can be installed the same way. The latter is a helper package for generating <em><code>systemPipeR</code></em> workflow environments with a single command containing all parameter files and -sample data required to quickly test and run workflows.</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) +sample data required to quickly test and run workflows.</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) BiocManager::install(&quot;systemPipeR&quot;) BiocManager::install(&quot;systemPipeRdata&quot;) -</code></pre> -<p>Please note that if you desire to use a third-party command-line tool, the particular +</code></pre> +<p>Please note that if you desire to use a third-party command-line tool, the particular tool and dependencies need to be installed and exported in your PATH. -See <a href="#tools">details</a>.</p> -<h3 id="loading-package-and-documentation">Loading package and documentation</h3> -<pre><code class="language-r">library(&quot;systemPipeR&quot;) # Loads the package -library(help = &quot;systemPipeR&quot;) # Lists package info -vignette(&quot;systemPipeR&quot;) # Opens vignette -</code></pre> -<h3 id="how-to-get-help-for-systempiper">How to get help for systemPipeR</h3> -<p>All questions about the package or any particular function should be posted to -the Bioconductor support site <a href="https://support.bioconductor.org">https://support.bioconductor.org</a>.</p> -<p>Please add the “<em><code>systemPipeR</code></em>” tag to your question, and the package authors will -automatically receive an alert.</p> -<p>We appreciate receiving reports of bugs in the functions or documentation and +See <a href="https://systempipe.org/sp/spr/sprinstall/">details</a>.</p> +<h3 id="loading-package-and-documentation">Loading package and documentation</h3> +<pre><code class="language-r">library(&quot;systemPipeR&quot;) # Loads the package +library(help = &quot;systemPipeR&quot;) # Lists package info +vignette(&quot;systemPipeR&quot;) # Opens vignette +</code></pre> +<h3 id="how-to-get-help-for-systempiper">How to get help for systemPipeR</h3> +<p>All questions about the package or any particular function should be posted to +the Bioconductor support site <a href="https://support.bioconductor.org">https://support.bioconductor.org</a>.</p> +<p>Please add the “<em><code>systemPipeR</code></em>” tag to your question, and the package authors will +automatically receive an alert.</p> +<p>We appreciate receiving reports of bugs in the functions or documentation and suggestions for improvement. For that, please consider opening an issue at -<a href="https://github.com/tgirke/systemPipeR/issues/new">GitHub</a>.</p> -<h2 id="project-structure">Project structure</h2> -<p><em><code>systemPipeR</code></em> expects a project directory structure that consists of a directory +<a href="https://github.com/tgirke/systemPipeR/issues/new">GitHub</a>.</p> +<h2 id="project-structure">Project structure</h2> +<p><em><code>systemPipeR</code></em> expects a project directory structure that consists of a directory where users may store all the raw data, the results directory that will be reserved -for all the outfiles files or new output folders, and the parameters directory.</p> -<p>This structure allows reproducibility and collaboration across the data science +for all the outfiles files or new output folders, and the parameters directory.</p> +<p>This structure allows reproducibility and collaboration across the data science team since internally relative paths are used. Users could transfer this project to a different location and still be able to run the entire workflow. Also, it increases efficiency and data management once the raw data is kept in a separate -folder and avoids duplication.</p> -<h3 id="directory-structure">Directory Structure</h3> -<p><a href="http://bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html"><em><code>systemPipeRdata</code></em></a>, +folder and avoids duplication.</p> +<h3 id="directory-structure">Directory Structure</h3> +<p><a href="http://bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html"><em><code>systemPipeRdata</code></em></a>, helper package, provides pre-configured workflows, reporting templates, and sample data loaded as demonstrated below. With a single command, the package allows creating the workflow environment containing the structure -described here (see Figure <a href="#fig:dir">1</a>).</p> -<p>Directory names are indicated in <span style="color:grey"><em><strong>green</strong></em></span>. +described here (see Figure <a href="#fig:dir">1</a>).</p> +<p>Directory names are indicated in <span style="color:grey"><em><strong>green</strong></em></span>. Users can change this structure as needed, but need to adjust the code in their -workflows accordingly.</p> -<ul> -<li><span style="color:green"><em><strong>workflow/</strong></em></span> (<em>e.g.</em> <em>myproject/</em>) -<ul> -<li>This is the root directory of the R session running the workflow.</li> -<li>Run script ( <em>*.Rmd</em>) and sample annotation (<em>targets.txt</em>) files are located here.</li> -<li>Note, this directory can have any name (<em>e.g.</em> <span style="color:green"><em><strong>myproject</strong></em></span>). Changing its name does not require any modifications in the run script(s).</li> -<li><strong>Important subdirectories</strong>: -<ul> -<li><span style="color:green"><em><strong>param/</strong></em></span> -<ul> -<li><span style="color:green"><em><strong>param/cwl/</strong></em></span>: This subdirectory stores all the parameter and configuration files. To organize workflows, each can have its own subdirectory, where all <code>*.cwl</code> and <code>*input.yml</code> files need to be in the same subdirectory.</li> -</ul> -</li> -<li><span style="color:green"><em><strong>data/</strong></em> </span> -<ul> -<li>Raw data (<em>e.g.</em> FASTQ files)</li> -<li>FASTA file of reference (<em>e.g.</em> reference genome)</li> -<li>Annotation files</li> -<li>Metadata</li> -<li>etc.</li> -</ul> -</li> -<li><span style="color:green"><em><strong>results/</strong></em></span> -<ul> -<li>Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files</li> -<li>Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.</li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -</ul> -<div class="figure" style="text-align: center"> -<p><img src="spr_project.png" alt="*systemPipeR's* preconfigured directory structure." width="100%" /></p> -<p class="caption"> -Figure 1: *systemPipeR’s* preconfigured directory structure. -</p> -</div> -<p>The following parameter files are included in each workflow template:</p> -<ol> -<li><em><code>targets.txt</code></em>: initial one provided by user; downstream <em><code>targets_*.txt</code></em> files are generated automatically</li> -<li><em><code>*.param/cwl</code></em>: defines parameter for input/output file operations, <em>e.g.</em>: -<ul> -<li><em><code>hisat2/hisat2-mapping-se.cwl</code></em></li> -<li><em><code>hisat2/hisat2-mapping-se.yml</code></em></li> -</ul> -</li> -<li><em><code>*_run.sh</code></em>: optional bash scripts</li> -<li>Configuration files for computer cluster environments (skip on single machines): -<ul> -<li><em><code>.batchtools.conf.R</code></em>: defines the type of scheduler for <em><code>batchtools</code></em> pointing to template file of cluster, and located in user’s home directory</li> -<li><em><code>batchtools.*.tmpl</code></em>: specifies parameters of scheduler used by a system, <em>e.g.</em> Torque, SGE, Slurm, etc.</li> -</ul> -</li> -</ol> -<h3 id="structure-of-initial-targets-file">Structure of initial <em><code>targets</code></em> file</h3> -<p>The <em><code>targets</code></em> file defines all input files (<em>e.g.</em> FASTQ, BAM, BCF) and sample +workflows accordingly.</p> +<ul> +<li><span style="color:green"><em><strong>workflow/</strong></em></span> (<em>e.g.</em> <em>myproject/</em>) +<ul> +<li>This is the root directory of the R session running the workflow.</li> +<li>Run script ( <em>*.Rmd</em>) and sample annotation (<em>targets.txt</em>) files are located here.</li> +<li>Note, this directory can have any name (<em>e.g.</em> <span style="color:green"><em><strong>myproject</strong></em></span>). Changing its name does not require any modifications in the run script(s).</li> +<li><strong>Important subdirectories</strong>: +<ul> +<li><span style="color:green"><em><strong>param/</strong></em></span> +<ul> +<li><span style="color:green"><em><strong>param/cwl/</strong></em></span>: This subdirectory stores all the parameter and configuration files. To organize workflows, each can have its own subdirectory, where all <code>*.cwl</code> and <code>*input.yml</code> files need to be in the same subdirectory.</li> +</ul> +</li> +<li><span style="color:green"><em><strong>data/</strong></em> </span> +<ul> +<li>Raw data (<em>e.g.</em> FASTQ files)</li> +<li>FASTA file of reference (<em>e.g.</em> reference genome)</li> +<li>Annotation files</li> +<li>Metadata</li> +<li>etc.</li> +</ul> +</li> +<li><span style="color:green"><em><strong>results/</strong></em></span> +<ul> +<li>Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files</li> +<li>Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.</li> +</ul> +</li> +</ul> +</li> +</ul> +</li> +</ul> +<div class="figure" style="text-align: center"> +<p><img src="spr_project.png" alt="systemPipeR's preconfigured directory structure." width="100%" /></p> +<p class="caption"> +Figure 1: systemPipeR’s preconfigured directory structure. +</p> +</div> +<p>The following parameter files are included in each workflow template:</p> +<ol> +<li><em><code>targets.txt</code></em>: initial one provided by user; downstream <em><code>targets_*.txt</code></em> files are generated automatically</li> +<li><em><code>*.param/cwl</code></em>: defines parameter for input/output file operations, <em>e.g.</em>: +<ul> +<li><em><code>hisat2/hisat2-mapping-se.cwl</code></em></li> +<li><em><code>hisat2/hisat2-mapping-se.yml</code></em></li> +</ul> +</li> +<li><em><code>*_run.sh</code></em>: optional bash scripts</li> +<li>Configuration files for computer cluster environments (skip on single machines): +<ul> +<li><em><code>.batchtools.conf.R</code></em>: defines the type of scheduler for <em><code>batchtools</code></em> pointing to template file of cluster, and located in user’s home directory</li> +<li><em><code>batchtools.*.tmpl</code></em>: specifies parameters of scheduler used by a system, <em>e.g.</em> Torque, SGE, Slurm, etc.</li> +</ul> +</li> +</ol> +<h3 id="structure-of-initial-targets-file">Structure of initial <em><code>targets</code></em> file</h3> +<p>The <em><code>targets</code></em> file defines all input files (<em>e.g.</em> FASTQ, BAM, BCF) and sample comparisons of an analysis workflow. The following shows the format of a sample -<em><code>targets</code></em> file included in the package. It also can be viewed and downloaded -from <em><code>systemPipeR</code></em>’s GitHub repository <a href="https://github.com/tgirke/systemPipeR/blob/master/inst/extdata/targets.txt">here</a>. +<em><code>targets</code></em> file included in the package. It also can be viewed and downloaded +from <em><code>systemPipeR</code></em>’s GitHub repository <a href="https://github.com/tgirke/systemPipeR/blob/master/inst/extdata/targets.txt">here</a>. In a target file with a single type of input files, here FASTQ files of single-end (SE) reads, the first column describe the path and the second column -represents a unique id name for each sample. The third column called <code>Factor</code> +represents a unique id name for each sample. The third column called <code>Factor</code> represents the biological replicates. All subsequent columns are additional -information, and any number of extra columns can be added as needed.</p> -<p>Users should note here, the usage of targets files is optional when using -<em><code>systemPipeR's</code></em> new workflow management interface. They can be replaced by a standard YAML +information, and any number of extra columns can be added as needed.</p> +<p>Users should note here, the usage of targets files is optional when using +<em><code>systemPipeR's</code></em> new workflow management interface. They can be replaced by a standard YAML input file used by CWL. Since for organizing experimental variables targets files are extremely useful and user-friendly. Thus, we encourage users to keep using -them.</p> -<h4 id="structure-of-targets-file-for-single-end-se-samples">Structure of <em><code>targets</code></em> file for single-end (SE) samples</h4> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) +them.</p> +<h4 id="structure-of-targets-file-for-single-end-se-samples">Structure of <em><code>targets</code></em> file for single-end (SE) samples</h4> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) showDF(read.delim(targetspath, comment.char = &quot;#&quot;)) -</code></pre> -<div id="htmlwidget-1" style="width:100%;height:auto;" class="datatables html-widget"></div> -<script type="application/json" data-for="htmlwidget-1">{"x":{"filter":"none","extensions":["FixedColumns","Scroller"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"],["./data/SRR446027_1.fastq.gz","./data/SRR446028_1.fastq.gz","./data/SRR446029_1.fastq.gz","./data/SRR446030_1.fastq.gz","./data/SRR446031_1.fastq.gz","./data/SRR446032_1.fastq.gz","./data/SRR446033_1.fastq.gz","./data/SRR446034_1.fastq.gz","./data/SRR446035_1.fastq.gz","./data/SRR446036_1.fastq.gz","./data/SRR446037_1.fastq.gz","./data/SRR446038_1.fastq.gz","./data/SRR446039_1.fastq.gz","./data/SRR446040_1.fastq.gz","./data/SRR446041_1.fastq.gz","./data/SRR446042_1.fastq.gz","./data/SRR446043_1.fastq.gz","./data/SRR446044_1.fastq.gz"],["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],["M1","M1","A1","A1","V1","V1","M6","M6","A6","A6","V6","V6","M12","M12","A12","A12","V12","V12"],["Mock.1h.A","Mock.1h.B","Avr.1h.A","Avr.1h.B","Vir.1h.A","Vir.1h.B","Mock.6h.A","Mock.6h.B","Avr.6h.A","Avr.6h.B","Vir.6h.A","Vir.6h.B","Mock.12h.A","Mock.12h.B","Avr.12h.A","Avr.12h.B","Vir.12h.A","Vir.12h.B"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],["23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>FileName<\/th>\n <th>SampleName<\/th>\n <th>Factor<\/th>\n <th>SampleLong<\/th>\n <th>Experiment<\/th>\n <th>Date<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":5},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> -<p>To work with custom data, users need to generate a <em><code>targets</code></em> file containing -the paths to their own FASTQ files and then provide under <em><code>targetspath</code></em> the -path to the corresponding <em><code>targets</code></em> file.</p> -<h4 id="structure-of-targets-file-for-paired-end-pe-samples">Structure of <em><code>targets</code></em> file for paired-end (PE) samples</h4> -<p>For paired-end (PE) samples, the structure of the targets file is similar, where -users need to provide two FASTQ path columns: <em><code>FileName1</code></em> and <em><code>FileName2</code></em> -with the paths to the PE FASTQ files.</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<pre><code>## Loading required namespace: DT +</code></pre> +<div id="htmlwidget-1" style="width:100%;height:auto;" class="datatables html-widget"></div> +<script type="application/json" data-for="htmlwidget-1">{"x":{"filter":"none","vertical":false,"extensions":["FixedColumns","Scroller"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"],["./data/SRR446027_1.fastq.gz","./data/SRR446028_1.fastq.gz","./data/SRR446029_1.fastq.gz","./data/SRR446030_1.fastq.gz","./data/SRR446031_1.fastq.gz","./data/SRR446032_1.fastq.gz","./data/SRR446033_1.fastq.gz","./data/SRR446034_1.fastq.gz","./data/SRR446035_1.fastq.gz","./data/SRR446036_1.fastq.gz","./data/SRR446037_1.fastq.gz","./data/SRR446038_1.fastq.gz","./data/SRR446039_1.fastq.gz","./data/SRR446040_1.fastq.gz","./data/SRR446041_1.fastq.gz","./data/SRR446042_1.fastq.gz","./data/SRR446043_1.fastq.gz","./data/SRR446044_1.fastq.gz"],["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],["M1","M1","A1","A1","V1","V1","M6","M6","A6","A6","V6","V6","M12","M12","A12","A12","V12","V12"],["Mock.1h.A","Mock.1h.B","Avr.1h.A","Avr.1h.B","Vir.1h.A","Vir.1h.B","Mock.6h.A","Mock.6h.B","Avr.6h.A","Avr.6h.B","Vir.6h.A","Vir.6h.B","Mock.12h.A","Mock.12h.B","Avr.12h.A","Avr.12h.B","Vir.12h.A","Vir.12h.B"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],["23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>FileName<\/th>\n <th>SampleName<\/th>\n <th>Factor<\/th>\n <th>SampleLong<\/th>\n <th>Experiment<\/th>\n <th>Date<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":5},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> +<p>To work with custom data, users need to generate a <em><code>targets</code></em> file containing +the paths to their own FASTQ files and then provide under <em><code>targetspath</code></em> the +path to the corresponding <em><code>targets</code></em> file.</p> +<h4 id="structure-of-targets-file-for-paired-end-pe-samples">Structure of <em><code>targets</code></em> file for paired-end (PE) samples</h4> +<p>For paired-end (PE) samples, the structure of the targets file is similar, where +users need to provide two FASTQ path columns: <em><code>FileName1</code></em> and <em><code>FileName2</code></em> +with the paths to the PE FASTQ files.</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) showDF(read.delim(targetspath, comment.char = &quot;#&quot;)) -</code></pre> -<div id="htmlwidget-2" style="width:100%;height:auto;" class="datatables html-widget"></div> -<script type="application/json" data-for="htmlwidget-2">{"x":{"filter":"none","extensions":["FixedColumns","Scroller"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"],["./data/SRR446027_1.fastq.gz","./data/SRR446028_1.fastq.gz","./data/SRR446029_1.fastq.gz","./data/SRR446030_1.fastq.gz","./data/SRR446031_1.fastq.gz","./data/SRR446032_1.fastq.gz","./data/SRR446033_1.fastq.gz","./data/SRR446034_1.fastq.gz","./data/SRR446035_1.fastq.gz","./data/SRR446036_1.fastq.gz","./data/SRR446037_1.fastq.gz","./data/SRR446038_1.fastq.gz","./data/SRR446039_1.fastq.gz","./data/SRR446040_1.fastq.gz","./data/SRR446041_1.fastq.gz","./data/SRR446042_1.fastq.gz","./data/SRR446043_1.fastq.gz","./data/SRR446044_1.fastq.gz"],["./data/SRR446027_2.fastq.gz","./data/SRR446028_2.fastq.gz","./data/SRR446029_2.fastq.gz","./data/SRR446030_2.fastq.gz","./data/SRR446031_2.fastq.gz","./data/SRR446032_2.fastq.gz","./data/SRR446033_2.fastq.gz","./data/SRR446034_2.fastq.gz","./data/SRR446035_2.fastq.gz","./data/SRR446036_2.fastq.gz","./data/SRR446037_2.fastq.gz","./data/SRR446038_2.fastq.gz","./data/SRR446039_2.fastq.gz","./data/SRR446040_2.fastq.gz","./data/SRR446041_2.fastq.gz","./data/SRR446042_2.fastq.gz","./data/SRR446043_2.fastq.gz","./data/SRR446044_2.fastq.gz"],["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],["M1","M1","A1","A1","V1","V1","M6","M6","A6","A6","V6","V6","M12","M12","A12","A12","V12","V12"],["Mock.1h.A","Mock.1h.B","Avr.1h.A","Avr.1h.B","Vir.1h.A","Vir.1h.B","Mock.6h.A","Mock.6h.B","Avr.6h.A","Avr.6h.B","Vir.6h.A","Vir.6h.B","Mock.12h.A","Mock.12h.B","Avr.12h.A","Avr.12h.B","Vir.12h.A","Vir.12h.B"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],["23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>FileName1<\/th>\n <th>FileName2<\/th>\n <th>SampleName<\/th>\n <th>Factor<\/th>\n <th>SampleLong<\/th>\n <th>Experiment<\/th>\n <th>Date<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":6},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> -<h4 id="structure-of-targets-file-for-hello-world-example">Structure of <em><code>targets</code></em> file for “Hello World” example</h4> -<p>In this example, <em><code>targets</code></em> file presents only two columns, which the first one -are the different phrases used by the <code>echo</code> command-line and the second column -it is the sample <code>id</code>. The <code>id</code> column is required, and each sample id should be unique.</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/example/targets_example.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<div id="htmlwidget-2" style="width:100%;height:auto;" class="datatables html-widget"></div> +<script type="application/json" data-for="htmlwidget-2">{"x":{"filter":"none","vertical":false,"extensions":["FixedColumns","Scroller"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"],["./data/SRR446027_1.fastq.gz","./data/SRR446028_1.fastq.gz","./data/SRR446029_1.fastq.gz","./data/SRR446030_1.fastq.gz","./data/SRR446031_1.fastq.gz","./data/SRR446032_1.fastq.gz","./data/SRR446033_1.fastq.gz","./data/SRR446034_1.fastq.gz","./data/SRR446035_1.fastq.gz","./data/SRR446036_1.fastq.gz","./data/SRR446037_1.fastq.gz","./data/SRR446038_1.fastq.gz","./data/SRR446039_1.fastq.gz","./data/SRR446040_1.fastq.gz","./data/SRR446041_1.fastq.gz","./data/SRR446042_1.fastq.gz","./data/SRR446043_1.fastq.gz","./data/SRR446044_1.fastq.gz"],["./data/SRR446027_2.fastq.gz","./data/SRR446028_2.fastq.gz","./data/SRR446029_2.fastq.gz","./data/SRR446030_2.fastq.gz","./data/SRR446031_2.fastq.gz","./data/SRR446032_2.fastq.gz","./data/SRR446033_2.fastq.gz","./data/SRR446034_2.fastq.gz","./data/SRR446035_2.fastq.gz","./data/SRR446036_2.fastq.gz","./data/SRR446037_2.fastq.gz","./data/SRR446038_2.fastq.gz","./data/SRR446039_2.fastq.gz","./data/SRR446040_2.fastq.gz","./data/SRR446041_2.fastq.gz","./data/SRR446042_2.fastq.gz","./data/SRR446043_2.fastq.gz","./data/SRR446044_2.fastq.gz"],["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],["M1","M1","A1","A1","V1","V1","M6","M6","A6","A6","V6","V6","M12","M12","A12","A12","V12","V12"],["Mock.1h.A","Mock.1h.B","Avr.1h.A","Avr.1h.B","Vir.1h.A","Vir.1h.B","Mock.6h.A","Mock.6h.B","Avr.6h.A","Avr.6h.B","Vir.6h.A","Vir.6h.B","Mock.12h.A","Mock.12h.B","Avr.12h.A","Avr.12h.B","Vir.12h.A","Vir.12h.B"],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],["23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012","23-Mar-2012"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>FileName1<\/th>\n <th>FileName2<\/th>\n <th>SampleName<\/th>\n <th>Factor<\/th>\n <th>SampleLong<\/th>\n <th>Experiment<\/th>\n <th>Date<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":6},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> +<h4 id="structure-of-targets-file-for-hello-world-example">Structure of <em><code>targets</code></em> file for “Hello World” example</h4> +<p>In this example, <em><code>targets</code></em> file presents only two columns, which the first one +are the different phrases used by the <code>echo</code> command-line and the second column +it is the sample <code>id</code>. The <code>id</code> column is required, and each sample id should be unique.</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/example/targets_example.txt&quot;, package = &quot;systemPipeR&quot;) showDF(read.delim(targetspath, comment.char = &quot;#&quot;)) -</code></pre> -<div id="htmlwidget-3" style="width:100%;height:auto;" class="datatables html-widget"></div> -<script type="application/json" data-for="htmlwidget-3">{"x":{"filter":"none","extensions":["FixedColumns","Scroller"],"data":[["1","2","3"],["Hello World!","Hello USA!","Hello Bioconductor!"],["M1","M2","M3"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>Message<\/th>\n <th>SampleName<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"order":[],"autoWidth":false,"orderClasses":false,"columnDefs":[{"orderable":false,"targets":0}]}},"evals":[],"jsHooks":[]}</script> -<h4 id="sample-comparisons">Sample comparisons</h4> -<p>Sample comparisons are defined in the header lines of the <em><code>targets</code></em> file -starting with ‘<code># &lt;CMP&gt;</code>.’</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<div id="htmlwidget-3" style="width:100%;height:auto;" class="datatables html-widget"></div> +<script type="application/json" data-for="htmlwidget-3">{"x":{"filter":"none","vertical":false,"extensions":["FixedColumns","Scroller"],"data":[["1","2","3"],["Hello World!","Hello USA!","Hello Bioconductor!"],["M1","M2","M3"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>Message<\/th>\n <th>SampleName<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"order":[],"autoWidth":false,"orderClasses":false,"columnDefs":[{"orderable":false,"targets":0}]}},"evals":[],"jsHooks":[]}</script> +<h4 id="sample-comparisons">Sample comparisons</h4> +<p>Sample comparisons are defined in the header lines of the <em><code>targets</code></em> file +starting with ‘<code># &lt;CMP&gt;</code>.’</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) readLines(targetspath)[1:4] -</code></pre> -<pre><code>## [1] &quot;# Project ID: Arabidopsis - Pseudomonas alternative splicing study (SRA: SRP010938; PMID: 24098335)&quot; -## [2] &quot;# The following line(s) allow to specify the contrasts needed for comparative analyses, such as DEG identification. All possible comparisons can be specified with 'CMPset: ALL'.&quot; -## [3] &quot;# &lt;CMP&gt; CMPset1: M1-A1, M1-V1, A1-V1, M6-A6, M6-V6, A6-V6, M12-A12, M12-V12, A12-V12&quot; +</code></pre> +<pre><code>## [1] &quot;# Project ID: Arabidopsis - Pseudomonas alternative splicing study (SRA: SRP010938; PMID: 24098335)&quot; +## [2] &quot;# The following line(s) allow to specify the contrasts needed for comparative analyses, such as DEG identification. All possible comparisons can be specified with 'CMPset: ALL'.&quot; +## [3] &quot;# &lt;CMP&gt; CMPset1: M1-A1, M1-V1, A1-V1, M6-A6, M6-V6, A6-V6, M12-A12, M12-V12, A12-V12&quot; ## [4] &quot;# &lt;CMP&gt; CMPset2: ALL&quot; -</code></pre> -<p>The function <em><code>readComp</code></em> imports the comparison information and stores it in a -<em><code>list</code></em>. Alternatively, <em><code>readComp</code></em> can obtain the comparison information from -the corresponding <em><code>SYSargsList</code></em> step (see below). Note, these header lines are +</code></pre> +<p>The function <em><code>readComp</code></em> imports the comparison information and stores it in a +<em><code>list</code></em>. Alternatively, <em><code>readComp</code></em> can obtain the comparison information from +the corresponding <em><code>SYSargsList</code></em> step (see below). Note, these header lines are optional. They are mainly useful for controlling comparative analyses according to certain biological expectations, such as identifying differentially expressed -genes in RNA-Seq experiments based on simple pair-wise comparisons.</p> -<pre><code class="language-r">readComp(file = targetspath, format = &quot;vector&quot;, delim = &quot;-&quot;) -</code></pre> -<pre><code>## $CMPset1 -## [1] &quot;M1-A1&quot; &quot;M1-V1&quot; &quot;A1-V1&quot; &quot;M6-A6&quot; &quot;M6-V6&quot; &quot;A6-V6&quot; &quot;M12-A12&quot; +genes in RNA-Seq experiments based on simple pair-wise comparisons.</p> +<pre><code class="language-r">readComp(file = targetspath, format = &quot;vector&quot;, delim = &quot;-&quot;) +</code></pre> +<pre><code>## $CMPset1 +## [1] &quot;M1-A1&quot; &quot;M1-V1&quot; &quot;A1-V1&quot; &quot;M6-A6&quot; &quot;M6-V6&quot; &quot;A6-V6&quot; &quot;M12-A12&quot; ## [8] &quot;M12-V12&quot; &quot;A12-V12&quot; -## +## ## $CMPset2 -## [1] &quot;M1-A1&quot; &quot;M1-V1&quot; &quot;M1-M6&quot; &quot;M1-A6&quot; &quot;M1-V6&quot; &quot;M1-M12&quot; &quot;M1-A12&quot; -## [8] &quot;M1-V12&quot; &quot;A1-V1&quot; &quot;A1-M6&quot; &quot;A1-A6&quot; &quot;A1-V6&quot; &quot;A1-M12&quot; &quot;A1-A12&quot; -## [15] &quot;A1-V12&quot; &quot;V1-M6&quot; &quot;V1-A6&quot; &quot;V1-V6&quot; &quot;V1-M12&quot; &quot;V1-A12&quot; &quot;V1-V12&quot; -## [22] &quot;M6-A6&quot; &quot;M6-V6&quot; &quot;M6-M12&quot; &quot;M6-A12&quot; &quot;M6-V12&quot; &quot;A6-V6&quot; &quot;A6-M12&quot; -## [29] &quot;A6-A12&quot; &quot;A6-V12&quot; &quot;V6-M12&quot; &quot;V6-A12&quot; &quot;V6-V12&quot; &quot;M12-A12&quot; &quot;M12-V12&quot; +## [1] &quot;M1-A1&quot; &quot;M1-V1&quot; &quot;M1-M6&quot; &quot;M1-A6&quot; &quot;M1-V6&quot; &quot;M1-M12&quot; &quot;M1-A12&quot; +## [8] &quot;M1-V12&quot; &quot;A1-V1&quot; &quot;A1-M6&quot; &quot;A1-A6&quot; &quot;A1-V6&quot; &quot;A1-M12&quot; &quot;A1-A12&quot; +## [15] &quot;A1-V12&quot; &quot;V1-M6&quot; &quot;V1-A6&quot; &quot;V1-V6&quot; &quot;V1-M12&quot; &quot;V1-A12&quot; &quot;V1-V12&quot; +## [22] &quot;M6-A6&quot; &quot;M6-V6&quot; &quot;M6-M12&quot; &quot;M6-A12&quot; &quot;M6-V12&quot; &quot;A6-V6&quot; &quot;A6-M12&quot; +## [29] &quot;A6-A12&quot; &quot;A6-V12&quot; &quot;V6-M12&quot; &quot;V6-A12&quot; &quot;V6-V12&quot; &quot;M12-A12&quot; &quot;M12-V12&quot; ## [36] &quot;A12-V12&quot; -</code></pre> -<h3 id="downstream-targets-files-description">Downstream targets files description</h3> -<p>After the step which required the initial targets file information, the downstream -targets files are created automatically (see Figure <a href="#fig:targetsFig">2</a>). +</code></pre> +<h3 id="downstream-targets-files-description">Downstream targets files description</h3> +<p>After the step which required the initial targets file information, the downstream +targets files are created automatically (see Figure <a href="#fig:targetsFig">2</a>). Each step that uses the previous step outfiles as an input, the new targets input will be managed internally by the workflow instances, establishing connectivity among the steps in the workflow. -<em><code>systemPipeR</code></em> provides features to automatically and systematically build this +<em><code>systemPipeR</code></em> provides features to automatically and systematically build this connection, providing security that all the samples will be managed efficiently -and reproducibly.</p> -<div class="figure" style="text-align: center"> -<p><img src="targets_con.png" alt="_`systemPipeR`_ automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. _`systemPipeR`_ (C) manages this connectivity among the steps automatically for the users." width="100%" /></p> -<p class="caption"> -Figure 2: *`systemPipeR`* automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. *`systemPipeR`* (C) manages this connectivity among the steps automatically for the users. -</p> -</div> -<h2 id="structure-of-the-new-parameters-files">Structure of the new parameters files</h2> -<p>The parameters and configuration required for running command-line software are -provided by the widely used community standard <a href="https://www.commonwl.org/">Common Workflow Language</a> (CWL) -(Amstutz et al. 2016), which describes parameters analysis workflows in a generic -and reproducible manner. For R-based workflow steps, param files are not required. -For a complete overview of the CWL syntax, please see the <a href="#cwl">section</a> below. -Also, we have a dedicated section explain how to <em><code>systemPipeR</code></em> establish the -connection between the CWL parameters files and the targets files. Please see <a href="#cwl_targets">here</a>.</p> -<h2 id="references">References</h2> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-Amstutz2016-ka" class="csl-entry"> -<p>Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. <a href="https://doi.org/10.6084/m9.figshare.3115156.v2">https://doi.org/10.6084/m9.figshare.3115156.v2</a>.</p> -</div> -</div>Sp: How to run a Workflow/sp/spr/spr_run/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/spr_run/ -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<link href="../../rmarkdown-libs/plotwf/plotwf.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/plotwf/viz.js"></script> -<script src="../../rmarkdown-libs/plotwf/full.render.js"></script> -<script src="../../rmarkdown-libs/plotwf-binding/plotwf.js"></script> +and reproducibly.</p> +<div class="figure" style="text-align: center"> +<p><img src="targets_con.png" alt="_systemPipeR_ automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. _`systemPipeR`_ (C) manages this connectivity among the steps automatically for the users." width="100%" /></p> +<p class="caption"> +Figure 2: *systemPipeR* automatically creates the downstream `targets` files based on the previous steps outfiles. A) Usually, users provide the initial `targets` files, and this step will generate some outfiles, as demonstrated on B. Then, those files are used to build the new `targets` files as inputs in the next step. *`systemPipeR`* (C) manages this connectivity among the steps automatically for the users. +</p> +</div> +<h2 id="structure-of-the-new-parameters-files">Structure of the new parameters files</h2> +<p>The parameters and configuration required for running command-line software are +provided by the widely used community standard <a href="https://www.commonwl.org/">Common Workflow Language</a> (CWL) (Amstutz et al. 2016), which describes +parameters analysis workflows in a generic and reproducible manner. +For R-based workflow steps, param files are not required. +For a complete overview of the CWL syntax, please see this <a href="https://systempipe.org/sp/spr/cwl_syntax/">section</a>. +Also, we have a dedicated section explain how to <em><code>systemPipeR</code></em> establish the +connection between the CWL parameters files and the targets files. Please see <a href="https://systempipe.org/sp/spr/cwl_and_spr">here</a>.</p> +<h2 id="references">References</h2> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-Amstutz2016-ka" class="csl-entry"> +<p>Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. <a href="https://doi.org/10.6084/m9.figshare.3115156.v2">https://doi.org/10.6084/m9.figshare.3115156.v2</a>.</p> +</div> +</div> + + + + + + Sp: How to run a Workflow + /sp/spr/spr_run/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/spr_run/ + + + + <script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<link href="../../rmarkdown-libs/plotwf/plotwf.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/plotwf/viz.js"></script> +<script src="../../rmarkdown-libs/plotwf/full.render.js"></script> +<script src="../../rmarkdown-libs/plotwf-binding/plotwf.js"></script> <!-- - Compile from command-line -Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h1 id="project-initialization">Project initialization</h1> -<p>To create a Workflow within <em><code>systemPipeR</code></em>, we can start by defining an empty -container and checking the directory structure:</p> -<pre><code class="language-r">sal &lt;- SPRproject(projPath = tempdir()) -</code></pre> -<pre><code>## Creating directory: /tmp/RtmpzxxPO5/data -## Creating directory: /tmp/RtmpzxxPO5/param -## Creating directory: /tmp/RtmpzxxPO5/results -## Creating directory '/tmp/RtmpzxxPO5/.SPRproject' -## Creating file '/tmp/RtmpzxxPO5/.SPRproject/SYSargsList.yml' +</script> +<h1 id="project-initialization">Project initialization</h1> +<p>To create a Workflow within <em><code>systemPipeR</code></em>, we can start by defining an empty +container and checking the directory structure:</p> +<pre><code class="language-r">sal &lt;- SPRproject(projPath = tempdir()) +</code></pre> +<pre><code>## Creating directory: /tmp/RtmpzxxPO5/data +## Creating directory: /tmp/RtmpzxxPO5/param +## Creating directory: /tmp/RtmpzxxPO5/results +## Creating directory '/tmp/RtmpzxxPO5/.SPRproject' +## Creating file '/tmp/RtmpzxxPO5/.SPRproject/SYSargsList.yml' + ## Your current working directory is different from the directory chosen for the Project Workflow. -## For accurate location of the files and running the Workflow, please set the working directory to -## 'setwd(/tmp/RtmpzxxPO5)' -</code></pre> -<p>Internally, <code>SPRproject</code> function will create a hidden folder called <code>.SPRproject</code>, +## For accurate location of the files and running the Workflow, please set the working directory to +## 'setwd(/tmp/RtmpzxxPO5)' +</code></pre> +<p>Internally, <code>SPRproject</code> function will create a hidden folder called <code>.SPRproject</code>, by default, to store all the log files. -A <code>YAML</code> file, here called <code>SYSargsList.yml</code>, has been created, which initially +A <code>YAML</code> file, here called <code>SYSargsList.yml</code>, has been created, which initially contains the basic location of the project structure; however, every time the -workflow object <code>sal</code> is updated in R, the new information will also be store in this +workflow object <code>sal</code> is updated in R, the new information will also be store in this flat-file database for easy recovery. -If you desire different names for the logs folder and the <code>YAML</code> file, these can -be modified as follows:</p> -<pre><code class="language-r">sal &lt;- SPRproject(logs.dir = &quot;.SPRproject&quot;, sys.file = &quot;.SPRproject/SYSargsList.yml&quot;) -</code></pre> -<p>Also, this function will check and/or create the basic folder structure if missing, -which means <code>data</code>, <code>param</code>, and <code>results</code> folder, as described <a href="#dir">here</a>. +If you desire different names for the logs folder and the <code>YAML</code> file, these can +be modified as follows:</p> +<pre><code class="language-r">sal &lt;- SPRproject(logs.dir = &quot;.SPRproject&quot;, sys.file = &quot;.SPRproject/SYSargsList.yml&quot;) +</code></pre> +<p>Also, this function will check and/or create the basic folder structure if missing, +which means <code>data</code>, <code>param</code>, and <code>results</code> folder, as described <a href="#dir">here</a>. If the user wants to use a different names for these directories, can be specified -as follows:</p> -<pre><code class="language-r">sal &lt;- SPRproject(data = &quot;data&quot;, param = &quot;param&quot;, results = &quot;results&quot;) -</code></pre> -<p>It is possible to separate all the R objects created within the workflow analysis -from the current environment. <code>SPRproject</code> function provides the option to create +as follows:</p> +<pre><code class="language-r">sal &lt;- SPRproject(data = &quot;data&quot;, param = &quot;param&quot;, results = &quot;results&quot;) +</code></pre> +<p>It is possible to separate all the R objects created within the workflow analysis +from the current environment. <code>SPRproject</code> function provides the option to create a new environment, and in this way, it is not overwriting any object you may want -to have at your current section.</p> -<pre><code class="language-r">sal &lt;- SPRproject(envir = new.env()) -</code></pre> -<p>In this stage, the object <code>sal</code> is a empty container, except for the project information. The project information can be accessed by the <code>projectInfo</code> method:</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## No workflow steps added -</code></pre> -<pre><code class="language-r">projectInfo(sal) -</code></pre> -<pre><code>## $project +to have at your current section.</p> +<pre><code class="language-r">sal &lt;- SPRproject(envir = new.env()) +</code></pre> +<p>In this stage, the object <code>sal</code> is a empty container, except for the project information. The project information can be accessed by the <code>projectInfo</code> method:</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## No workflow steps added +</code></pre> +<pre><code class="language-r">projectInfo(sal) +</code></pre> +<pre><code>## $project ## [1] &quot;/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr&quot; -## +## ## $data ## [1] &quot;data&quot; -## +## ## $param ## [1] &quot;param&quot; -## +## ## $results ## [1] &quot;results&quot; -## +## ## $logsDir ## [1] &quot;.SPRproject&quot; -## +## ## $sysargslist ## [1] &quot;.SPRproject/SYSargsList.yml&quot; -</code></pre> -<p>Also, the <code>length</code> function will return how many steps this workflow contains and -in this case it is empty, as follow:</p> -<pre><code class="language-r">length(sal) -</code></pre> -<pre><code>## [1] 0 -</code></pre> -<h1 id="workflow-design">Workflow Design</h1> -<p><em><code>systemPipeR</code></em> workflows can be designed and built from start to finish with a +</code></pre> +<p>Also, the <code>length</code> function will return how many steps this workflow contains and +in this case it is empty, as follow:</p> +<pre><code class="language-r">length(sal) +</code></pre> +<pre><code>## [1] 0 +</code></pre> +<h1 id="workflow-design">Workflow Design</h1> +<p><em><code>systemPipeR</code></em> workflows can be designed and built from start to finish with a single command, importing from an R Markdown file or stepwise in interactive mode from the R console. -In the <a href="#appendstep">next section</a>, we will demonstrate how to build the workflow in an -interactive mode, and in the <a href="#importWF">following section</a>, we will show how to build from a -file.</p> -<p>New workflows are constructed, or existing ones modified, by connecting each -step via <code>appendStep</code> method. Each <code>SYSargsList</code> instance contains instructions +In the <a href="#appendstep">next section</a>, we will demonstrate how to build the workflow in an +interactive mode, and in the <a href="#importWF">following section</a>, we will show how to build from a +file.</p> +<p>New workflows are constructed, or existing ones modified, by connecting each +step via <code>appendStep</code> method. Each <code>SYSargsList</code> instance contains instructions needed for processing a set of input files with a specific command-line or R software, as well as the paths to the corresponding outfiles generated by a -particular tool/step.</p> -<p>To build R code based step, the constructor function <code>Linewise</code> is used. -For more details about this S4 class container, see <a href="#linewise">here</a>.</p> -<h2 id="build-workflow-interactive">Build workflow interactive</h2> -<p>This tutorial shows a very simple example for describing and explaining all main +particular tool/step.</p> +<p>To build R code based step, the constructor function <code>Linewise</code> is used. +For more details about this S4 class container, see <a href="#linewise">here</a>.</p> +<h2 id="build-workflow-interactive">Build workflow interactive</h2> +<p>This tutorial shows a very simple example for describing and explaining all main features available within systemPipeR to design, build, manage, run, and visualize the workflow. In summary, we are exporting a dataset to multiple files, compressing and decompressing each one of the files, and importing to R, -and finally performing a statistical analysis.</p> -<p>In the previous section, we initialize the project by building the <code>sal</code> object. -Until this moment, the container has no steps:</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## No workflow steps added -</code></pre> -<p>Next, we need to populate the object created with the first step in the -workflow.</p> -<h3 id="adding-the-first-step">Adding the first step</h3> -<p>The first step is R code based, and we are splitting the <code>iris</code> dataset by <code>Species</code> -and for each <code>Species</code> will be saved on file. Please note that this code will -not be executed now; it is just store in the container for further execution.</p> -<p>This constructor function requires the <code>step_name</code> and the R-based code under -the <code>code</code> argument. -The R code should be enclosed by braces (<code>{}</code>) and separated by a new line.</p> -<pre><code class="language-r">appendStep(sal) &lt;- LineWise(code = { -mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, -paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +and finally performing a statistical analysis.</p> +<p>In the previous section, we initialize the project by building the <code>sal</code> object. +Until this moment, the container has no steps:</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## No workflow steps added +</code></pre> +<p>Next, we need to populate the object created with the first step in the +workflow.</p> +<h3 id="adding-the-first-step">Adding the first step</h3> +<p>The first step is R code based, and we are splitting the <code>iris</code> dataset by <code>Species</code> +and for each <code>Species</code> will be saved on file. Please note that this code will +not be executed now; it is just store in the container for further execution.</p> +<p>This constructor function requires the <code>step_name</code> and the R-based code under +the <code>code</code> argument. +The R code should be enclosed by braces (<code>{}</code>) and separated by a new line.</p> +<pre><code class="language-r">appendStep(sal) &lt;- LineWise(code = { + mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, + paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) }, step_name = &quot;export_iris&quot;) -</code></pre> -<p>For a brief overview of the workflow, we can check the object as follows:</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## -</code></pre> -<p>Also, for printing and double-check the R code in the step, we can use the -<code>codeLine</code> method:</p> -<pre><code class="language-r">codeLine(sal) -</code></pre> -<pre><code>## export_iris -## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) -</code></pre> -<h3 id="adding-more-steps">Adding more steps</h3> -<p>Next, an example of how to compress the exported files using -<a href="https://www.gnu.org/software/gzip/"><code>gzip</code></a> command-line.</p> -<p>The constructor function creates an <code>SYSargsList</code> S4 class object using data from -three input files:</p> -<pre><code>- CWL command-line specification file (`wf_file` argument); +</code></pre> +<p>For a brief overview of the workflow, we can check the object as follows:</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## +</code></pre> +<p>Also, for printing and double-check the R code in the step, we can use the +<code>codeLine</code> method:</p> +<pre><code class="language-r">codeLine(sal) +</code></pre> +<pre><code>## export_iris +## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +</code></pre> +<h3 id="adding-more-steps">Adding more steps</h3> +<p>Next, an example of how to compress the exported files using +<a href="https://www.gnu.org/software/gzip/"><code>gzip</code></a> command-line.</p> +<p>The constructor function creates an <code>SYSargsList</code> S4 class object using data from +three input files:</p> +<pre><code>- CWL command-line specification file (`wf_file` argument); - Input variables (`input_file` argument); - Targets file (`targets` argument). -</code></pre> -<p>In CWL, files with the extension <code>.cwl</code> define the parameters of a chosen -command-line step or workflow, while files with the extension <code>.yml</code> define the -input variables of command-line steps.</p> -<p>The <code>targets</code> file is optional for workflow steps lacking <code>input</code> files. The connection -between <code>input</code> variables and the <code>targets</code> file is defined under the <code>inputvars</code> -argument. It is required a <code>named vector</code>, where each element name needs to match -with column names in the <code>targets</code> file, and the value must match the names of -the <code>input</code> variables defined in the <code>*.yml</code> files (see Figure <a href="#fig:sprCWL"><strong>??</strong></a>).</p> -<p>A detailed description of the dynamic between <code>input</code> variables and <code>targets</code> -files can be found <a href="#cwl_targets">here</a>. -In addition, the CWL syntax overview can be found <a href="#cwl">here</a>.</p> -<p>Besides all the data form <code>targets</code>, <code>wf_file</code>, <code>input_file</code> and <code>dir_path</code> arguments, -<code>SYSargsList</code> constructor function options include:</p> -<ul> -<li><code>step_name</code>: a unique <em>name</em> for the step. This is not mandatory; however, -it is highly recommended. If no name is provided, a default <code>step_x</code>, where -<code>x</code> reflects the step index, will be added.</li> -<li><code>dir</code>: this option allows creating an exclusive subdirectory for the step +</code></pre> +<p>In CWL, files with the extension <code>.cwl</code> define the parameters of a chosen +command-line step or workflow, while files with the extension <code>.yml</code> define the +input variables of command-line steps.</p> +<p>The <code>targets</code> file is optional for workflow steps lacking <code>input</code> files. The connection +between <code>input</code> variables and the <code>targets</code> file is defined under the <code>inputvars</code> +argument. It is required a <code>named vector</code>, where each element name needs to match +with column names in the <code>targets</code> file, and the value must match the names of +the <code>input</code> variables defined in the <code>*.yml</code> files (see Figure <a href="#fig:sprCWL"><strong>??</strong></a>).</p> +<p>A detailed description of the dynamic between <code>input</code> variables and <code>targets</code> +files can be found <a href="#cwl_targets">here</a>. +In addition, the CWL syntax overview can be found <a href="#cwl">here</a>.</p> +<p>Besides all the data form <code>targets</code>, <code>wf_file</code>, <code>input_file</code> and <code>dir_path</code> arguments, +<code>SYSargsList</code> constructor function options include:</p> +<ul> +<li><code>step_name</code>: a unique <em>name</em> for the step. This is not mandatory; however, +it is highly recommended. If no name is provided, a default <code>step_x</code>, where +<code>x</code> reflects the step index, will be added.</li> +<li><code>dir</code>: this option allows creating an exclusive subdirectory for the step in the workflow. All the outfiles and log files for this particular step will -be generated in the respective folders.</li> -<li><code>dependency</code>: after the first step, all the additional steps appended to -the workflow require the information of the dependency tree.</li> -</ul> -<p>The <code>appendStep&lt;-</code> method is used to append a new step in the workflow.</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/gunzip&quot;, &quot;targets_gunzip.txt&quot;, package = &quot;systemPipeR&quot;) +be generated in the respective folders.</li> +<li><code>dependency</code>: after the first step, all the additional steps appended to +the workflow require the information of the dependency tree.</li> +</ul> +<p>The <code>appendStep&lt;-</code> method is used to append a new step in the workflow.</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/gunzip&quot;, &quot;targets_gunzip.txt&quot;, package = &quot;systemPipeR&quot;) appendStep(sal) &lt;- SYSargsList(step_name = &quot;gzip&quot;, targets = targetspath, dir = TRUE, -wf_file = &quot;gunzip/workflow_gzip.cwl&quot;, input_file = &quot;gunzip/gzip.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, -package = &quot;systemPipeR&quot;), inputvars = c(FileName = &quot;_FILE_PATH_&quot;, SampleName = &quot;_SampleName_&quot;), -dependency = &quot;export_iris&quot;) -</code></pre> -<p>Note: This will not work if the <code>gzip</code> is not available on your system -(installed and exported to PATH) and may only work on Windows systems using PowerShell.</p> -<p>For a overview of the workflow, we can check the object as follows:</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gzip -## cmdlist: 3 | Pending: 3 -## -</code></pre> -<p>Note that we have two steps, and it is expected three files from the second step. -Also, the workflow status is <em>Pending</em>, which means the workflow object is + wf_file = &quot;gunzip/workflow_gzip.cwl&quot;, input_file = &quot;gunzip/gzip.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, + package = &quot;systemPipeR&quot;), inputvars = c(FileName = &quot;_FILE_PATH_&quot;, SampleName = &quot;_SampleName_&quot;), + dependency = &quot;export_iris&quot;) +</code></pre> +<p>Note: This will not work if the <code>gzip</code> is not available on your system +(installed and exported to PATH) and may only work on Windows systems using PowerShell.</p> +<p>For a overview of the workflow, we can check the object as follows:</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gzip +## cmdlist: 3 | Pending: 3 +## +</code></pre> +<p>Note that we have two steps, and it is expected three files from the second step. +Also, the workflow status is <em>Pending</em>, which means the workflow object is rendered in R; however, we did not execute the workflow yet. -In addition to this summary, it can be observed this step has three command lines.</p> -<p>For more details about the command-line rendered for each target file, it can be -checked as follows:</p> -<pre><code class="language-r">cmdlist(sal, step = &quot;gzip&quot;) -</code></pre> -<pre><code>## $gzip +In addition to this summary, it can be observed this step has three command lines.</p> +<p>For more details about the command-line rendered for each target file, it can be +checked as follows:</p> +<pre><code class="language-r">cmdlist(sal, step = &quot;gzip&quot;) +</code></pre> +<pre><code>## $gzip ## $gzip$SE ## $gzip$SE$gzip -## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; -## -## +## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; +## +## ## $gzip$VE ## $gzip$VE$gzip -## [1] &quot;gzip -c results/versicolor.csv &gt; results/VE.csv.gz&quot; -## -## +## [1] &quot;gzip -c results/versicolor.csv &gt; results/VE.csv.gz&quot; +## +## ## $gzip$VI ## $gzip$VI$gzip -## [1] &quot;gzip -c results/virginica.csv &gt; results/VI.csv.gz&quot; -</code></pre> -<h4 id="using-the-outfiles-for-the-next-step">Using the <code>outfiles</code> for the next step</h4> -<p>For building this step, all the previous procedures are being used to append the +## [1] &quot;gzip -c results/virginica.csv &gt; results/VI.csv.gz&quot; +</code></pre> +<h4 id="using-the-outfiles-for-the-next-step">Using the <code>outfiles</code> for the next step</h4> +<p>For building this step, all the previous procedures are being used to append the next step. However, here, we can observe power features that build the -connectivity between steps in the workflow.</p> -<p>In this example, we would like to use the outfiles from <em>gzip</em> Step, as -input from the next step, which is the <em>gunzip</em>. In this case, let’s look at the -outfiles from the first step:</p> -<pre><code class="language-r">outfiles(sal) -</code></pre> -<pre><code>## $export_iris +connectivity between steps in the workflow.</p> +<p>In this example, we would like to use the outfiles from <em>gzip</em> Step, as +input from the next step, which is the <em>gunzip</em>. In this case, let’s look at the +outfiles from the first step:</p> +<pre><code class="language-r">outfiles(sal) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 0 rows and 0 columns -## +## ## $gzip ## DataFrame with 3 rows and 1 column -## gzip_file -## &lt;character&gt; +## gzip_file +## &lt;character&gt; ## 1 results/SE.csv.gz ## 2 results/VE.csv.gz ## 3 results/VI.csv.gz -</code></pre> -<p>The column we want to use is “gzip_file.” For the argument <code>targets</code> in the -<code>SYSargsList</code> function, it should provide the name of the correspondent step in -the Workflow and which <code>outfiles</code> you would like to be incorporated in the next +</code></pre> +<p>The column we want to use is “gzip_file.” For the argument <code>targets</code> in the +<code>SYSargsList</code> function, it should provide the name of the correspondent step in +the Workflow and which <code>outfiles</code> you would like to be incorporated in the next step. -The argument <code>inputvars</code> allows the connectivity between <code>outfiles</code> and the -new <code>targets</code> file. Here, the name of the previous <code>outfiles</code> should be provided -it. Please note that all <code>outfiles</code> column names must be unique.</p> -<p>It is possible to keep all the original columns from the <code>targets</code> files or remove -some columns for a clean <code>targets</code> file. -The argument <code>rm_targets_col</code> provides this flexibility, where it is possible to +The argument <code>inputvars</code> allows the connectivity between <code>outfiles</code> and the +new <code>targets</code> file. Here, the name of the previous <code>outfiles</code> should be provided +it. Please note that all <code>outfiles</code> column names must be unique.</p> +<p>It is possible to keep all the original columns from the <code>targets</code> files or remove +some columns for a clean <code>targets</code> file. +The argument <code>rm_targets_col</code> provides this flexibility, where it is possible to specify the names of the columns that should be removed. If no names are passing -here, the new columns will be appended.</p> -<pre><code class="language-r">appendStep(sal) &lt;- SYSargsList(step_name = &quot;gunzip&quot;, targets = &quot;gzip&quot;, dir = TRUE, -wf_file = &quot;gunzip/workflow_gunzip.cwl&quot;, input_file = &quot;gunzip/gunzip.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, -package = &quot;systemPipeR&quot;), inputvars = c(gzip_file = &quot;_FILE_PATH_&quot;, SampleName = &quot;_SampleName_&quot;), -rm_targets_col = &quot;FileName&quot;, dependency = &quot;gzip&quot;) -</code></pre> -<p>We can check the targets automatically create for this step, -based on the previous <code>outfiles</code>:</p> -<pre><code class="language-r">targetsWF(sal[3]) -</code></pre> -<pre><code>## $gunzip +here, the new columns will be appended.</p> +<pre><code class="language-r">appendStep(sal) &lt;- SYSargsList(step_name = &quot;gunzip&quot;, targets = &quot;gzip&quot;, dir = TRUE, + wf_file = &quot;gunzip/workflow_gunzip.cwl&quot;, input_file = &quot;gunzip/gunzip.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, + package = &quot;systemPipeR&quot;), inputvars = c(gzip_file = &quot;_FILE_PATH_&quot;, SampleName = &quot;_SampleName_&quot;), + rm_targets_col = &quot;FileName&quot;, dependency = &quot;gzip&quot;) +</code></pre> +<p>We can check the targets automatically create for this step, +based on the previous <code>outfiles</code>:</p> +<pre><code class="language-r">targetsWF(sal[3]) +</code></pre> +<pre><code>## $gunzip ## DataFrame with 3 rows and 2 columns -## gzip_file SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/SE.csv.gz SE -## 2 results/VE.csv.gz VE -## 3 results/VI.csv.gz VI -</code></pre> -<p>We can also check all the expected <code>outfiles</code> for this particular step, as follows:</p> -<pre><code class="language-r">outfiles(sal[3]) -</code></pre> -<pre><code>## $gunzip +## gzip_file SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/SE.csv.gz SE +## 2 results/VE.csv.gz VE +## 3 results/VI.csv.gz VI +</code></pre> +<p>We can also check all the expected <code>outfiles</code> for this particular step, as follows:</p> +<pre><code class="language-r">outfiles(sal[3]) +</code></pre> +<pre><code>## $gunzip ## DataFrame with 3 rows and 1 column -## gunzip_file -## &lt;character&gt; +## gunzip_file +## &lt;character&gt; ## 1 results/SE.csv ## 2 results/VE.csv ## 3 results/VI.csv -</code></pre> -<p>Now, we can observe that the third step has been added and contains one substep.</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gzip -## cmdlist: 3 | Pending: 3 -## 3. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 3.1. gunzip -## cmdlist: 3 | Pending: 3 -## -</code></pre> -<p>In addition, we can access all the command lines for each one of the substeps.</p> -<pre><code class="language-r">cmdlist(sal[&quot;gzip&quot;], targets = 1) -</code></pre> -<pre><code>## $gzip +</code></pre> +<p>Now, we can observe that the third step has been added and contains one substep.</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gzip +## cmdlist: 3 | Pending: 3 +## 3. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 3.1. gunzip +## cmdlist: 3 | Pending: 3 +## +</code></pre> +<p>In addition, we can access all the command lines for each one of the substeps.</p> +<pre><code class="language-r">cmdlist(sal[&quot;gzip&quot;], targets = 1) +</code></pre> +<pre><code>## $gzip ## $gzip$SE ## $gzip$SE$gzip -## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; -</code></pre> -<h4 id="getting-data-from-a-workflow-instance">Getting data from a workflow instance</h4> -<p>The final step in this simple workflow is an R code step. For that, we are using -the <code>LineWise</code> constructor function as demonstrated above.</p> -<p>One interesting feature showed here is the <code>getColumn</code> method that allows +## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; +</code></pre> +<h4 id="getting-data-from-a-workflow-instance">Getting data from a workflow instance</h4> +<p>The final step in this simple workflow is an R code step. For that, we are using +the <code>LineWise</code> constructor function as demonstrated above.</p> +<p>One interesting feature showed here is the <code>getColumn</code> method that allows extracting the information for a workflow instance. Those files can be used in -an R code, as demonstrated below.</p> -<pre><code class="language-r">getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;) -</code></pre> -<pre><code>## SE VE VI +an R code, as demonstrated below.</p> +<pre><code class="language-r">getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;) +</code></pre> +<pre><code>## SE VE VI ## &quot;results/SE.csv&quot; &quot;results/VE.csv&quot; &quot;results/VI.csv&quot; -</code></pre> -<pre><code class="language-r">appendStep(sal) &lt;- LineWise(code = { -df &lt;- lapply(getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;), function(x) read.delim(x, -sep = &quot;,&quot;)[-1]) -df &lt;- do.call(rbind, df) -stats &lt;- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], -2, sd))) -stats$species &lt;- rownames(stats) -plot &lt;- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + -ggplot2::geom_bar(stat = &quot;identity&quot;, color = &quot;black&quot;, position = ggplot2::position_dodge()) + -ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), -width = 0.2, position = ggplot2::position_dodge(0.9)) +</code></pre> +<pre><code class="language-r">appendStep(sal) &lt;- LineWise(code = { + df &lt;- lapply(getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;), function(x) read.delim(x, + sep = &quot;,&quot;)[-1]) + df &lt;- do.call(rbind, df) + stats &lt;- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], + 2, sd))) + stats$species &lt;- rownames(stats) + + plot &lt;- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + + ggplot2::geom_bar(stat = &quot;identity&quot;, color = &quot;black&quot;, position = ggplot2::position_dodge()) + + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), + width = 0.2, position = ggplot2::position_dodge(0.9)) }, step_name = &quot;iris_stats&quot;, dependency = &quot;gzip&quot;) -</code></pre> -<h2 id="build-workflow-from-a-r-markdown">Build workflow from a {R Markdown}</h2> -<p>The precisely same workflow can be created by importing the steps from an +</code></pre> +<h2 id="build-workflow-from-a-r-markdown">Build workflow from a {R Markdown}</h2> +<p>The precisely same workflow can be created by importing the steps from an R Markdown file. -As demonstrated above, it is required to initialize the project with <code>SPRproject</code> function.</p> -<p><code>importWF</code> function will scan and import all the R chunk from the R Markdown file +As demonstrated above, it is required to initialize the project with <code>SPRproject</code> function.</p> +<p><code>importWF</code> function will scan and import all the R chunk from the R Markdown file and build all the workflow instances. Then, each R chuck in the file will be -converted in a workflow step.</p> -<pre><code class="language-r">sal_rmd &lt;- SPRproject(logs.dir = &quot;.SPRproject_rmd&quot;) -</code></pre> -<pre><code>## Creating directory '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd' -## Creating file '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd/SYSargsList.yml' -</code></pre> -<pre><code class="language-r">sal_rmd &lt;- importWF(sal_rmd, file_path = system.file(&quot;extdata&quot;, &quot;spr_simple_wf.Rmd&quot;, -package = &quot;systemPipeR&quot;)) -</code></pre> -<pre><code>## Reading Rmd file -## -## ---- Actions ---- +converted in a workflow step.</p> +<pre><code class="language-r">sal_rmd &lt;- SPRproject(logs.dir = &quot;.SPRproject_rmd&quot;) +</code></pre> +<pre><code>## Creating directory '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd' +## Creating file '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd/SYSargsList.yml' +</code></pre> +<pre><code class="language-r">sal_rmd &lt;- importWF(sal_rmd, file_path = system.file(&quot;extdata&quot;, &quot;spr_simple_wf.Rmd&quot;, + package = &quot;systemPipeR&quot;)) +</code></pre> +<pre><code>## Reading Rmd file + +## +## ---- Actions ---- + ## Checking chunk SPR option + ## Ignore non-SPR chunks: 17 + ## Checking chunk eval values + ## Resolve step names + ## Check duplicated step names + ## Checking chunk dependencies -## Use the previous step as dependency for steps without 'spr.dep' options: 27 + +## Use the previous step as dependency for steps without 'spr.dep' options: 27 + ## Parse chunk code + ## ---- Succes! Create output ---- -## Now importing step 'export_iris' -## Now importing step 'gzip' -## Now importing step 'gunzip' -## Now importing step 'stats' -</code></pre> -<p>Let’s explore the workflow to check the steps:</p> -<pre><code class="language-r">stepsWF(sal_rmd) -</code></pre> -<pre><code>## $export_iris -## Instance of 'LineWise' -## Code Chunk length: 1 -## + +## Now importing step 'export_iris' +## Now importing step 'gzip' +## Now importing step 'gunzip' +## Now importing step 'stats' +</code></pre> +<p>Let’s explore the workflow to check the steps:</p> +<pre><code class="language-r">stepsWF(sal_rmd) +</code></pre> +<pre><code>## $export_iris +## Instance of 'LineWise' +## Code Chunk length: 1 +## ## $gzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 3 (SE...VI), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 3, output: 3 -## cmdlist: 3 -## Sub Steps: -## 1. gzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 3 (SE...VI), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 3, output: 3 +## cmdlist: 3 +## Sub Steps: +## 1. gzip (rendered: TRUE) +## +## +## ## $gunzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 3 (SE...VI), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 3, output: 3 -## cmdlist: 3 -## Sub Steps: -## 1. gunzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 3 (SE...VI), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 3, output: 3 +## cmdlist: 3 +## Sub Steps: +## 1. gunzip (rendered: TRUE) +## +## +## ## $stats -## Instance of 'LineWise' -## Code Chunk length: 5 -</code></pre> -<pre><code class="language-r">dependency(sal_rmd) -</code></pre> -<pre><code>## $export_iris +## Instance of 'LineWise' +## Code Chunk length: 5 +</code></pre> +<pre><code class="language-r">dependency(sal_rmd) +</code></pre> +<pre><code>## $export_iris ## [1] &quot;&quot; -## +## ## $gzip ## [1] &quot;export_iris&quot; -## +## ## $gunzip ## [1] &quot;gzip&quot; -## +## ## $stats ## [1] &quot;gunzip&quot; -</code></pre> -<pre><code class="language-r">codeLine(sal_rmd) -</code></pre> -<pre><code>## gzip AND gunzip step have been dropped because it is not a LineWise object. +</code></pre> +<pre><code class="language-r">codeLine(sal_rmd) +</code></pre> +<pre><code>## gzip AND gunzip step have been dropped because it is not a LineWise object. + ## export_iris -## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) ## stats -## df &lt;- lapply(getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;), function(x) read.delim(x, sep = &quot;,&quot;)[-1]) -## df &lt;- do.call(rbind, df) -## stats &lt;- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], 2, sd))) -## stats$species &lt;- rownames(stats) -## plot &lt;- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + ggplot2::geom_bar(stat = &quot;identity&quot;, color = &quot;black&quot;, position = ggplot2::position_dodge()) + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width = 0.2, position = ggplot2::position_dodge(0.9)) -</code></pre> -<pre><code class="language-r">targetsWF(sal_rmd) -</code></pre> -<pre><code>## $export_iris +## df &lt;- lapply(getColumn(sal, step = &quot;gunzip&quot;, &quot;outfiles&quot;), function(x) read.delim(x, sep = &quot;,&quot;)[-1]) +## df &lt;- do.call(rbind, df) +## stats &lt;- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], 2, sd))) +## stats$species &lt;- rownames(stats) +## plot &lt;- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + ggplot2::geom_bar(stat = &quot;identity&quot;, color = &quot;black&quot;, position = ggplot2::position_dodge()) + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width = 0.2, position = ggplot2::position_dodge(0.9)) +</code></pre> +<pre><code class="language-r">targetsWF(sal_rmd) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 0 rows and 0 columns -## +## ## $gzip ## DataFrame with 3 rows and 2 columns -## FileName SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/setosa.csv SE -## 2 results/versicolor.csv VE -## 3 results/virginica.csv VI -## +## FileName SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/setosa.csv SE +## 2 results/versicolor.csv VE +## 3 results/virginica.csv VI +## ## $gunzip ## DataFrame with 3 rows and 2 columns -## gzip_file SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/SE.csv.gz SE -## 2 results/VE.csv.gz VE -## 3 results/VI.csv.gz VI -## +## gzip_file SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/SE.csv.gz SE +## 2 results/VE.csv.gz VE +## 3 results/VI.csv.gz VI +## ## $stats ## DataFrame with 0 rows and 0 columns -</code></pre> -<h3 id="rules-to-create-the-r-markdown-to-import-as-workflow">Rules to create the R Markdown to import as workflow</h3> -<p>To include a particular code chunk from the R Markdown file in the workflow -analysis, please use the following code chunk options:</p> -<pre><code>- `spr='r'`: for code chunks with R code lines; -- `spr='sysargs'`: for code chunks with an `SYSargsList` object; -- `spr.dep=&lt;StepName&gt;`: for specify the previous dependency. -</code></pre> -<p>For example:</p> -<blockquote> -<p><em>```{r step_1, eval=TRUE, spr=‘r,’ spr.dep=‘step_0’}</em></p> -</blockquote> -<blockquote> -<p><em>```{r step_2, eval=TRUE, spr=‘sysargs,’ spr.dep=‘step_1’}</em></p> -</blockquote> -<p>For <code>spr = 'sysargs'</code>, the last object assigned must to be the <code>SYSargsList</code>, for example:</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/example/targets_example.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<h3 id="rules-to-create-the-r-markdown-to-import-as-workflow">Rules to create the R Markdown to import as workflow</h3> +<p>To include a particular code chunk from the R Markdown file in the workflow +analysis, please use the following code chunk options:</p> +<pre><code>- `spr='r'`: for code chunks with R code lines; +- `spr='sysargs'`: for code chunks with an `SYSargsList` object; +- `spr.dep=&lt;StepName&gt;`: for specify the previous dependency. +</code></pre> +<p>For example:</p> +<blockquote> +<p><em>```{r step_1, eval=TRUE, spr=‘r,’ spr.dep=‘step_0’}</em></p> +</blockquote> +<blockquote> +<p><em>```{r step_2, eval=TRUE, spr=‘sysargs,’ spr.dep=‘step_1’}</em></p> +</blockquote> +<p>For <code>spr = 'sysargs'</code>, the last object assigned must to be the <code>SYSargsList</code>, for example:</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/example/targets_example.txt&quot;, package = &quot;systemPipeR&quot;) HW_mul &lt;- SYSargsList(step_name = &quot;Example&quot;, targets = targetspath, wf_file = &quot;example/example.cwl&quot;, -input_file = &quot;example/example.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, package = &quot;systemPipeR&quot;), -inputvars = c(Message = &quot;_STRING_&quot;, SampleName = &quot;_SAMPLE_&quot;)) -</code></pre> -<p>Also, note that all the required files or objects to generate one particular + input_file = &quot;example/example.yml&quot;, dir_path = system.file(&quot;extdata/cwl&quot;, package = &quot;systemPipeR&quot;), + inputvars = c(Message = &quot;_STRING_&quot;, SampleName = &quot;_SAMPLE_&quot;)) +</code></pre> +<p>Also, note that all the required files or objects to generate one particular command-line step must be defined in a R code chunk imported. The motivation for this is that when R Markdown files are imported, the -<code>spr = 'sysargs'</code> R chunk will be evaluated and stored in the workflow control -class as the <code>SYSargsList</code> object, while the R code based (<code>spr = 'r'</code>) is not -evaluated, and until the workflow is executed it will be store as an expression.</p> -<h1 id="running-the-workflow">Running the workflow</h1> -<p>For running the workflow, <code>runWF</code> function will execute all the command lines -store in the workflow container.</p> -<pre><code class="language-r">sal &lt;- runWF(sal) -</code></pre> -<p>This essential function allows the user to choose one or multiple steps to be -executed using the <code>steps</code> argument. However, it is necessary to follow the +<code>spr = 'sysargs'</code> R chunk will be evaluated and stored in the workflow control +class as the <code>SYSargsList</code> object, while the R code based (<code>spr = 'r'</code>) is not +evaluated, and until the workflow is executed it will be store as an expression.</p> +<h1 id="running-the-workflow">Running the workflow</h1> +<p>For running the workflow, <code>runWF</code> function will execute all the command lines +store in the workflow container.</p> +<pre><code class="language-r">sal &lt;- runWF(sal) +</code></pre> +<p>This essential function allows the user to choose one or multiple steps to be +executed using the <code>steps</code> argument. However, it is necessary to follow the workflow dependency graph. If a selected step depends on a previous step(s) that -was not executed, the execution will fail.</p> -<pre><code class="language-r">sal &lt;- runWF(sal, steps = c(1, 3)) -</code></pre> -<p>Also, it allows forcing the execution of the steps, even if the status of the -step is <code>'Success'</code> and all the expected <code>outfiles</code> exists. -Another feature of the <code>runWF</code> function is ignoring all the warnings -and errors and running the workflow by the arguments <code>warning.stop</code> and -<code>error.stop</code>, respectively.</p> -<pre><code class="language-r">sal &lt;- runWF(sal, force = TRUE, warning.stop = FALSE, error.stop = TRUE) -</code></pre> -<p>When the project was initialized by <code>SPRproject</code> function, it was created an +was not executed, the execution will fail.</p> +<pre><code class="language-r">sal &lt;- runWF(sal, steps = c(1, 3)) +</code></pre> +<p>Also, it allows forcing the execution of the steps, even if the status of the +step is <code>'Success'</code> and all the expected <code>outfiles</code> exists. +Another feature of the <code>runWF</code> function is ignoring all the warnings +and errors and running the workflow by the arguments <code>warning.stop</code> and +<code>error.stop</code>, respectively.</p> +<pre><code class="language-r">sal &lt;- runWF(sal, force = TRUE, warning.stop = FALSE, error.stop = TRUE) +</code></pre> +<p>When the project was initialized by <code>SPRproject</code> function, it was created an environment for all objects created during the workflow execution. This -environment can be accessed as follows:</p> -<pre><code class="language-r">viewEnvir(sal) -</code></pre> -<p>The workflow execution allows to save this environment for future recovery:</p> -<pre><code class="language-r">sal &lt;- runWF(sal, saveEnv = TRUE) -</code></pre> -<h2 id="workflow-status">Workflow status</h2> -<p>To check the summary of the workflow, we can use:</p> -<pre><code class="language-r">sal -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gzip -## cmdlist: 3 | Pending: 3 -## 3. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 3.1. gunzip -## cmdlist: 3 | Pending: 3 -## 4. iris_stats --&gt; Status: Pending -## -</code></pre> -<p>To access more details about the workflow instances, we can use the <code>statusWF</code> method:</p> -<pre><code class="language-r">statusWF(sal) -</code></pre> -<pre><code>## $export_iris +environment can be accessed as follows:</p> +<pre><code class="language-r">viewEnvir(sal) +</code></pre> +<p>The workflow execution allows to save this environment for future recovery:</p> +<pre><code class="language-r">sal &lt;- runWF(sal, saveEnv = TRUE) +</code></pre> +<h2 id="workflow-status">Workflow status</h2> +<p>To check the summary of the workflow, we can use:</p> +<pre><code class="language-r">sal +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gzip +## cmdlist: 3 | Pending: 3 +## 3. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 3.1. gunzip +## cmdlist: 3 | Pending: 3 +## 4. iris_stats --&gt; Status: Pending +## +</code></pre> +<p>To access more details about the workflow instances, we can use the <code>statusWF</code> method:</p> +<pre><code class="language-r">statusWF(sal) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 1 row and 2 columns -## Step status.summary -## &lt;character&gt; &lt;character&gt; -## 1 export_iris Pending -## +## Step status.summary +## &lt;character&gt; &lt;character&gt; +## 1 export_iris Pending +## ## $gzip ## DataFrame with 3 rows and 5 columns -## Targets Total_Files Existing_Files Missing_Files gzip -## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; -## 1 SE 1 0 1 Pending -## 2 VE 1 0 1 Pending -## 3 VI 1 0 1 Pending -## +## Targets Total_Files Existing_Files Missing_Files gzip +## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; +## 1 SE 1 0 1 Pending +## 2 VE 1 0 1 Pending +## 3 VI 1 0 1 Pending +## ## $gunzip ## DataFrame with 3 rows and 5 columns -## Targets Total_Files Existing_Files Missing_Files gunzip -## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; -## 1 SE 1 0 1 Pending -## 2 VE 1 0 1 Pending -## 3 VI 1 0 1 Pending -## +## Targets Total_Files Existing_Files Missing_Files gunzip +## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; +## 1 SE 1 0 1 Pending +## 2 VE 1 0 1 Pending +## 3 VI 1 0 1 Pending +## ## $iris_stats ## DataFrame with 1 row and 2 columns -## Step status.summary -## &lt;character&gt; &lt;character&gt; -## 1 iris_stats Pending -</code></pre> -<h2 id="parallelization-on-clusters">Parallelization on clusters</h2> -<p>This section of the tutorial provides an introduction to the usage of the -<em><code>systemPipeR</code></em> features on a cluster.</p> -<p>The computation can be greatly accelerated by processing many files +## Step status.summary +## &lt;character&gt; &lt;character&gt; +## 1 iris_stats Pending +</code></pre> +<h2 id="parallelization-on-clusters">Parallelization on clusters</h2> +<p>This section of the tutorial provides an introduction to the usage of the +<em><code>systemPipeR</code></em> features on a cluster.</p> +<p>The computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing -system is used for load balancing. For this the <code>clusterRun</code> function submits +system is used for load balancing. For this the <code>clusterRun</code> function submits the computing requests to the scheduler using the run specifications -defined by <code>runWF</code>.</p> -<p>A named list provides the computational resources. By default, it can be defined +defined by <code>runWF</code>.</p> +<p>A named list provides the computational resources. By default, it can be defined the upper time limit in minutes for jobs before they get killed by the scheduler, -memory limit in Mb, number of <code>CPUs</code>, and number of tasks.</p> -<p>The number of independent parallel cluster processes is defined under the -<code>Njobs</code> argument. The following example will run one process in parallel using +memory limit in Mb, number of <code>CPUs</code>, and number of tasks.</p> +<p>The number of independent parallel cluster processes is defined under the +<code>Njobs</code> argument. The following example will run one process in parallel using for each 4 CPU cores. If the resources available on a cluster allow running all the processes simultaneously, then the shown sample submission will utilize in -total four CPU cores (<code>NJobs * ncpus</code>). Note, <code>clusterRun</code> can be used -with most queueing systems as it is based on utilities from the <em><code>batchtools</code></em> -package which supports the use of template files (<em><code>*.tmpl</code></em>) for defining the +total four CPU cores (<code>NJobs * ncpus</code>). Note, <code>clusterRun</code> can be used +with most queueing systems as it is based on utilities from the <em><code>batchtools</code></em> +package which supports the use of template files (<em><code>*.tmpl</code></em>) for defining the run parameters of different schedulers. To run the following code, one needs to -have both a <code>conf file</code> (see <em><code>.batchtools.conf.R</code></em> samples <a href="https://mllg.github.io/batchtools/">here</a>) -and a template file (see <em><code>*.tmpl</code></em> samples <a href="https://github.com/mllg/batchtools/tree/master/inst/templates">here</a>) +have both a <code>conf file</code> (see <em><code>.batchtools.conf.R</code></em> samples <a href="https://mllg.github.io/batchtools/">here</a>) +and a template file (see <em><code>*.tmpl</code></em> samples <a href="https://github.com/mllg/batchtools/tree/master/inst/templates">here</a>) for the queueing available on a system. The following example uses the sample -<code>conf</code> and <code>template</code> files for the <code>Slurm</code> scheduler provided by this package.</p> -<pre><code class="language-r">library(batchtools) +<code>conf</code> and <code>template</code> files for the <code>Slurm</code> scheduler provided by this package.</p> +<pre><code class="language-r">library(batchtools) resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) sal &lt;- clusterRun(sal, FUN = runWF, more.args = list(), conffile = &quot;.batchtools.conf.R&quot;, -template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 1, runid = &quot;01&quot;, resourceList = resources) -</code></pre> -<p>Note: The example is submitting the jog to <code>short</code> partition. If you desire to -use a different partition, please adjust accordingly (<code>batchtools.slurm.tmpl</code>).</p> -<h1 id="visualize-workflow">Visualize workflow</h1> -<p><em><code>systemPipeR</code></em> workflows instances can be visualized with the <code>plotWF</code> function.</p> -<p>This function will make a plot of selected workflow instance and the following -information is displayed on the plot:</p> -<pre><code>- Workflow structure (dependency graphs between different steps); -- Workflow step status, *e.g.* `Success`, `Error`, `Pending`, `Warnings`; -- Sample status and statistics; -- Workflow timing: running duration time. -</code></pre> -<p>If no argument is provided, the basic plot will automatically detect width, -height, layout, plot method, branches, <em>etc</em>.</p> -<pre><code class="language-r">plotWF(sal, show_legend = TRUE, width = &quot;80%&quot;, rstudio = TRUE) -</code></pre> -<div id="htmlwidget-1" style="width:80%;height:480px;" class="plotwf html-widget"></div> -<script type="application/json" data-for="htmlwidget-1">{"x":{"dot":"digraph {\n node[fontsize=20];\n subgraph {\n node[color=\"dodgerblue\"];\n export_iris -> gzip -> iris_stats[color=\"dodgerblue\"]\n }\n gzip -> gunzip\n \n export_iris[label=<<b><font color=\"black\">export_iris<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">1<\/font><\/b>; <font color=\"black\">0s<\/font>> tooltip=\"step export_iris: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n gzip[label=<<b><font color=\"black\">gzip<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">3<\/font><\/b>; <font color=\"black\">0s<\/font>> , style=\"rounded\", shape=\"box\" tooltip=\"step gzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n gunzip[label=<<b><font color=\"black\">gunzip<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">3<\/font><\/b>; <font color=\"black\">0s<\/font>> , style=\"rounded\", shape=\"box\" tooltip=\"step gunzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n iris_stats[label=<<b><font color=\"black\">iris_stats<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">1<\/font><\/b>; <font color=\"black\">0s<\/font>> tooltip=\"step iris_stats: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n subgraph cluster_legend {\n rankdir=TB;\n color=\"#EEEEEE\";\n style=filled;\n node [style=filled];\n {rank=same; R_step; Sysargs_step; Main_branch}\n Main_branch -> Sysargs_step -> R_step[color=\"#EEEEEE\"]\n Main_branch[label=\"Main branch\" color=\"dodgerblue\", style=\"filled\", fillcolor=white]; Sysargs_step ->step_state[color=\"#EEEEEE\"];\n step_state[style=\"filled\", shape=\"box\" color=white, label =<\n <table>\n <tr><td><b>Step Colors<\/b><\/td><\/tr>\n <tr><td><font color=\"black\">Pending steps<\/font>; <font color=\"#5cb85c\">Successful steps<\/font>; <font color=\"#d9534f\">Failed steps<\/font><\/td><\/tr>\n <tr><td><b>Targets Files / Code Chunk <\/b><\/td><\/tr><tr><td><font color=\"#5cb85c\">0 (pass) <\/font> | <font color=\"#f0ad4e\">0 (warning) <\/font> | <font color=\"#d9534f\">0 (error) <\/font> | <font color=\"blue\">0 (total)<\/font>; Duration<\/td><\/tr><\/table>\n >];\n label=\"Legends\";\n fontsize = 30;\n Sysargs_step[label=\"Sysargs step\" style=\"rounded, filled\", shape=\"box\", fillcolor=white];\n R_step[label=\"R step\" style=\"rounded, filled\", fillcolor=white];\n }\n\n}\n","plotid":"sprwf-48365271","responsive":true,"width":"80%","height":null,"plot_method":"renderSVGElement","rmd":true,"msg":""},"evals":[],"jsHooks":[]}</script> -<p>For more details about the <code>plotWF</code> function, please see <a href="#plotWF">here</a>.</p> -<h1 id="technical-report">Technical report</h1> -<p><em><code>systemPipeR</code></em> compiles all the workflow execution logs in one central location, -making it easier to check any standard output (<code>stdout</code>) or standard error -(<code>stderr</code>) for any command-line tools used on the workflow or the R code <code>stdout</code>. + template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 1, runid = &quot;01&quot;, resourceList = resources) +</code></pre> +<p>Note: The example is submitting the jog to <code>short</code> partition. If you desire to +use a different partition, please adjust accordingly (<code>batchtools.slurm.tmpl</code>).</p> +<h1 id="visualize-workflow">Visualize workflow</h1> +<p><em><code>systemPipeR</code></em> workflows instances can be visualized with the <code>plotWF</code> function.</p> +<p>This function will make a plot of selected workflow instance and the following +information is displayed on the plot:</p> +<pre><code>- Workflow structure (dependency graphs between different steps); +- Workflow step status, *e.g.* `Success`, `Error`, `Pending`, `Warnings`; +- Sample status and statistics; +- Workflow timing: running duration time. +</code></pre> +<p>If no argument is provided, the basic plot will automatically detect width, +height, layout, plot method, branches, <em>etc</em>.</p> +<pre><code class="language-r">plotWF(sal, show_legend = TRUE, width = &quot;80%&quot;, rstudio = TRUE) +</code></pre> +<div id="htmlwidget-1" style="width:80%;height:480px;" class="plotwf html-widget"></div> +<script type="application/json" data-for="htmlwidget-1">{"x":{"dot":"digraph {\n node[fontsize=20];\n subgraph {\n node[color=\"dodgerblue\"];\n export_iris -> gzip -> iris_stats[color=\"dodgerblue\"]\n }\n gzip -> gunzip\n \n export_iris[label=<<b><font color=\"black\">export_iris<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">1<\/font><\/b>; <font color=\"black\">0s<\/font>> tooltip=\"step export_iris: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n gzip[label=<<b><font color=\"black\">gzip<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">3<\/font><\/b>; <font color=\"black\">0s<\/font>> , style=\"rounded\", shape=\"box\" tooltip=\"step gzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n gunzip[label=<<b><font color=\"black\">gunzip<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">3<\/font><\/b>; <font color=\"black\">0s<\/font>> , style=\"rounded\", shape=\"box\" tooltip=\"step gunzip: 0 samples passed; 0 samples have warnings; 0 samples have errors; 3 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n iris_stats[label=<<b><font color=\"black\">iris_stats<\/font><br><\/br><font color=\"#5cb85c\">0<\/font>/<font color=\"#f0ad4e\">0<\/font>/<font color=\"#d9534f\">0<\/font>/<font color=\"blue\">1<\/font><\/b>; <font color=\"black\">0s<\/font>> tooltip=\"step iris_stats: 0 samples passed; 0 samples have warnings; 0 samples have errors; 1 samples in total; Start time: 2021-08-06 16:41:49; End time: 2021-08-06 16:41:49; Duration: 00:00:00\"]\n subgraph cluster_legend {\n rankdir=TB;\n color=\"#EEEEEE\";\n style=filled;\n node [style=filled];\n {rank=same; R_step; Sysargs_step; Main_branch}\n Main_branch -> Sysargs_step -> R_step[color=\"#EEEEEE\"]\n Main_branch[label=\"Main branch\" color=\"dodgerblue\", style=\"filled\", fillcolor=white]; Sysargs_step ->step_state[color=\"#EEEEEE\"];\n step_state[style=\"filled\", shape=\"box\" color=white, label =<\n <table>\n <tr><td><b>Step Colors<\/b><\/td><\/tr>\n <tr><td><font color=\"black\">Pending steps<\/font>; <font color=\"#5cb85c\">Successful steps<\/font>; <font color=\"#d9534f\">Failed steps<\/font><\/td><\/tr>\n <tr><td><b>Targets Files / Code Chunk <\/b><\/td><\/tr><tr><td><font color=\"#5cb85c\">0 (pass) <\/font> | <font color=\"#f0ad4e\">0 (warning) <\/font> | <font color=\"#d9534f\">0 (error) <\/font> | <font color=\"blue\">0 (total)<\/font>; Duration<\/td><\/tr><\/table>\n >];\n label=\"Legends\";\n fontsize = 30;\n Sysargs_step[label=\"Sysargs step\" style=\"rounded, filled\", shape=\"box\", fillcolor=white];\n R_step[label=\"R step\" style=\"rounded, filled\", fillcolor=white];\n }\n\n}\n","plotid":"sprwf-48365271","responsive":true,"width":"80%","height":null,"plot_method":"renderSVGElement","rmd":true,"msg":""},"evals":[],"jsHooks":[]}</script> +<p>For more details about the <code>plotWF</code> function, please see <a href="#plotWF">here</a>.</p> +<h1 id="technical-report">Technical report</h1> +<p><em><code>systemPipeR</code></em> compiles all the workflow execution logs in one central location, +making it easier to check any standard output (<code>stdout</code>) or standard error +(<code>stderr</code>) for any command-line tools used on the workflow or the R code <code>stdout</code>. Also, the workflow plot is appended at the beginning of the report, making it -easier to click on the respective step.</p> -<pre><code class="language-r">sal &lt;- renderLogs(sal) -</code></pre> -<h1 id="exported-the-workflow">Exported the workflow</h1> -<p><em><code>systemPipeR</code></em> workflow management system allows to translate and export the +easier to click on the respective step.</p> +<pre><code class="language-r">sal &lt;- renderLogs(sal) +</code></pre> +<h1 id="exported-the-workflow">Exported the workflow</h1> +<p><em><code>systemPipeR</code></em> workflow management system allows to translate and export the workflow build interactively to R Markdown format or an executable bash script. This feature advances the reusability of the workflow, as well as the flexibility -for workflow execution.</p> -<h2 id="r-markdown-file">R Markdown file</h2> -<p><code>sal2rmd</code> function takes an <code>SYSargsList</code> workflow container and translates it to +for workflow execution.</p> +<h2 id="r-markdown-file">R Markdown file</h2> +<p><code>sal2rmd</code> function takes an <code>SYSargsList</code> workflow container and translates it to SPR workflow template R markdown format. This file can be imported with the -<code>importWF</code> function, as demonstrated above.</p> -<pre><code class="language-r">sal2rmd(sal) -</code></pre> -<h2 id="bash-script">Bash script</h2> -<p><code>sal2bash</code> function takes an <code>SYSargsList</code> workflow container and translates +<code>importWF</code> function, as demonstrated above.</p> +<pre><code class="language-r">sal2rmd(sal) +</code></pre> +<h2 id="bash-script">Bash script</h2> +<p><code>sal2bash</code> function takes an <code>SYSargsList</code> workflow container and translates it to an executable bash script, so one can run the workflow without loading -<code>SPR</code> or using an R console.</p> -<pre><code class="language-r">sal2bash(sal) -</code></pre> -<p>It will be generated on the project root an executable bash script, called by -default the <code>spr_wf.sh</code>. Also, a directory <code>./spr_wf</code> will be created and store +<code>SPR</code> or using an R console.</p> +<pre><code class="language-r">sal2bash(sal) +</code></pre> +<p>It will be generated on the project root an executable bash script, called by +default the <code>spr_wf.sh</code>. Also, a directory <code>./spr_wf</code> will be created and store all the R scripts based on the workflow steps. Please note that this function will -“collapse” adjacent R steps into one file as much as possible.</p> -<h1 id="project-resume-and-restart">Project Resume and Restart</h1> -<p>If you desire to resume or restart a project that has been initialized in the past, -<code>SPRproject</code> function allows this operation.</p> -<p>With the resume option, it is possible to load the <code>SYSargsList</code> object in R and -resume the analysis. Please, make sure to provide the <code>logs.dir</code> location, and the -corresponded <code>YAML</code> file name. -The current working directory needs to be in the project root directory.</p> -<pre><code class="language-r">sal &lt;- SPRproject(resume = TRUE, logs.dir = &quot;.SPRproject&quot;, sys.file = &quot;.SPRproject/SYSargsList.yml&quot;) -</code></pre> -<p>If you choose to save the environment in the last analysis, you can recover all -the files created in that particular section. <code>SPRproject</code> function allows this -with <code>load.envir</code> argument. Please note that the environment was saved only with -you run the workflow in the last section (<code>runWF()</code>).</p> -<pre><code class="language-r">sal &lt;- SPRproject(resume = TRUE, load.envir = TRUE) -</code></pre> -<p>After loading the workflow at your current section, you can check the objects +“collapse” adjacent R steps into one file as much as possible.</p> +<h1 id="project-resume-and-restart">Project Resume and Restart</h1> +<p>If you desire to resume or restart a project that has been initialized in the past, +<code>SPRproject</code> function allows this operation.</p> +<p>With the resume option, it is possible to load the <code>SYSargsList</code> object in R and +resume the analysis. Please, make sure to provide the <code>logs.dir</code> location, and the +corresponded <code>YAML</code> file name. +The current working directory needs to be in the project root directory.</p> +<pre><code class="language-r">sal &lt;- SPRproject(resume = TRUE, logs.dir = &quot;.SPRproject&quot;, sys.file = &quot;.SPRproject/SYSargsList.yml&quot;) +</code></pre> +<p>If you choose to save the environment in the last analysis, you can recover all +the files created in that particular section. <code>SPRproject</code> function allows this +with <code>load.envir</code> argument. Please note that the environment was saved only with +you run the workflow in the last section (<code>runWF()</code>).</p> +<pre><code class="language-r">sal &lt;- SPRproject(resume = TRUE, load.envir = TRUE) +</code></pre> +<p>After loading the workflow at your current section, you can check the objects created in the old environment and decide if it is necessary to copy them to the -current environment.</p> -<pre><code class="language-r">viewEnvir(sal) +current environment.</p> +<pre><code class="language-r">viewEnvir(sal) copyEnvir(sal, list = &quot;plot&quot;, new.env = globalenv()) -</code></pre> -<p>This option will keep all previous logs in the folder; however, if you desire to -clean the execution history and restart the workflow, the <code>restart=TRUE</code> option -can be used.</p> -<pre><code class="language-r">sal &lt;- SPRproject(restart = TRUE, overwrite = TRUE, load.envir = FALSE) -</code></pre> -<p>The last and more drastic option from <code>SYSproject</code> function is to overwrite the +</code></pre> +<p>This option will keep all previous logs in the folder; however, if you desire to +clean the execution history and restart the workflow, the <code>restart=TRUE</code> option +can be used.</p> +<pre><code class="language-r">sal &lt;- SPRproject(restart = TRUE, overwrite = TRUE, load.envir = FALSE) +</code></pre> +<p>The last and more drastic option from <code>SYSproject</code> function is to overwrite the logs and the workflow. This option will delete the hidden folder and the -information on the <code>SYSargsList.yml</code> files. This will not delete any parameter -file nor any results it was created in previous runs. Please use with caution.</p> -<pre><code class="language-r">sal &lt;- SPRproject(overwrite = TRUE) -</code></pre> -<h1 id="exploring-workflow-instances">Exploring workflow instances</h1> -<p><em><code>systemPipeR</code></em> provide several accessor methods and useful functions to explore -<code>SYSargsList</code> workflow object.</p> -<h2 id="accessor-methods">Accessor Methods</h2> -<p>Several accessor methods are available that are named after the slot names of -the <code>SYSargsList</code> workflow object.</p> -<pre><code class="language-r">names(sal) -</code></pre> -<pre><code>## [1] &quot;stepsWF&quot; &quot;statusWF&quot; &quot;targetsWF&quot; -## [4] &quot;outfiles&quot; &quot;SEobj&quot; &quot;dependency&quot; -## [7] &quot;targets_connection&quot; &quot;projectInfo&quot; &quot;runInfo&quot; -</code></pre> -<ul> -<li>Check the length of the workflow:</li> -</ul> -<pre><code class="language-r">length(sal) -</code></pre> -<pre><code>## [1] 4 -</code></pre> -<ul> -<li>Check the steps of the workflow:</li> -</ul> -<pre><code class="language-r">stepsWF(sal) -</code></pre> -<pre><code>## $export_iris -## Instance of 'LineWise' -## Code Chunk length: 1 -## +information on the <code>SYSargsList.yml</code> files. This will not delete any parameter +file nor any results it was created in previous runs. Please use with caution.</p> +<pre><code class="language-r">sal &lt;- SPRproject(overwrite = TRUE) +</code></pre> +<h1 id="exploring-workflow-instances">Exploring workflow instances</h1> +<p><em><code>systemPipeR</code></em> provide several accessor methods and useful functions to explore +<code>SYSargsList</code> workflow object.</p> +<h2 id="accessor-methods">Accessor Methods</h2> +<p>Several accessor methods are available that are named after the slot names of +the <code>SYSargsList</code> workflow object.</p> +<pre><code class="language-r">names(sal) +</code></pre> +<pre><code>## [1] &quot;stepsWF&quot; &quot;statusWF&quot; &quot;targetsWF&quot; +## [4] &quot;outfiles&quot; &quot;SEobj&quot; &quot;dependency&quot; +## [7] &quot;targets_connection&quot; &quot;projectInfo&quot; &quot;runInfo&quot; +</code></pre> +<ul> +<li>Check the length of the workflow:</li> +</ul> +<pre><code class="language-r">length(sal) +</code></pre> +<pre><code>## [1] 4 +</code></pre> +<ul> +<li>Check the steps of the workflow:</li> +</ul> +<pre><code class="language-r">stepsWF(sal) +</code></pre> +<pre><code>## $export_iris +## Instance of 'LineWise' +## Code Chunk length: 1 +## ## $gzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 3 (SE...VI), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 3, output: 3 -## cmdlist: 3 -## Sub Steps: -## 1. gzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 3 (SE...VI), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 3, output: 3 +## cmdlist: 3 +## Sub Steps: +## 1. gzip (rendered: TRUE) +## +## +## ## $gunzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 3 (SE...VI), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 3, output: 3 -## cmdlist: 3 -## Sub Steps: -## 1. gunzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 3 (SE...VI), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 3, output: 3 +## cmdlist: 3 +## Sub Steps: +## 1. gunzip (rendered: TRUE) +## +## +## ## $iris_stats -## Instance of 'LineWise' -## Code Chunk length: 5 -</code></pre> -<ul> -<li>Checking the command-line for each target sample:</li> -</ul> -<p><code>cmdlist()</code> method printing the system commands for running command-line -software as specified by a given <code>*.cwl</code> file combined with the paths to the -input samples (<em>e.g.</em> FASTQ files) provided by a <code>targets</code> file. The example below -shows the <code>cmdlist()</code> output for running <code>gzip</code> and <code>gunzip</code> on the first sample. -Evaluating the output of <code>cmdlist()</code> can be very helpful for designing -and debugging <code>*.cwl</code> files of new command-line software or changing the -parameter settings of existing ones.</p> -<pre><code class="language-r">cmdlist(sal, step = c(2, 3), targets = 1) -</code></pre> -<pre><code>## $gzip +## Instance of 'LineWise' +## Code Chunk length: 5 +</code></pre> +<ul> +<li>Checking the command-line for each target sample:</li> +</ul> +<p><code>cmdlist()</code> method printing the system commands for running command-line +software as specified by a given <code>*.cwl</code> file combined with the paths to the +input samples (<em>e.g.</em> FASTQ files) provided by a <code>targets</code> file. The example below +shows the <code>cmdlist()</code> output for running <code>gzip</code> and <code>gunzip</code> on the first sample. +Evaluating the output of <code>cmdlist()</code> can be very helpful for designing +and debugging <code>*.cwl</code> files of new command-line software or changing the +parameter settings of existing ones.</p> +<pre><code class="language-r">cmdlist(sal, step = c(2, 3), targets = 1) +</code></pre> +<pre><code>## $gzip ## $gzip$SE ## $gzip$SE$gzip -## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; -## -## -## +## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; +## +## +## ## $gunzip ## $gunzip$SE ## $gunzip$SE$gunzip -## [1] &quot;gunzip -c results/SE.csv.gz &gt; results/SE.csv&quot; -</code></pre> -<ul> -<li>Check the workflow status:</li> -</ul> -<pre><code class="language-r">statusWF(sal) -</code></pre> -<pre><code>## $export_iris +## [1] &quot;gunzip -c results/SE.csv.gz &gt; results/SE.csv&quot; +</code></pre> +<ul> +<li>Check the workflow status:</li> +</ul> +<pre><code class="language-r">statusWF(sal) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 1 row and 2 columns -## Step status.summary -## &lt;character&gt; &lt;character&gt; -## 1 export_iris Pending -## +## Step status.summary +## &lt;character&gt; &lt;character&gt; +## 1 export_iris Pending +## ## $gzip ## DataFrame with 3 rows and 5 columns -## Targets Total_Files Existing_Files Missing_Files gzip -## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; -## 1 SE 1 0 1 Pending -## 2 VE 1 0 1 Pending -## 3 VI 1 0 1 Pending -## +## Targets Total_Files Existing_Files Missing_Files gzip +## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; +## 1 SE 1 0 1 Pending +## 2 VE 1 0 1 Pending +## 3 VI 1 0 1 Pending +## ## $gunzip ## DataFrame with 3 rows and 5 columns -## Targets Total_Files Existing_Files Missing_Files gunzip -## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; -## 1 SE 1 0 1 Pending -## 2 VE 1 0 1 Pending -## 3 VI 1 0 1 Pending -## +## Targets Total_Files Existing_Files Missing_Files gunzip +## &lt;character&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;numeric&gt; &lt;factor&gt; +## 1 SE 1 0 1 Pending +## 2 VE 1 0 1 Pending +## 3 VI 1 0 1 Pending +## ## $iris_stats ## DataFrame with 1 row and 2 columns -## Step status.summary -## &lt;character&gt; &lt;character&gt; -## 1 iris_stats Pending -</code></pre> -<ul> -<li>Check the workflow targets files:</li> -</ul> -<pre><code class="language-r">targetsWF(sal[2]) -</code></pre> -<pre><code>## $gzip +## Step status.summary +## &lt;character&gt; &lt;character&gt; +## 1 iris_stats Pending +</code></pre> +<ul> +<li>Check the workflow targets files:</li> +</ul> +<pre><code class="language-r">targetsWF(sal[2]) +</code></pre> +<pre><code>## $gzip ## DataFrame with 3 rows and 2 columns -## FileName SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/setosa.csv SE -## 2 results/versicolor.csv VE -## 3 results/virginica.csv VI -</code></pre> -<ul> -<li>Checking the expected outfiles files:</li> -</ul> -<p>The <code>outfiles</code> components of <code>SYSargsList</code> define the expected outfiles files -for each step in the workflow, some of which are the input for the next workflow step.</p> -<pre><code class="language-r">outfiles(sal[2]) -</code></pre> -<pre><code>## $gzip +## FileName SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/setosa.csv SE +## 2 results/versicolor.csv VE +## 3 results/virginica.csv VI +</code></pre> +<ul> +<li>Checking the expected outfiles files:</li> +</ul> +<p>The <code>outfiles</code> components of <code>SYSargsList</code> define the expected outfiles files +for each step in the workflow, some of which are the input for the next workflow step.</p> +<pre><code class="language-r">outfiles(sal[2]) +</code></pre> +<pre><code>## $gzip ## DataFrame with 3 rows and 1 column -## gzip_file -## &lt;character&gt; +## gzip_file +## &lt;character&gt; ## 1 results/SE.csv.gz ## 2 results/VE.csv.gz ## 3 results/VI.csv.gz -</code></pre> -<ul> -<li>Check the workflow dependencies:</li> -</ul> -<pre><code class="language-r">dependency(sal) -</code></pre> -<pre><code>## $export_iris +</code></pre> +<ul> +<li>Check the workflow dependencies:</li> +</ul> +<pre><code class="language-r">dependency(sal) +</code></pre> +<pre><code>## $export_iris ## [1] &quot;&quot; -## +## ## $gzip ## [1] &quot;export_iris&quot; -## +## ## $gunzip ## [1] &quot;gzip&quot; -## +## ## $iris_stats ## [1] &quot;gzip&quot; -</code></pre> -<ul> -<li>Check the sample comparisons:</li> -</ul> -<p>Sample comparisons are defined in the header lines of the <code>targets</code> file -starting with ‘<code># &lt;CMP&gt;</code>.’ This information can be accessed as follows:</p> -<pre><code class="language-r">targetsheader(sal, step = &quot;Quality&quot;) -</code></pre> -<ul> -<li>Get the workflow steps names:</li> -</ul> -<pre><code class="language-r">stepName(sal) -</code></pre> -<pre><code>## [1] &quot;export_iris&quot; &quot;gzip&quot; &quot;gunzip&quot; &quot;iris_stats&quot; -</code></pre> -<ul> -<li>Get the Sample Id for on particular step:</li> -</ul> -<pre><code class="language-r">SampleName(sal, step = &quot;gzip&quot;) -</code></pre> -<pre><code>## [1] &quot;SE&quot; &quot;VE&quot; &quot;VI&quot; -</code></pre> -<pre><code class="language-r">SampleName(sal, step = &quot;iris_stats&quot;) -</code></pre> -<pre><code>## This step doesn't contain multiple samples. -</code></pre> -<ul> -<li>Get the <code>outfiles</code> or <code>targets</code> column files:</li> -</ul> -<pre><code class="language-r">getColumn(sal, &quot;outfiles&quot;, step = &quot;gzip&quot;, column = &quot;gzip_file&quot;) -</code></pre> -<pre><code>## SE VE VI +</code></pre> +<ul> +<li>Check the sample comparisons:</li> +</ul> +<p>Sample comparisons are defined in the header lines of the <code>targets</code> file +starting with ‘<code># &lt;CMP&gt;</code>.’ This information can be accessed as follows:</p> +<pre><code class="language-r">targetsheader(sal, step = &quot;Quality&quot;) +</code></pre> +<ul> +<li>Get the workflow steps names:</li> +</ul> +<pre><code class="language-r">stepName(sal) +</code></pre> +<pre><code>## [1] &quot;export_iris&quot; &quot;gzip&quot; &quot;gunzip&quot; &quot;iris_stats&quot; +</code></pre> +<ul> +<li>Get the Sample Id for on particular step:</li> +</ul> +<pre><code class="language-r">SampleName(sal, step = &quot;gzip&quot;) +</code></pre> +<pre><code>## [1] &quot;SE&quot; &quot;VE&quot; &quot;VI&quot; +</code></pre> +<pre><code class="language-r">SampleName(sal, step = &quot;iris_stats&quot;) +</code></pre> +<pre><code>## This step doesn't contain multiple samples. +</code></pre> +<ul> +<li>Get the <code>outfiles</code> or <code>targets</code> column files:</li> +</ul> +<pre><code class="language-r">getColumn(sal, &quot;outfiles&quot;, step = &quot;gzip&quot;, column = &quot;gzip_file&quot;) +</code></pre> +<pre><code>## SE VE VI ## &quot;results/SE.csv.gz&quot; &quot;results/VE.csv.gz&quot; &quot;results/VI.csv.gz&quot; -</code></pre> -<pre><code class="language-r">getColumn(sal, &quot;targetsWF&quot;, step = &quot;gzip&quot;, column = &quot;FileName&quot;) -</code></pre> -<pre><code>## SE VE VI -## &quot;results/setosa.csv&quot; &quot;results/versicolor.csv&quot; &quot;results/virginica.csv&quot; -</code></pre> -<ul> -<li>Get the R code for a <code>LineWise</code> step:</li> -</ul> -<pre><code class="language-r">codeLine(sal, step = &quot;export_iris&quot;) -</code></pre> -<pre><code>## export_iris -## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) -</code></pre> -<ul> -<li>View all the objects in the running environment:</li> -</ul> -<pre><code class="language-r">viewEnvir(sal) -</code></pre> -<pre><code>## &lt;environment: 0x55bbae3bc680&gt; +</code></pre> +<pre><code class="language-r">getColumn(sal, &quot;targetsWF&quot;, step = &quot;gzip&quot;, column = &quot;FileName&quot;) +</code></pre> +<pre><code>## SE VE VI +## &quot;results/setosa.csv&quot; &quot;results/versicolor.csv&quot; &quot;results/virginica.csv&quot; +</code></pre> +<ul> +<li>Get the R code for a <code>LineWise</code> step:</li> +</ul> +<pre><code class="language-r">codeLine(sal, step = &quot;export_iris&quot;) +</code></pre> +<pre><code>## export_iris +## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +</code></pre> +<ul> +<li>View all the objects in the running environment:</li> +</ul> +<pre><code class="language-r">viewEnvir(sal) +</code></pre> +<pre><code>## &lt;environment: 0x55bbae3bc680&gt; ## character(0) -</code></pre> -<ul> -<li>Copy one or multiple objects from the running environment to a new environment:</li> -</ul> -<pre><code class="language-r">copyEnvir(sal, list = c(&quot;plot&quot;), new.env = globalenv(), silent = FALSE) -</code></pre> -<pre><code>## &lt;environment: 0x55bbae3bc680&gt; -## Copying to 'new.env': +</code></pre> +<ul> +<li>Copy one or multiple objects from the running environment to a new environment:</li> +</ul> +<pre><code class="language-r">copyEnvir(sal, list = c(&quot;plot&quot;), new.env = globalenv(), silent = FALSE) +</code></pre> +<pre><code>## &lt;environment: 0x55bbae3bc680&gt; +## Copying to 'new.env': ## plot -</code></pre> -<ul> -<li>Accessing the <code>*.yml</code> data</li> -</ul> -<pre><code class="language-r">yamlinput(sal, step = &quot;gzip&quot;) -</code></pre> -<pre><code>## $file +</code></pre> +<ul> +<li>Accessing the <code>*.yml</code> data</li> +</ul> +<pre><code class="language-r">yamlinput(sal, step = &quot;gzip&quot;) +</code></pre> +<pre><code>## $file ## $file$class ## [1] &quot;File&quot; -## +## ## $file$path ## [1] &quot;_FILE_PATH_&quot; -## -## +## +## ## $SampleName ## [1] &quot;_SampleName_&quot; -## +## ## $ext ## [1] &quot;csv.gz&quot; -## +## ## $results_path ## $results_path$class ## [1] &quot;Directory&quot; -## +## ## $results_path$path ## [1] &quot;./results&quot; -</code></pre> -<h2 id="subsetting-the-workflow-details">Subsetting the workflow details</h2> -<ul> -<li>The <code>SYSargsList</code> class and its subsetting operator <code>[</code>:</li> -</ul> -<pre><code class="language-r">sal[1] -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## -</code></pre> -<pre><code class="language-r">sal[1:3] -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gzip -## cmdlist: 3 | Pending: 3 -## 3. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 3.1. gunzip -## cmdlist: 3 | Pending: 3 -## -</code></pre> -<pre><code class="language-r">sal[c(1, 3)] -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gunzip -## cmdlist: 3 | Pending: 3 -## -</code></pre> -<ul> -<li>The <code>SYSargsList</code> class and its subsetting by steps and input samples:</li> -</ul> -<pre><code class="language-r">sal_sub &lt;- subset(sal, subset_steps = c(2, 3), input_targets = (&quot;SE&quot;), keep_steps = TRUE) +</code></pre> +<h2 id="subsetting-the-workflow-details">Subsetting the workflow details</h2> +<ul> +<li>The <code>SYSargsList</code> class and its subsetting operator <code>[</code>:</li> +</ul> +<pre><code class="language-r">sal[1] +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## +</code></pre> +<pre><code class="language-r">sal[1:3] +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gzip +## cmdlist: 3 | Pending: 3 +## 3. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 3.1. gunzip +## cmdlist: 3 | Pending: 3 +## +</code></pre> +<pre><code class="language-r">sal[c(1, 3)] +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gunzip +## cmdlist: 3 | Pending: 3 +## +</code></pre> +<ul> +<li>The <code>SYSargsList</code> class and its subsetting by steps and input samples:</li> +</ul> +<pre><code class="language-r">sal_sub &lt;- subset(sal, subset_steps = c(2, 3), input_targets = (&quot;SE&quot;), keep_steps = TRUE) stepsWF(sal_sub) -</code></pre> -<pre><code>## $export_iris -## Instance of 'LineWise' -## Code Chunk length: 1 -## +</code></pre> +<pre><code>## $export_iris +## Instance of 'LineWise' +## Code Chunk length: 1 +## ## $gzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 1 (SE...SE), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 1, output: 1 -## cmdlist: 1 -## Sub Steps: -## 1. gzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 1 (SE...SE), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 1, output: 1 +## cmdlist: 1 +## Sub Steps: +## 1. gzip (rendered: TRUE) +## +## +## ## $gunzip -## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 1 (SE...SE), targetsheader: 1 (lines) -## modules: 0 -## wf: 1, clt: 1, yamlinput: 4 (inputs) -## input: 1, output: 1 -## cmdlist: 1 -## Sub Steps: -## 1. gunzip (rendered: TRUE) -## -## -## +## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 1 (SE...SE), targetsheader: 1 (lines) +## modules: 0 +## wf: 1, clt: 1, yamlinput: 4 (inputs) +## input: 1, output: 1 +## cmdlist: 1 +## Sub Steps: +## 1. gunzip (rendered: TRUE) +## +## +## ## $iris_stats -## Instance of 'LineWise' -## Code Chunk length: 5 -</code></pre> -<pre><code class="language-r">targetsWF(sal_sub) -</code></pre> -<pre><code>## $export_iris +## Instance of 'LineWise' +## Code Chunk length: 5 +</code></pre> +<pre><code class="language-r">targetsWF(sal_sub) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 0 rows and 0 columns -## +## ## $gzip ## DataFrame with 1 row and 2 columns -## FileName SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/setosa.csv SE -## +## FileName SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/setosa.csv SE +## ## $gunzip ## DataFrame with 1 row and 2 columns -## gzip_file SampleName -## &lt;character&gt; &lt;character&gt; -## 1 results/SE.csv.gz SE -## +## gzip_file SampleName +## &lt;character&gt; &lt;character&gt; +## 1 results/SE.csv.gz SE +## ## $iris_stats ## DataFrame with 0 rows and 0 columns -</code></pre> -<pre><code class="language-r">outfiles(sal_sub) -</code></pre> -<pre><code>## $export_iris +</code></pre> +<pre><code class="language-r">outfiles(sal_sub) +</code></pre> +<pre><code>## $export_iris ## DataFrame with 0 rows and 0 columns -## +## ## $gzip ## DataFrame with 1 row and 1 column -## gzip_file -## &lt;character&gt; +## gzip_file +## &lt;character&gt; ## 1 results/SE.csv.gz -## +## ## $gunzip ## DataFrame with 1 row and 1 column -## gunzip_file -## &lt;character&gt; +## gunzip_file +## &lt;character&gt; ## 1 results/SE.csv -## +## ## $iris_stats ## DataFrame with 0 rows and 0 columns -</code></pre> -<ul> -<li>The <code>SYSargsList</code> class and its operator <code>+</code></li> -</ul> -<pre><code class="language-r">sal[1] + sal[2] + sal[3] -</code></pre> -<h2 id="replacement-methods">Replacement Methods</h2> -<ul> -<li>Update a <code>input</code> parameter in the workflow</li> -</ul> -<pre><code class="language-r">sal_c &lt;- sal +</code></pre> +<ul> +<li>The <code>SYSargsList</code> class and its operator <code>+</code></li> +</ul> +<pre><code class="language-r">sal[1] + sal[2] + sal[3] +</code></pre> +<h2 id="replacement-methods">Replacement Methods</h2> +<ul> +<li>Update a <code>input</code> parameter in the workflow</li> +</ul> +<pre><code class="language-r">sal_c &lt;- sal ## check values yamlinput(sal_c, step = &quot;gzip&quot;) -</code></pre> -<pre><code>## $file +</code></pre> +<pre><code>## $file ## $file$class ## [1] &quot;File&quot; -## +## ## $file$path ## [1] &quot;_FILE_PATH_&quot; -## -## +## +## ## $SampleName ## [1] &quot;_SampleName_&quot; -## +## ## $ext ## [1] &quot;csv.gz&quot; -## +## ## $results_path ## $results_path$class ## [1] &quot;Directory&quot; -## +## ## $results_path$path ## [1] &quot;./results&quot; -</code></pre> -<pre><code class="language-r">## check on command-line +</code></pre> +<pre><code class="language-r">## check on command-line cmdlist(sal_c, step = &quot;gzip&quot;, targets = 1) -</code></pre> -<pre><code>## $gzip +</code></pre> +<pre><code>## $gzip ## $gzip$SE ## $gzip$SE$gzip -## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; -</code></pre> -<pre><code class="language-r">## Replace +## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.csv.gz&quot; +</code></pre> +<pre><code class="language-r">## Replace yamlinput(sal_c, step = &quot;gzip&quot;, paramName = &quot;ext&quot;) &lt;- &quot;txt.gz&quot; + ## check NEW values yamlinput(sal_c, step = &quot;gzip&quot;) -</code></pre> -<pre><code>## $file +</code></pre> +<pre><code>## $file ## $file$class ## [1] &quot;File&quot; -## +## ## $file$path ## [1] &quot;_FILE_PATH_&quot; -## -## +## +## ## $SampleName ## [1] &quot;_SampleName_&quot; -## +## ## $ext ## [1] &quot;txt.gz&quot; -## +## ## $results_path ## $results_path$class ## [1] &quot;Directory&quot; -## +## ## $results_path$path ## [1] &quot;./results&quot; -</code></pre> -<pre><code class="language-r">## Check on command-line +</code></pre> +<pre><code class="language-r">## Check on command-line cmdlist(sal_c, step = &quot;gzip&quot;, targets = 1) -</code></pre> -<pre><code>## $gzip +</code></pre> +<pre><code>## $gzip ## $gzip$SE ## $gzip$SE$gzip -## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.txt.gz&quot; -</code></pre> -<ul> -<li>Append and Replacement methods for R Code Steps</li> -</ul> -<pre><code class="language-r">appendCodeLine(sal_c, step = &quot;export_iris&quot;, after = 1) &lt;- &quot;log_cal_100 &lt;- log(100)&quot; +## [1] &quot;gzip -c results/setosa.csv &gt; results/SE.txt.gz&quot; +</code></pre> +<ul> +<li>Append and Replacement methods for R Code Steps</li> +</ul> +<pre><code class="language-r">appendCodeLine(sal_c, step = &quot;export_iris&quot;, after = 1) &lt;- &quot;log_cal_100 &lt;- log(100)&quot; codeLine(sal_c, step = &quot;export_iris&quot;) -</code></pre> -<pre><code>## export_iris -## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) -## log_cal_100 &lt;- log(100) -</code></pre> -<pre><code class="language-r">replaceCodeLine(sal_c, step = &quot;export_iris&quot;, line = 2) &lt;- LineWise(code = { -log_cal_100 &lt;- log(50) +</code></pre> +<pre><code>## export_iris +## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +## log_cal_100 &lt;- log(100) +</code></pre> +<pre><code class="language-r">replaceCodeLine(sal_c, step = &quot;export_iris&quot;, line = 2) &lt;- LineWise(code = { + log_cal_100 &lt;- log(50) }) codeLine(sal_c, step = 1) -</code></pre> -<pre><code>## export_iris -## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) -## 3.91202300542815 -</code></pre> -<p>For more details about the <code>LineWise</code> class, please see <a href="#linewise">below</a>.</p> -<ul> -<li>Rename a Step</li> -</ul> -<pre><code class="language-r">renameStep(sal_c, step = 1) &lt;- &quot;newStep&quot; +</code></pre> +<pre><code>## export_iris +## mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path(&quot;results&quot;, paste0(names(split(iris, factor(iris$Species))), &quot;.csv&quot;))) +## 3.91202300542815 +</code></pre> +<p>For more details about the <code>LineWise</code> class, please see <a href="#linewise">below</a>.</p> +<ul> +<li>Rename a Step</li> +</ul> +<pre><code class="language-r">renameStep(sal_c, step = 1) &lt;- &quot;newStep&quot; renameStep(sal_c, c(1, 2)) &lt;- c(&quot;newStep2&quot;, &quot;newIndex&quot;) sal_c -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. newStep2 --&gt; Status: Pending -## 2. newIndex --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gzip -## cmdlist: 3 | Pending: 3 -## 3. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 3.1. gunzip -## cmdlist: 3 | Pending: 3 -## 4. iris_stats --&gt; Status: Pending -## -</code></pre> -<pre><code class="language-r">names(outfiles(sal_c)) -</code></pre> -<pre><code>## [1] &quot;newStep2&quot; &quot;newIndex&quot; &quot;gunzip&quot; &quot;iris_stats&quot; -</code></pre> -<pre><code class="language-r">names(targetsWF(sal_c)) -</code></pre> -<pre><code>## [1] &quot;newStep2&quot; &quot;newIndex&quot; &quot;gunzip&quot; &quot;iris_stats&quot; -</code></pre> -<pre><code class="language-r">dependency(sal_c) -</code></pre> -<pre><code>## $newStep2 +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. newStep2 --&gt; Status: Pending +## 2. newIndex --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gzip +## cmdlist: 3 | Pending: 3 +## 3. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 3.1. gunzip +## cmdlist: 3 | Pending: 3 +## 4. iris_stats --&gt; Status: Pending +## +</code></pre> +<pre><code class="language-r">names(outfiles(sal_c)) +</code></pre> +<pre><code>## [1] &quot;newStep2&quot; &quot;newIndex&quot; &quot;gunzip&quot; &quot;iris_stats&quot; +</code></pre> +<pre><code class="language-r">names(targetsWF(sal_c)) +</code></pre> +<pre><code>## [1] &quot;newStep2&quot; &quot;newIndex&quot; &quot;gunzip&quot; &quot;iris_stats&quot; +</code></pre> +<pre><code class="language-r">dependency(sal_c) +</code></pre> +<pre><code>## $newStep2 ## [1] &quot;&quot; -## +## ## $newIndex ## [1] &quot;newStep2&quot; -## +## ## $gunzip ## [1] &quot;newIndex&quot; -## +## ## $iris_stats ## [1] &quot;newIndex&quot; -</code></pre> -<ul> -<li>Replace a Step</li> -</ul> -<pre><code class="language-r">sal_test &lt;- sal[c(1, 2)] +</code></pre> +<ul> +<li>Replace a Step</li> +</ul> +<pre><code class="language-r">sal_test &lt;- sal[c(1, 2)] replaceStep(sal_test, step = 1, step_name = &quot;gunzip&quot;) &lt;- sal[3] sal_test -</code></pre> -<p>Note: Please use this method with attention, because it can disrupt all -the dependency graphs.</p> -<ul> -<li>Removing a Step</li> -</ul> -<pre><code class="language-r">sal_test &lt;- sal[-2] +</code></pre> +<p>Note: Please use this method with attention, because it can disrupt all +the dependency graphs.</p> +<ul> +<li>Removing a Step</li> +</ul> +<pre><code class="language-r">sal_test &lt;- sal[-2] sal_test -</code></pre> -<pre><code>## Instance of 'SYSargsList': -## WF Steps: -## 1. export_iris --&gt; Status: Pending -## 2. gunzip --&gt; Status: Pending -## Total Files: 3 | Existing: 0 | Missing: 3 -## 2.1. gunzip -## cmdlist: 3 | Pending: 3 -## 3. iris_stats --&gt; Status: Pending -## -</code></pre> -<h1 id="references">References</h1>Sp: Workflow steps overview/sp/spr/steps/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/steps/ -<!-- +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. export_iris --&gt; Status: Pending +## 2. gunzip --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 2.1. gunzip +## cmdlist: 3 | Pending: 3 +## 3. iris_stats --&gt; Status: Pending +## +</code></pre> +<h1 id="references">References</h1> + + + + + + Sp: Workflow steps overview + /sp/spr/steps/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/steps/ + + + + <!-- - Compile from command-line -Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h2 id="define-environment-settings-and-samples">Define environment settings and samples</h2> -<p>A typical workflow starts with generating the expected working environment +</script> +<h2 id="define-environment-settings-and-samples">Define environment settings and samples</h2> +<p>A typical workflow starts with generating the expected working environment containing the proper directory structure, input files, and parameter settings. To simplify this task, one can load one of the existing NGS workflows templates -provided by <em><code>systemPipeRdata</code></em> into the current working directory. The -following does this for the <em><code>rnaseq</code></em> template. The name of the resulting -workflow directory can be specified under the <em><code>mydirname</code></em> argument. The -default <em><code>NULL</code></em> uses the name of the chosen workflow. An error is issued if a +provided by <em><code>systemPipeRdata</code></em> into the current working directory. The +following does this for the <em><code>rnaseq</code></em> template. The name of the resulting +workflow directory can be specified under the <em><code>mydirname</code></em> argument. The +default <em><code>NULL</code></em> uses the name of the chosen workflow. An error is issued if a directory of the same name and path exists already. On Linux and OS X systems one can also create new workflow instances from the command-line of a terminal as shown -<a href="http://bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRdata.html#generate-workflow-template">here</a>. -To apply workflows to custom data, the user needs to modify the <em><code>targets</code></em> file and if -necessary update the corresponding <em><code>.cwl</code></em> and <em><code>.yml</code></em> files. A collection of pre-generated <em><code>.cwl</code></em> and <em><code>.yml</code></em> files are provided in the <em><code>param/cwl</code></em> subdirectory of each workflow template. They -are also viewable in the GitHub repository of <em><code>systemPipeRdata</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/tree/master/inst/extdata/param">see -here</a>).</p> -<pre><code class="language-r">library(systemPipeR) +<a href="http://bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRdata.html#generate-workflow-template">here</a>. +To apply workflows to custom data, the user needs to modify the <em><code>targets</code></em> file and if +necessary update the corresponding <em><code>.cwl</code></em> and <em><code>.yml</code></em> files. A collection of pre-generated <em><code>.cwl</code></em> and <em><code>.yml</code></em> files are provided in the <em><code>param/cwl</code></em> subdirectory of each workflow template. They +are also viewable in the GitHub repository of <em><code>systemPipeRdata</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/tree/master/inst/extdata/param">see +here</a>).</p> +<pre><code class="language-r">library(systemPipeR) library(systemPipeRdata) genWorkenvir(workflow = &quot;rnaseq&quot;, mydirname = NULL) setwd(&quot;rnaseq&quot;) -</code></pre> -<h2 id="read-preprocessing">Read Preprocessing</h2> -<h3 id="preprocessing-with-preprocessreads-function">Preprocessing with <em><code>preprocessReads</code></em> function</h3> -<p>The function <em><code>preprocessReads</code></em> allows to apply predefined or custom +</code></pre> +<h2 id="read-preprocessing">Read Preprocessing</h2> +<h3 id="preprocessing-with-preprocessreads-function">Preprocessing with <em><code>preprocessReads</code></em> function</h3> +<p>The function <em><code>preprocessReads</code></em> allows to apply predefined or custom read preprocessing functions to all FASTQ files referenced in a -<em><code>SYSargs2</code></em> container, such as quality filtering or adaptor trimming +<em><code>SYSargs2</code></em> container, such as quality filtering or adaptor trimming routines. The paths to the resulting output FASTQ files are stored in the -<em><code>output</code></em> slot of the <em><code>SYSargs2</code></em> object. Internally, -<em><code>preprocessReads</code></em> uses the <em><code>FastqStreamer</code></em> function from -the <em><code>ShortRead</code></em> package to stream through large FASTQ files in a +<em><code>output</code></em> slot of the <em><code>SYSargs2</code></em> object. Internally, +<em><code>preprocessReads</code></em> uses the <em><code>FastqStreamer</code></em> function from +the <em><code>ShortRead</code></em> package to stream through large FASTQ files in a memory-efficient manner. The following example performs adaptor trimming with -the <em><code>trimLRPatterns</code></em> function from the <em><code>Biostrings</code></em> package. +the <em><code>trimLRPatterns</code></em> function from the <em><code>Biostrings</code></em> package. After the trimming step a new targets file is generated (here -<em><code>targets_trimPE.txt</code></em>) containing the paths to the trimmed FASTQ files. +<em><code>targets_trimPE.txt</code></em>) containing the paths to the trimmed FASTQ files. The new targets file can be used for the next workflow step with an updated -<em><code>SYSargs2</code></em> instance, <em>e.g.</em> running the NGS alignments with the -trimmed FASTQ files.</p> -<p>Construct <em><code>SYSargs2</code></em> object from <em><code>cwl</code></em> and <em><code>yml</code></em> param and <em><code>targets</code></em> files.</p> -<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +<em><code>SYSargs2</code></em> instance, <em>e.g.</em> running the NGS alignments with the +trimmed FASTQ files.</p> +<p>Construct <em><code>SYSargs2</code></em> object from <em><code>cwl</code></em> and <em><code>yml</code></em> param and <em><code>targets</code></em> files.</p> +<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/preprocessReads/trim-pe&quot;, package = &quot;systemPipeR&quot;) trim &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;trim-pe.cwl&quot;, input_file = &quot;trim-pe.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) trim &lt;- renderWF(trim, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) trim output(trim)[1:2] -</code></pre> -<pre><code class="language-r">preprocessReads(args = trim, Fct = &quot;trimLRPatterns(Rpattern='GCCCGGGTAA', -subject=fq)&quot;, -batchsize = 1e+05, overwrite = TRUE, compress = TRUE) -</code></pre> -<p>The following example shows how one can design a custom read preprocessing function -using utilities provided by the <em><code>ShortRead</code></em> package, and then run it -in batch mode with the <em>‘preprocessReads’</em> function (here on paired-end reads).</p> -<pre><code class="language-r">filterFct &lt;- function(fq, cutoff = 20, Nexceptions = 0) { -qcount &lt;- rowSums(as(quality(fq), &quot;matrix&quot;) &lt;= cutoff, na.rm = TRUE) -# Retains reads where Phred scores are &gt;= cutoff with N exceptions -fq[qcount &lt;= Nexceptions] +</code></pre> +<pre><code class="language-r">preprocessReads(args = trim, Fct = &quot;trimLRPatterns(Rpattern='GCCCGGGTAA', + subject=fq)&quot;, + batchsize = 1e+05, overwrite = TRUE, compress = TRUE) +</code></pre> +<p>The following example shows how one can design a custom read preprocessing function +using utilities provided by the <em><code>ShortRead</code></em> package, and then run it +in batch mode with the <em>‘preprocessReads’</em> function (here on paired-end reads).</p> +<pre><code class="language-r">filterFct &lt;- function(fq, cutoff = 20, Nexceptions = 0) { + qcount &lt;- rowSums(as(quality(fq), &quot;matrix&quot;) &lt;= cutoff, na.rm = TRUE) + # Retains reads where Phred scores are &gt;= cutoff with N exceptions + fq[qcount &lt;= Nexceptions] } preprocessReads(args = trim, Fct = &quot;filterFct(fq, cutoff=20, Nexceptions=0)&quot;, batchsize = 1e+05) -</code></pre> -<h3 id="preprocessing-with-trimgalore">Preprocessing with TrimGalore!</h3> -<p><a href="http://www.bioinformatics.babraham.ac.uk/projects/trim_galore/">TrimGalore!</a> is +</code></pre> +<h3 id="preprocessing-with-trimgalore">Preprocessing with TrimGalore!</h3> +<p><a href="http://www.bioinformatics.babraham.ac.uk/projects/trim_galore/">TrimGalore!</a> is a wrapper tool to consistently apply quality and adapter trimming to fastq files, with some extra functionality for removing Reduced Representation Bisulfite-Seq -(RRBS) libraries.</p> -<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) +(RRBS) libraries.</p> +<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/trim_galore/trim_galore-se&quot;, package = &quot;systemPipeR&quot;) trimG &lt;- loadWorkflow(targets = targets, wf_file = &quot;trim_galore-se.cwl&quot;, input_file = &quot;trim_galore-se.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) trimG &lt;- renderWF(trimG, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) trimG cmdlist(trimG)[1:2] output(trimG)[1:2] ## Run Single Machine Option trimG &lt;- runCommandline(trimG[1], make_bam = FALSE) -</code></pre> -<h3 id="preprocessing-with-trimmomatic">Preprocessing with Trimmomatic</h3> -<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<h3 id="preprocessing-with-trimmomatic">Preprocessing with Trimmomatic</h3> +<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/trimmomatic/trimmomatic-pe&quot;, package = &quot;systemPipeR&quot;) trimM &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;trimmomatic-pe.cwl&quot;, input_file = &quot;trimmomatic-pe.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) trimM &lt;- renderWF(trimM, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) trimM cmdlist(trimM)[1:2] output(trimM)[1:2] ## Run Single Machine Option trimM &lt;- runCommandline(trimM[1], make_bam = FALSE) -</code></pre> -<h2 id="fastq-quality-report">FASTQ quality report</h2> -<p>The following <em><code>seeFastq</code></em> and <em><code>seeFastqPlot</code></em> functions generate and plot a series of +</code></pre> +<h2 id="fastq-quality-report">FASTQ quality report</h2> +<p>The following <em><code>seeFastq</code></em> and <em><code>seeFastqPlot</code></em> functions generate and plot a series of useful quality statistics for a set of FASTQ files including per cycle quality box plots, base proportions, base-level quality trends, relative k-mer diversity, length and occurrence distribution of reads, number of reads above -quality cutoffs and mean quality distribution. -The function <em><code>seeFastq</code></em> computes the quality statistics and stores the results in a -relatively small list object that can be saved to disk with <em><code>save()</code></em> and -reloaded with <em><code>load()</code></em> for later plotting. The argument <em><code>klength</code></em> specifies the -k-mer length and <em><code>batchsize</code></em> the number of reads to a random sample from each -FASTQ file.</p> -<pre><code class="language-r">fqlist &lt;- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8) +quality cutoffs and mean quality distribution.<br> +The function <em><code>seeFastq</code></em> computes the quality statistics and stores the results in a +relatively small list object that can be saved to disk with <em><code>save()</code></em> and +reloaded with <em><code>load()</code></em> for later plotting. The argument <em><code>klength</code></em> specifies the +k-mer length and <em><code>batchsize</code></em> the number of reads to a random sample from each +FASTQ file.</p> +<pre><code class="language-r">fqlist &lt;- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8) pdf(&quot;./results/fastqReport.pdf&quot;, height = 18, width = 4 * length(fqlist)) seeFastqPlot(fqlist) dev.off() -</code></pre> -<center> -<img src="fastqReport.png"> -</center> -<div align="center"> -<p><strong>Figure 5:</strong> FASTQ quality report</p> -</div> -</br> -<p>Parallelization of FASTQ quality report on a single machine with multiple cores.</p> -<pre><code class="language-r">f &lt;- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) +</code></pre> +<center> +<img src="fastqReport.png"> +</center> +<div align="center"> +<p><strong>Figure 1:</strong> FASTQ quality report</p> +</div> +</br> +<p>Parallelization of FASTQ quality report on a single machine with multiple cores.</p> +<pre><code class="language-r">f &lt;- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) fqlist &lt;- bplapply(seq(along = trim), f, BPPARAM = MulticoreParam(workers = 4)) seeFastqPlot(unlist(fqlist, recursive = FALSE)) -</code></pre> -<p>Parallelization of FASTQ quality report via scheduler (<em>e.g.</em> Slurm) across several compute nodes.</p> -<pre><code class="language-r">library(BiocParallel) +</code></pre> +<p>Parallelization of FASTQ quality report via scheduler (<em>e.g.</em> Slurm) across several compute nodes.</p> +<pre><code class="language-r">library(BiocParallel) library(batchtools) f &lt;- function(x) { -library(systemPipeR) -targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) -dir_path &lt;- system.file(&quot;extdata/cwl/preprocessReads/trim-pe&quot;, package = &quot;systemPipeR&quot;) -trim &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;trim-pe.cwl&quot;, input_file = &quot;trim-pe.yml&quot;, -dir_path = dir_path) -trim &lt;- renderWF(trim, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) -seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) + library(systemPipeR) + targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) + dir_path &lt;- system.file(&quot;extdata/cwl/preprocessReads/trim-pe&quot;, package = &quot;systemPipeR&quot;) + trim &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;trim-pe.cwl&quot;, input_file = &quot;trim-pe.yml&quot;, + dir_path = dir_path) + trim &lt;- renderWF(trim, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, + SampleName = &quot;_SampleName_&quot;)) + seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8) } resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param &lt;- BatchtoolsParam(workers = 4, cluster = &quot;slurm&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -resources = resources) + resources = resources) fqlist &lt;- bplapply(seq(along = trim), f, BPPARAM = param) seeFastqPlot(unlist(fqlist, recursive = FALSE)) -</code></pre> -<h2 id="ngs-alignment-software">NGS Alignment software</h2> -<p>After quality control, the sequence reads can be aligned to a reference genome or +</code></pre> +<h2 id="ngs-alignment-software">NGS Alignment software</h2> +<p>After quality control, the sequence reads can be aligned to a reference genome or transcriptome database. The following sessions present some NGS sequence alignment software. Select the most accurate aligner and determining the optimal parameter -for your custom data set project.</p> -<p>For all the following examples, it is necessary to install the respective software -and export the <code>PATH</code> accordingly. If it is available <a href="http://modules.sourceforge.net/">Environment Module</a> -in the system, you can load all the request software with <em><code>moduleload(args)</code></em> function.</p> -<h3 id="alignment-with-hisat2-using-sysargs2">Alignment with <code>HISAT2</code> using <em><code>SYSargs2</code></em></h3> -<p>The following steps will demonstrate how to use the short read aligner <code>Hisat2</code> +for your custom data set project.</p> +<p>For all the following examples, it is necessary to install the respective software +and export the <code>PATH</code> accordingly. If it is available <a href="http://modules.sourceforge.net/">Environment Module</a> +in the system, you can load all the request software with <em><code>moduleload(args)</code></em> function.</p> +<h3 id="alignment-with-hisat2-using-sysargs2">Alignment with <code>HISAT2</code> using <em><code>SYSargs2</code></em></h3> +<p>The following steps will demonstrate how to use the short read aligner <code>Hisat2</code> (Kim, Langmead, and Salzberg 2015) in both interactive job submissions and batch submissions to -queuing systems of clusters using the <em><code>systemPipeR's</code></em> new CWL command-line interface.</p> -<p>The parameter settings of the aligner are defined in the <code>hisat2-mapping-se.cwl</code> -and <code>hisat2-mapping-se.yml</code> files. The following shows how to construct the -corresponding <em>SYSargs2</em> object, here <em>args</em>.</p> -<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) +queuing systems of clusters using the <em><code>systemPipeR's</code></em> new CWL command-line interface.</p> +<p>The parameter settings of the aligner are defined in the <code>hisat2-mapping-se.cwl</code> +and <code>hisat2-mapping-se.yml</code> files. The following shows how to construct the +corresponding <em>SYSargs2</em> object, here <em>args</em>.</p> +<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/hisat2/hisat2-se&quot;, package = &quot;systemPipeR&quot;) args &lt;- loadWorkflow(targets = targets, wf_file = &quot;hisat2-mapping-se.cwl&quot;, input_file = &quot;hisat2-mapping-se.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) args &lt;- renderWF(args, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) args -</code></pre> -<pre><code>## Instance of 'SYSargs2': -## Slot names/accessors: -## targets: 18 (M1A...V12B), targetsheader: 4 (lines) -## modules: 1 -## wf: 0, clt: 1, yamlinput: 7 (components) -## input: 18, output: 18 -## cmdlist: 18 -## WF Steps: -## 1. hisat2-mapping-se (rendered: TRUE) -</code></pre> -<pre><code class="language-r">cmdlist(args)[1:2] -</code></pre> -<pre><code>## $M1A +</code></pre> +<pre><code>## Instance of 'SYSargs2': +## Slot names/accessors: +## targets: 18 (M1A...V12B), targetsheader: 4 (lines) +## modules: 1 +## wf: 0, clt: 1, yamlinput: 7 (inputs) +## input: 18, output: 18 +## cmdlist: 18 +## Sub Steps: +## 1. hisat2-mapping-se (rendered: TRUE) +</code></pre> +<pre><code class="language-r">cmdlist(args)[1:2] +</code></pre> +<pre><code>## $M1A ## $M1A$`hisat2-mapping-se` -## [1] &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; -## -## +## [1] &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; +## +## ## $M1B ## $M1B$`hisat2-mapping-se` -## [1] &quot;hisat2 -S ./results/M1B.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446028_1.fastq.gz --threads 4&quot; -</code></pre> -<pre><code class="language-r">output(args)[1:2] -</code></pre> -<pre><code>## $M1A +## [1] &quot;hisat2 -S ./results/M1B.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446028_1.fastq.gz --threads 4&quot; +</code></pre> +<pre><code class="language-r">output(args)[1:2] +</code></pre> +<pre><code>## $M1A ## $M1A$`hisat2-mapping-se` ## [1] &quot;./results/M1A.sam&quot; -## -## +## +## ## $M1B ## $M1B$`hisat2-mapping-se` ## [1] &quot;./results/M1B.sam&quot; -</code></pre> -<p>Subsetting <em><code>SYSargs2</code></em> class slots for each workflow step.</p> -<pre><code class="language-r">subsetWF(args, slot = &quot;input&quot;, subset = &quot;FileName&quot;)[1:2] ## Subsetting the input files for this particular workflow -</code></pre> -<pre><code>## M1A M1B +</code></pre> +<p>Subsetting <em><code>SYSargs2</code></em> class slots for each workflow step.</p> +<pre><code class="language-r">subsetWF(args, slot = &quot;input&quot;, subset = &quot;FileName&quot;)[1:2] ## Subsetting the input files for this particular workflow +</code></pre> +<pre><code>## M1A M1B ## &quot;./data/SRR446027_1.fastq.gz&quot; &quot;./data/SRR446028_1.fastq.gz&quot; -</code></pre> -<pre><code class="language-r">subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1)[1:2] ## Subsetting the output files for one particular step in the workflow -</code></pre> -<pre><code>## M1A M1B +</code></pre> +<pre><code class="language-r">subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1)[1:2] ## Subsetting the output files for one particular step in the workflow +</code></pre> +<pre><code>## M1A M1B ## &quot;./results/M1A.sam&quot; &quot;./results/M1B.sam&quot; -</code></pre> -<pre><code class="language-r">subsetWF(args, slot = &quot;step&quot;, subset = 1)[1] ## Subsetting the command-lines for one particular step in the workflow -</code></pre> -<pre><code>## M1A -## &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; -</code></pre> -<pre><code class="language-r">subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1, delete = TRUE)[1] ## DELETING specific output files -</code></pre> -<pre><code>## The subset cannot be deleted: no such file -## M1A +</code></pre> +<pre><code class="language-r">subsetWF(args, slot = &quot;step&quot;, subset = 1)[1] ## Subsetting the command-lines for one particular step in the workflow +</code></pre> +<pre><code>## M1A +## &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 --min-intronlen 30 --max-intronlen 3000 -U ./data/SRR446027_1.fastq.gz --threads 4&quot; +</code></pre> +<pre><code class="language-r">subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1, delete = TRUE)[1] ## DELETING specific output files +</code></pre> +<pre><code>## The subset cannot be deleted: no such file + +## M1A ## &quot;./results/M1A.sam&quot; -</code></pre> -<p>Build <code>Hisat2</code> index.</p> -<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/hisat2/hisat2-idx&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<p>Build <code>Hisat2</code> index.</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/hisat2/hisat2-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;hisat2-index.cwl&quot;, input_file = &quot;hisat2-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx cmdlist(idx) + ## Run runCommandline(idx, make_bam = FALSE) -</code></pre> -<h4 id="interactive-job-submissions-in-a-single-machine">Interactive job submissions in a single machine</h4> -<p>To simplify the short read alignment execution for the user, the command-line -can be run with the <em><code>runCommandline</code></em> function. +</code></pre> +<h4 id="interactive-job-submissions-in-a-single-machine">Interactive job submissions in a single machine</h4> +<p>To simplify the short read alignment execution for the user, the command-line +can be run with the <em><code>runCommandline</code></em> function. The execution will be on a single machine without submitting to a queuing system of a computer cluster. This way, the input FASTQ files will be processed sequentially. -By default <em><code>runCommandline</code></em> auto detects SAM file outputs and converts them -to sorted and indexed BAM files, using internally the <code>Rsamtools</code> package -(Morgan et al. 2019). Besides, <em><code>runCommandline</code></em> allows the user to create a dedicated +By default <em><code>runCommandline</code></em> auto detects SAM file outputs and converts them +to sorted and indexed BAM files, using internally the <code>Rsamtools</code> package +(Morgan et al. 2019). Besides, <em><code>runCommandline</code></em> allows the user to create a dedicated results folder for each workflow and a sub-folder for each sample -defined in the <em>targets</em> file. This includes all the output and log files for each +defined in the <em>targets</em> file. This includes all the output and log files for each step. When these options are used, the output location will be updated by default -and can be assigned to the same object.</p> -<pre><code class="language-r">runCommandline(args, make_bam = FALSE) ## generates alignments and writes *.sam files to ./results folder -args &lt;- runCommandline(args, make_bam = TRUE) ## same as above but writes files and converts *.sam files to sorted and indexed BAM files. Assigning the new extention of the output files to the object args. -</code></pre> -<p>If available, multiple CPU cores can be used for processing each file. The number -of CPU cores (here 4) to use for each process is defined in the <em><code>*.yml</code></em> file. -With <em><code>yamlinput(args)['thread']</code></em> one can return this value from the <em><code>SYSargs2</code></em> object.</p> -<h4 id="parallelization-on-clusters">Parallelization on clusters</h4> -<p>Alternatively, the computation can be greatly accelerated by processing many files +and can be assigned to the same object.</p> +<pre><code class="language-r">runCommandline(args, make_bam = FALSE) ## generates alignments and writes *.sam files to ./results folder +args &lt;- runCommandline(args, make_bam = TRUE) ## same as above but writes files and converts *.sam files to sorted and indexed BAM files. Assigning the new extention of the output files to the object args. +</code></pre> +<p>If available, multiple CPU cores can be used for processing each file. The number +of CPU cores (here 4) to use for each process is defined in the <em><code>*.yml</code></em> file. +With <em><code>yamlinput(args)['thread']</code></em> one can return this value from the <em><code>SYSargs2</code></em> object.</p> +<h4 id="parallelization-on-clusters">Parallelization on clusters</h4> +<p>Alternatively, the computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing -system is used for load balancing. For this the <em><code>clusterRun</code></em> function submits +system is used for load balancing. For this the <em><code>clusterRun</code></em> function submits the computing requests to the scheduler using the run specifications -defined by <em><code>runCommandline</code></em>.</p> -<p>To avoid over-subscription of CPU cores on the compute nodes, the value from -<em><code>yamlinput(args)['thread']</code></em> is passed on to the submission command, here <em><code>ncpus</code></em> -in the <em><code>resources</code></em> list object. The number of independent parallel cluster -processes is defined under the <em><code>Njobs</code></em> argument. The following example will run +defined by <em><code>runCommandline</code></em>.</p> +<p>To avoid over-subscription of CPU cores on the compute nodes, the value from +<em><code>yamlinput(args)['thread']</code></em> is passed on to the submission command, here <em><code>ncpus</code></em> +in the <em><code>resources</code></em> list object. The number of independent parallel cluster +processes is defined under the <em><code>Njobs</code></em> argument. The following example will run 18 processes in parallel using for each 4 CPU cores. If the resources available on a cluster allow running all 18 processes at the same time then the shown sample -submission will utilize in total 72 CPU cores. Note, <em><code>clusterRun</code></em> can be used -with most queueing systems as it is based on utilities from the <em><code>batchtools</code></em> -package which supports the use of template files (<em><code>*.tmpl</code></em>) for defining the +submission will utilize in total 72 CPU cores. Note, <em><code>clusterRun</code></em> can be used +with most queueing systems as it is based on utilities from the <em><code>batchtools</code></em> +package which supports the use of template files (<em><code>*.tmpl</code></em>) for defining the run parameters of different schedulers. To run the following code, one needs to -have both a conf file (see <em><code>.batchtools.conf.R</code></em> samples <a href="https://mllg.github.io/batchtools/">here</a>) -and a template file (see <em><code>*.tmpl</code></em> samples <a href="https://github.com/mllg/batchtools/tree/master/inst/templates">here</a>) +have both a conf file (see <em><code>.batchtools.conf.R</code></em> samples <a href="https://mllg.github.io/batchtools/">here</a>) +and a template file (see <em><code>*.tmpl</code></em> samples <a href="https://github.com/mllg/batchtools/tree/master/inst/templates">here</a>) for the queueing available on a system. The following example uses the sample -conf and template files for the Slurm scheduler provided by this package.</p> -<pre><code class="language-r">library(batchtools) +conf and template files for the Slurm scheduler provided by this package.</p> +<pre><code class="language-r">library(batchtools) resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg &lt;- clusterRun(args, FUN = runCommandline, more.args = list(args = args, make_bam = TRUE, -dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -Njobs = 18, runid = &quot;01&quot;, resourceList = resources) + dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, + Njobs = 18, runid = &quot;01&quot;, resourceList = resources) getStatus(reg = reg) waitForJobs(reg = reg) -</code></pre> -<p>Check and update the output location if necessary.</p> -<pre><code class="language-r">args &lt;- output_update(args, dir = FALSE, replace = TRUE, extension = c(&quot;.sam&quot;, &quot;.bam&quot;)) ## Updates the output(args) to the right location in the subfolders +</code></pre> +<p>Check and update the output location if necessary.</p> +<pre><code class="language-r">args &lt;- output_update(args, dir = FALSE, replace = TRUE, extension = c(&quot;.sam&quot;, &quot;.bam&quot;)) ## Updates the output(args) to the right location in the subfolders output(args) -</code></pre> -<h4 id="create-new-targets-file">Create new targets file</h4> -<p>To establish the connectivity to the next workflow step, one can write a new -<em>targets</em> file with the <em><code>writeTargetsout</code></em> function. The new <em>targets</em> file -serves as input to the next <em><code>loadWorkflow</code></em> and <em><code>renderWF</code></em> call.</p> -<pre><code class="language-r">names(clt(args)) +</code></pre> +<h4 id="create-new-targets-file">Create new targets file</h4> +<p>To establish the connectivity to the next workflow step, one can write a new +<em>targets</em> file with the <em><code>writeTargetsout</code></em> function. The new <em>targets</em> file +serves as input to the next <em><code>loadWorkflow</code></em> and <em><code>renderWF</code></em> call.</p> +<pre><code class="language-r">names(clt(args)) writeTargetsout(x = args, file = &quot;default&quot;, step = 1, new_col = &quot;FileName&quot;, new_col_output_index = 1, -overwrite = TRUE) -</code></pre> -<h4 id="alignment-with-hisat2-and-samtools">Alignment with <code>HISAT2</code> and <code>SAMtools</code></h4> -<p>Alternatively, it possible to build an workflow with <code>HISAT2</code> and <code>SAMtools</code>.</p> -<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) + overwrite = TRUE) +</code></pre> +<h4 id="alignment-with-hisat2-and-samtools">Alignment with <code>HISAT2</code> and <code>SAMtools</code></h4> +<p>Alternatively, it possible to build an workflow with <code>HISAT2</code> and <code>SAMtools</code>.</p> +<pre><code class="language-r">targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/workflow-hisat2/workflow-hisat2-se&quot;, package = &quot;systemPipeR&quot;) WF &lt;- loadWorkflow(targets = targets, wf_file = &quot;workflow_hisat2-se.cwl&quot;, input_file = &quot;workflow_hisat2-se.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) WF &lt;- renderWF(WF, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) WF cmdlist(WF)[1:2] output(WF)[1:2] -</code></pre> -<h3 id="alignment-with-tophat2">Alignment with <em><code>Tophat2</code></em></h3> -<p>The NGS reads of this project can also be aligned against the reference genome -sequence using <code>Bowtie2/TopHat2</code> (Kim et al. 2013; Langmead and Salzberg 2012).</p> -<p>Build <em><code>Bowtie2</code></em> index.</p> -<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bowtie2/bowtie2-idx&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<h3 id="alignment-with-tophat2">Alignment with <em><code>Tophat2</code></em></h3> +<p>The NGS reads of this project can also be aligned against the reference genome +sequence using <code>Bowtie2/TopHat2</code> (Kim et al. 2013; Langmead and Salzberg 2012).</p> +<p>Build <em><code>Bowtie2</code></em> index.</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bowtie2/bowtie2-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;bowtie2-index.cwl&quot;, input_file = &quot;bowtie2-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx cmdlist(idx) + ## Run in single machine runCommandline(idx, make_bam = FALSE) -</code></pre> -<p>The parameter settings of the aligner are defined in the <code>tophat2-mapping-pe.cwl</code> -and <code>tophat2-mapping-pe.yml</code> files. The following shows how to construct the -corresponding <em>SYSargs2</em> object, here <em>tophat2PE</em>.</p> -<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<p>The parameter settings of the aligner are defined in the <code>tophat2-mapping-pe.cwl</code> +and <code>tophat2-mapping-pe.yml</code> files. The following shows how to construct the +corresponding <em>SYSargs2</em> object, here <em>tophat2PE</em>.</p> +<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/tophat2/tophat2-pe&quot;, package = &quot;systemPipeR&quot;) tophat2PE &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;tophat2-mapping-pe.cwl&quot;, -input_file = &quot;tophat2-mapping-pe.yml&quot;, dir_path = dir_path) + input_file = &quot;tophat2-mapping-pe.yml&quot;, dir_path = dir_path) tophat2PE &lt;- renderWF(tophat2PE, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) tophat2PE cmdlist(tophat2PE)[1:2] output(tophat2PE)[1:2] + ## Run in single machine tophat2PE &lt;- runCommandline(tophat2PE[1], make_bam = TRUE) -</code></pre> -<p>Parallelization on clusters.</p> -<pre><code class="language-r">resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) +</code></pre> +<p>Parallelization on clusters.</p> +<pre><code class="language-r">resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg &lt;- clusterRun(tophat2PE, FUN = runCommandline, more.args = list(args = tophat2PE, -make_bam = TRUE, dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -Njobs = 18, runid = &quot;01&quot;, resourceList = resources) + make_bam = TRUE, dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, + Njobs = 18, runid = &quot;01&quot;, resourceList = resources) waitForJobs(reg = reg) -</code></pre> -<p>Create new targets file</p> -<pre><code class="language-r">names(clt(tophat2PE)) +</code></pre> +<p>Create new targets file</p> +<pre><code class="language-r">names(clt(tophat2PE)) writeTargetsout(x = tophat2PE, file = &quot;default&quot;, step = 1, new_col = &quot;tophat2PE&quot;, -new_col_output_index = 1, overwrite = TRUE) -</code></pre> -<h3 id="alignment-with-bowtie2-eg-for-mirna-profiling">Alignment with <em><code>Bowtie2</code></em> (<em>e.g.</em> for miRNA profiling)</h3> -<p>The following example runs <em><code>Bowtie2</code></em> as a single process without submitting it to a cluster.</p> -<p>Building the index:</p> -<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bowtie2/bowtie2-idx&quot;, package = &quot;systemPipeR&quot;) + new_col_output_index = 1, overwrite = TRUE) +</code></pre> +<h3 id="alignment-with-bowtie2-eg-for-mirna-profiling">Alignment with <em><code>Bowtie2</code></em> (<em>e.g.</em> for miRNA profiling)</h3> +<p>The following example runs <em><code>Bowtie2</code></em> as a single process without submitting it to a cluster.</p> +<p>Building the index:</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bowtie2/bowtie2-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;bowtie2-index.cwl&quot;, input_file = &quot;bowtie2-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx cmdlist(idx) + ## Run in single machine runCommandline(idx, make_bam = FALSE) -</code></pre> -<p>Building all the command-line:</p> -<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<p>Building all the command-line:</p> +<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/bowtie2/bowtie2-pe&quot;, package = &quot;systemPipeR&quot;) bowtiePE &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;bowtie2-mapping-pe.cwl&quot;, -input_file = &quot;bowtie2-mapping-pe.yml&quot;, dir_path = dir_path) + input_file = &quot;bowtie2-mapping-pe.yml&quot;, dir_path = dir_path) bowtiePE &lt;- renderWF(bowtiePE, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) bowtiePE cmdlist(bowtiePE)[1:2] output(bowtiePE)[1:2] -</code></pre> -<p>Running all the jobs to computing nodes.</p> -<pre><code class="language-r">resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) +</code></pre> +<p>Running all the jobs to computing nodes.</p> +<pre><code class="language-r">resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg &lt;- clusterRun(bowtiePE, FUN = runCommandline, more.args = list(args = bowtiePE, -dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -Njobs = 18, runid = &quot;01&quot;, resourceList = resources) + dir = FALSE), conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, + Njobs = 18, runid = &quot;01&quot;, resourceList = resources) getStatus(reg = reg) -</code></pre> -<p>Alternatively, it possible to run all the jobs in a single machine.</p> -<pre><code class="language-r">bowtiePE &lt;- runCommandline(bowtiePE) -</code></pre> -<p>Create new targets file.</p> -<pre><code class="language-r">names(clt(bowtiePE)) +</code></pre> +<p>Alternatively, it possible to run all the jobs in a single machine.</p> +<pre><code class="language-r">bowtiePE &lt;- runCommandline(bowtiePE) +</code></pre> +<p>Create new targets file.</p> +<pre><code class="language-r">names(clt(bowtiePE)) writeTargetsout(x = bowtiePE, file = &quot;default&quot;, step = 1, new_col = &quot;bowtiePE&quot;, new_col_output_index = 1, -overwrite = TRUE) -</code></pre> -<h3 id="alignment-with-bwa-mem-eg-for-var-seq">Alignment with <em><code>BWA-MEM</code></em> (<em>e.g.</em> for VAR-Seq)</h3> -<p>The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference</p> -<p>Build the index:</p> -<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bwa/bwa-idx&quot;, package = &quot;systemPipeR&quot;) + overwrite = TRUE) +</code></pre> +<h3 id="alignment-with-bwa-mem-eg-for-var-seq">Alignment with <em><code>BWA-MEM</code></em> (<em>e.g.</em> for VAR-Seq)</h3> +<p>The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference</p> +<p>Build the index:</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl/bwa/bwa-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;bwa-index.cwl&quot;, input_file = &quot;bwa-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx -cmdlist(idx) # Indexes reference genome +cmdlist(idx) # Indexes reference genome + ## Run runCommandline(idx, make_bam = FALSE) -</code></pre> -<p>Running the alignment:</p> -<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<p>Running the alignment:</p> +<pre><code class="language-r">targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/bwa/bwa-pe&quot;, package = &quot;systemPipeR&quot;) bwaPE &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;bwa-pe.cwl&quot;, input_file = &quot;bwa-pe.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) bwaPE &lt;- renderWF(bwaPE, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) bwaPE cmdlist(bwaPE)[1:2] output(bwaPE)[1:2] ## Single Machine bwaPE &lt;- runCommandline(args = bwaPE, make_bam = FALSE) + ## Cluster library(batchtools) resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg &lt;- clusterRun(bwaPE, FUN = runCommandline, more.args = list(args = bwaPE, dir = FALSE), -conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 18, -runid = &quot;01&quot;, resourceList = resources) + conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 18, + runid = &quot;01&quot;, resourceList = resources) getStatus(reg = reg) -</code></pre> -<p>Create new targets file.</p> -<pre><code class="language-r">names(clt(bwaPE)) +</code></pre> +<p>Create new targets file.</p> +<pre><code class="language-r">names(clt(bwaPE)) writeTargetsout(x = bwaPE, file = &quot;default&quot;, step = 1, new_col = &quot;bwaPE&quot;, new_col_output_index = 1, -overwrite = TRUE) -</code></pre> -<h3 id="alignment-with-rsubread-eg-for-rna-seq">Alignment with <em><code>Rsubread</code></em> (<em>e.g.</em> for RNA-Seq)</h3> -<p>The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.</p> -<pre><code class="language-r">## Build the index: + overwrite = TRUE) +</code></pre> +<h3 id="alignment-with-rsubread-eg-for-rna-seq">Alignment with <em><code>Rsubread</code></em> (<em>e.g.</em> for RNA-Seq)</h3> +<p>The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.</p> +<pre><code class="language-r">## Build the index: dir_path &lt;- system.file(&quot;extdata/cwl/rsubread/rsubread-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;rsubread-index.cwl&quot;, input_file = &quot;rsubread-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx cmdlist(idx) runCommandline(args = idx, make_bam = FALSE) + ## Running the alignment: targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/rsubread/rsubread-se&quot;, package = &quot;systemPipeR&quot;) rsubread &lt;- loadWorkflow(targets = targets, wf_file = &quot;rsubread-mapping-se.cwl&quot;, -input_file = &quot;rsubread-mapping-se.yml&quot;, dir_path = dir_path) + input_file = &quot;rsubread-mapping-se.yml&quot;, dir_path = dir_path) rsubread &lt;- renderWF(rsubread, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) rsubread cmdlist(rsubread)[1] + ## Single Machine rsubread &lt;- runCommandline(args = rsubread[1]) -</code></pre> -<p>Create new targets file.</p> -<pre><code class="language-r">names(clt(rsubread)) +</code></pre> +<p>Create new targets file.</p> +<pre><code class="language-r">names(clt(rsubread)) writeTargetsout(x = rsubread, file = &quot;default&quot;, step = 1, new_col = &quot;rsubread&quot;, new_col_output_index = 1, -overwrite = TRUE) -</code></pre> -<h3 id="alignment-with-gsnap-eg-for-var-seq-and-rna-seq">Alignment with <em><code>gsnap</code></em> (<em>e.g.</em> for VAR-Seq and RNA-Seq)</h3> -<p>Another R-based short read aligner is <em><code>gsnap</code></em> from the <em><code>gmapR</code></em> package (Wu and Nacu 2010). -The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.</p> -<pre><code class="language-r">## Build the index: + overwrite = TRUE) +</code></pre> +<h3 id="alignment-with-gsnap-eg-for-var-seq-and-rna-seq">Alignment with <em><code>gsnap</code></em> (<em>e.g.</em> for VAR-Seq and RNA-Seq)</h3> +<p>Another R-based short read aligner is <em><code>gsnap</code></em> from the <em><code>gmapR</code></em> package (Wu and Nacu 2010). +The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.</p> +<pre><code class="language-r">## Build the index: dir_path &lt;- system.file(&quot;extdata/cwl/gsnap/gsnap-idx&quot;, package = &quot;systemPipeR&quot;) idx &lt;- loadWorkflow(targets = NULL, wf_file = &quot;gsnap-index.cwl&quot;, input_file = &quot;gsnap-index.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) idx &lt;- renderWF(idx) idx cmdlist(idx) runCommandline(args = idx, make_bam = FALSE) + ## Running the alignment: targetsPE &lt;- system.file(&quot;extdata&quot;, &quot;targetsPE.txt&quot;, package = &quot;systemPipeR&quot;) dir_path &lt;- system.file(&quot;extdata/cwl/gsnap/gsnap-pe&quot;, package = &quot;systemPipeR&quot;) gsnap &lt;- loadWorkflow(targets = targetsPE, wf_file = &quot;gsnap-mapping-pe.cwl&quot;, input_file = &quot;gsnap-mapping-pe.yml&quot;, -dir_path = dir_path) + dir_path = dir_path) gsnap &lt;- renderWF(gsnap, inputvars = c(FileName1 = &quot;_FASTQ_PATH1_&quot;, FileName2 = &quot;_FASTQ_PATH2_&quot;, -SampleName = &quot;_SampleName_&quot;)) + SampleName = &quot;_SampleName_&quot;)) gsnap cmdlist(gsnap)[1] output(gsnap)[1] + ## Cluster library(batchtools) resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) reg &lt;- clusterRun(gsnap, FUN = runCommandline, more.args = list(args = gsnap, make_bam = FALSE), -conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 18, -runid = &quot;01&quot;, resourceList = resources) + conffile = &quot;.batchtools.conf.R&quot;, template = &quot;batchtools.slurm.tmpl&quot;, Njobs = 18, + runid = &quot;01&quot;, resourceList = resources) getStatus(reg = reg) gsnap &lt;- output_update(gsnap, dir = FALSE, replace = TRUE, extension = c(&quot;.sam&quot;, -&quot;.bam&quot;)) -</code></pre> -<p>Create new targets file.</p> -<pre><code class="language-r">names(clt(gsnap)) + &quot;.bam&quot;)) +</code></pre> +<p>Create new targets file.</p> +<pre><code class="language-r">names(clt(gsnap)) writeTargetsout(x = gsnap, file = &quot;default&quot;, step = 1, new_col = &quot;gsnap&quot;, new_col_output_index = 1, -overwrite = TRUE) -</code></pre> -<h2 id="create-symbolic-links-for-viewing-bam-files-in-igv">Create symbolic links for viewing BAM files in IGV</h2> -<p>The genome browser IGV supports reading of indexed/sorted BAM files via web URLs. This way it can be avoided to create unnecessary copies of these large files. To enable this approach, an HTML directory with Http access needs to be available in the user account (<em>e.g.</em> <em><code>home/publichtml</code></em>) of a system. If this is not the case then the BAM files need to be moved or copied to the system where IGV runs. In the following, <em><code>htmldir</code></em> defines the path to the HTML directory with http access where the symbolic links to the BAM files will be stored. The corresponding URLs will be written to a text file specified under the <code>_urlfile</code>_ argument.</p> -<pre><code class="language-r">symLink2bam(sysargs = args, htmldir = c(&quot;~/.html/&quot;, &quot;somedir/&quot;), urlbase = &quot;http://myserver.edu/~username/&quot;, -urlfile = &quot;IGVurl.txt&quot;) -</code></pre> -<h2 id="read-counting-for-mrna-profiling-experiments">Read counting for mRNA profiling experiments</h2> -<p>Create <em><code>txdb</code></em> (needs to be done only once).</p> -<pre><code class="language-r">library(GenomicFeatures) + overwrite = TRUE) +</code></pre> +<h2 id="create-symbolic-links-for-viewing-bam-files-in-igv">Create symbolic links for viewing BAM files in IGV</h2> +<p>The genome browser IGV supports reading of indexed/sorted BAM files via web URLs. This way it can be avoided to create unnecessary copies of these large files. To enable this approach, an HTML directory with Http access needs to be available in the user account (<em>e.g.</em> <em><code>home/publichtml</code></em>) of a system. If this is not the case then the BAM files need to be moved or copied to the system where IGV runs. In the following, <em><code>htmldir</code></em> defines the path to the HTML directory with http access where the symbolic links to the BAM files will be stored. The corresponding URLs will be written to a text file specified under the <code>_urlfile</code>_ argument.</p> +<pre><code class="language-r">symLink2bam(sysargs = args, htmldir = c(&quot;~/.html/&quot;, &quot;somedir/&quot;), urlbase = &quot;http://myserver.edu/~username/&quot;, + urlfile = &quot;IGVurl.txt&quot;) +</code></pre> +<h2 id="read-counting-for-mrna-profiling-experiments">Read counting for mRNA profiling experiments</h2> +<p>Create <em><code>txdb</code></em> (needs to be done only once).</p> +<pre><code class="language-r">library(GenomicFeatures) txdb &lt;- makeTxDbFromGFF(file = &quot;data/tair10.gff&quot;, format = &quot;gff&quot;, dataSource = &quot;TAIR&quot;, -organism = &quot;Arabidopsis thaliana&quot;) + organism = &quot;Arabidopsis thaliana&quot;) saveDb(txdb, file = &quot;./data/tair10.sqlite&quot;) -</code></pre> -<p>The following performs read counting with <em><code>summarizeOverlaps</code></em> in parallel mode with multiple cores.</p> -<pre><code class="language-r">library(BiocParallel) +</code></pre> +<p>The following performs read counting with <em><code>summarizeOverlaps</code></em> in parallel mode with multiple cores.</p> +<pre><code class="language-r">library(BiocParallel) txdb &lt;- loadDb(&quot;./data/tair10.sqlite&quot;) eByg &lt;- exonsBy(txdb, by = &quot;gene&quot;) outpaths &lt;- subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1) @@ -2073,233 +2159,239 @@ multicoreParam &lt;- MulticoreParam(workers = 4) register(multicoreParam) registered() counteByg &lt;- bplapply(bfl, function(x) summarizeOverlaps(eByg, x, mode = &quot;Union&quot;, -ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE)) -# Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data set -# 'singleEnd=FALSE' + ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE)) + +# Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data +# set 'singleEnd=FALSE' countDFeByg &lt;- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts) rownames(countDFeByg) &lt;- names(rowRanges(counteByg[[1]])) colnames(countDFeByg) &lt;- names(bfl) rpkmDFeByg &lt;- apply(countDFeByg, 2, function(x) returnRPKM(counts = x, ranges = eByg)) write.table(countDFeByg, &quot;results/countDFeByg.xls&quot;, col.names = NA, quote = FALSE, -sep = &quot;\t&quot;) + sep = &quot;\t&quot;) write.table(rpkmDFeByg, &quot;results/rpkmDFeByg.xls&quot;, col.names = NA, quote = FALSE, -sep = &quot;\t&quot;) -</code></pre> -<p>Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as <em><code>edgeR</code></em> or <em><code>DESeq2</code></em>, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, <em>e.g.</em> manually comparing the expression levels of different genes or features.</p> -<p>Read counting with <em><code>summarizeOverlaps</code></em> using multiple nodes of a cluster.</p> -<pre><code class="language-r">library(BiocParallel) + sep = &quot;\t&quot;) +</code></pre> +<p>Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as <em><code>edgeR</code></em> or <em><code>DESeq2</code></em>, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, <em>e.g.</em> manually comparing the expression levels of different genes or features.</p> +<p>Read counting with <em><code>summarizeOverlaps</code></em> using multiple nodes of a cluster.</p> +<pre><code class="language-r">library(BiocParallel) f &lt;- function(x) { -library(systemPipeR) -library(BiocParallel) -library(GenomicFeatures) -txdb &lt;- loadDb(&quot;./data/tair10.sqlite&quot;) -eByg &lt;- exonsBy(txdb, by = &quot;gene&quot;) -args &lt;- systemArgs(sysma = &quot;param/tophat.param&quot;, mytargets = &quot;targets.txt&quot;) -outpaths &lt;- subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1) -bfl &lt;- BamFileList(outpaths, yieldSize = 50000, index = character()) -summarizeOverlaps(eByg, bfl[x], mode = &quot;Union&quot;, ignore.strand = TRUE, inter.feature = TRUE, -singleEnd = TRUE) + library(systemPipeR) + library(BiocParallel) + library(GenomicFeatures) + txdb &lt;- loadDb(&quot;./data/tair10.sqlite&quot;) + eByg &lt;- exonsBy(txdb, by = &quot;gene&quot;) + args &lt;- systemArgs(sysma = &quot;param/tophat.param&quot;, mytargets = &quot;targets.txt&quot;) + outpaths &lt;- subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1) + bfl &lt;- BamFileList(outpaths, yieldSize = 50000, index = character()) + summarizeOverlaps(eByg, bfl[x], mode = &quot;Union&quot;, ignore.strand = TRUE, inter.feature = TRUE, + singleEnd = TRUE) } resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param &lt;- BatchtoolsParam(workers = 4, cluster = &quot;slurm&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -resources = resources) + resources = resources) counteByg &lt;- bplapply(seq(along = args), f, BPPARAM = param) countDFeByg &lt;- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts) rownames(countDFeByg) &lt;- names(rowRanges(counteByg[[1]])) colnames(countDFeByg) &lt;- names(outpaths) -</code></pre> -<p>Useful commands for monitoring the progress of submitted jobs</p> -<pre><code class="language-r">getStatus(reg = reg) +</code></pre> +<p>Useful commands for monitoring the progress of submitted jobs</p> +<pre><code class="language-r">getStatus(reg = reg) outpaths &lt;- subsetWF(args, slot = &quot;output&quot;, subset = 1, index = 1) file.exists(outpaths) -sapply(1:length(outpaths), function(x) loadResult(reg, id = x)) # Works after job completion -</code></pre> -<h4 id="read-and-alignment-count-stats">Read and alignment count stats</h4> -<p>Generate a table of read and alignment counts for all samples.</p> -<pre><code class="language-r">read_statsDF &lt;- alignStats(args) +sapply(1:length(outpaths), function(x) loadResult(reg, id = x)) # Works after job completion +</code></pre> +<h4 id="read-and-alignment-count-stats">Read and alignment count stats</h4> +<p>Generate a table of read and alignment counts for all samples.</p> +<pre><code class="language-r">read_statsDF &lt;- alignStats(args) write.table(read_statsDF, &quot;results/alignStats.xls&quot;, row.names = FALSE, quote = FALSE, -sep = &quot;\t&quot;) -</code></pre> -<p>The following shows the first four lines of the sample alignment stats file -provided by the <em><code>systemPipeR</code></em> package. For simplicity the number of PE reads + sep = &quot;\t&quot;) +</code></pre> +<p>The following shows the first four lines of the sample alignment stats file +provided by the <em><code>systemPipeR</code></em> package. For simplicity the number of PE reads is multiplied here by 2 to approximate proper alignment frequencies where each -read in a pair is counted.</p> -<pre><code class="language-r">read.table(system.file(&quot;extdata&quot;, &quot;alignStats.xls&quot;, package = &quot;systemPipeR&quot;), header = TRUE)[1:4, -] -</code></pre> -<pre><code>## FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary -## 1 M1A 192918 177961 92.24697 177961 92.24697 -## 2 M1B 197484 159378 80.70426 159378 80.70426 -## 3 A1A 189870 176055 92.72397 176055 92.72397 -## 4 A1B 188854 147768 78.24457 147768 78.24457 -</code></pre> -<p>Parallelization of read/alignment stats on single machine with multiple cores.</p> -<pre><code class="language-r">f &lt;- function(x) alignStats(args[x]) +read in a pair is counted.</p> +<pre><code class="language-r">read.table(system.file(&quot;extdata&quot;, &quot;alignStats.xls&quot;, package = &quot;systemPipeR&quot;), header = TRUE)[1:4, + ] +</code></pre> +<pre><code>## FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary +## 1 M1A 192918 177961 92.24697 177961 92.24697 +## 2 M1B 197484 159378 80.70426 159378 80.70426 +## 3 A1A 189870 176055 92.72397 176055 92.72397 +## 4 A1B 188854 147768 78.24457 147768 78.24457 +</code></pre> +<p>Parallelization of read/alignment stats on single machine with multiple cores.</p> +<pre><code class="language-r">f &lt;- function(x) alignStats(args[x]) read_statsList &lt;- bplapply(seq(along = args), f, BPPARAM = MulticoreParam(workers = 8)) read_statsDF &lt;- do.call(&quot;rbind&quot;, read_statsList) -</code></pre> -<p>Parallelization of read/alignment stats via scheduler (<em>e.g.</em> Slurm) across several compute nodes.</p> -<pre><code class="language-r">library(BiocParallel) +</code></pre> +<p>Parallelization of read/alignment stats via scheduler (<em>e.g.</em> Slurm) across several compute nodes.</p> +<pre><code class="language-r">library(BiocParallel) library(batchtools) f &lt;- function(x) { -library(systemPipeR) -targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) -dir_path &lt;- &quot;param/cwl/hisat2/hisat2-se&quot; ## TODO: replace path to system.file -args &lt;- loadWorkflow(targets = targets, wf_file = &quot;hisat2-mapping-se.cwl&quot;, input_file = &quot;hisat2-mapping-se.yml&quot;, -dir_path = dir_path) -args &lt;- renderWF(args, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) -args &lt;- output_update(args, dir = FALSE, replace = TRUE, extension = c(&quot;.sam&quot;, -&quot;.bam&quot;)) -alignStats(args[x]) + library(systemPipeR) + targets &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) + dir_path &lt;- &quot;param/cwl/hisat2/hisat2-se&quot; ## TODO: replace path to system.file + args &lt;- loadWorkflow(targets = targets, wf_file = &quot;hisat2-mapping-se.cwl&quot;, input_file = &quot;hisat2-mapping-se.yml&quot;, + dir_path = dir_path) + args &lt;- renderWF(args, inputvars = c(FileName = &quot;_FASTQ_PATH1_&quot;, SampleName = &quot;_SampleName_&quot;)) + args &lt;- output_update(args, dir = FALSE, replace = TRUE, extension = c(&quot;.sam&quot;, + &quot;.bam&quot;)) + alignStats(args[x]) } resources &lt;- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024) param &lt;- BatchtoolsParam(workers = 4, cluster = &quot;slurm&quot;, template = &quot;batchtools.slurm.tmpl&quot;, -resources = resources) + resources = resources) read_statsList &lt;- bplapply(seq(along = args), f, BPPARAM = param) read_statsDF &lt;- do.call(&quot;rbind&quot;, read_statsList) -</code></pre> -<h2 id="read-counting-for-mirna-profiling-experiments">Read counting for miRNA profiling experiments</h2> -<p>Download miRNA genes from miRBase.</p> -<pre><code class="language-r">system(&quot;wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/&quot;) +</code></pre> +<h2 id="read-counting-for-mirna-profiling-experiments">Read counting for miRNA profiling experiments</h2> +<p>Download miRNA genes from miRBase.</p> +<pre><code class="language-r">system(&quot;wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/&quot;) gff &lt;- import.gff(&quot;./data/My_species.gff3&quot;) gff &lt;- split(gff, elementMetadata(gff)$ID) bams &lt;- names(bampaths) names(bams) &lt;- targets$SampleName bfl &lt;- BamFileList(bams, yieldSize = 50000, index = character()) countDFmiR &lt;- summarizeOverlaps(gff, bfl, mode = &quot;Union&quot;, ignore.strand = FALSE, -inter.feature = FALSE) # Note: inter.feature=FALSE important since pre and mature miRNA ranges overlap + inter.feature = FALSE) # Note: inter.feature=FALSE important since pre and mature miRNA ranges overlap rpkmDFmiR &lt;- apply(countDFmiR, 2, function(x) returnRPKM(counts = x, gffsub = gff)) write.table(assays(countDFmiR)$counts, &quot;results/countDFmiR.xls&quot;, col.names = NA, -quote = FALSE, sep = &quot;\t&quot;) + quote = FALSE, sep = &quot;\t&quot;) write.table(rpkmDFmiR, &quot;results/rpkmDFmiR.xls&quot;, col.names = NA, quote = FALSE, sep = &quot;\t&quot;) -</code></pre> -<h2 id="correlation-analysis-of-samples">Correlation analysis of samples</h2> -<p>The following computes the sample-wise Spearman correlation coefficients from the <em><code>rlog</code></em> (regularized-logarithm) transformed expression values generated with the <em><code>DESeq2</code></em> package. After transformation to a distance matrix, hierarchical clustering is performed with the <em><code>hclust</code></em> function and the result is plotted as a dendrogram (<a href="./results/sample_tree.pdf">sample_tree.pdf</a>).</p> -<pre><code class="language-r">library(DESeq2, warn.conflicts = FALSE, quietly = TRUE) +</code></pre> +<h2 id="correlation-analysis-of-samples">Correlation analysis of samples</h2> +<p>The following computes the sample-wise Spearman correlation coefficients from the <em><code>rlog</code></em> (regularized-logarithm) transformed expression values generated with the <em><code>DESeq2</code></em> package. After transformation to a distance matrix, hierarchical clustering is performed with the <em><code>hclust</code></em> function and the result is plotted as a dendrogram (<a href="./results/sample_tree.pdf">sample_tree.pdf</a>).</p> +<pre><code class="language-r">library(DESeq2, warn.conflicts = FALSE, quietly = TRUE) library(ape, warn.conflicts = FALSE) countDFpath &lt;- system.file(&quot;extdata&quot;, &quot;countDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) countDF &lt;- as.matrix(read.table(countDFpath)) colData &lt;- data.frame(row.names = targets.as.df(targets(args))$SampleName, condition = targets.as.df(targets(args))$Factor) dds &lt;- DESeqDataSetFromMatrix(countData = countDF, colData = colData, design = ~condition) -</code></pre> -<pre><code>## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in +</code></pre> +<pre><code>## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in ## design formula are characters, converting to factors -</code></pre> -<pre><code class="language-r">d &lt;- cor(assay(rlog(dds)), method = &quot;spearman&quot;) +</code></pre> +<pre><code class="language-r">d &lt;- cor(assay(rlog(dds)), method = &quot;spearman&quot;) hc &lt;- hclust(dist(1 - d)) plot.phylo(as.phylo(hc), type = &quot;p&quot;, edge.col = 4, edge.width = 3, show.node.label = TRUE, -no.margin = TRUE) -</code></pre> -<p><img src="../../en/spr/systempiper/steps_files/figure-html/sample_tree_rlog-1.png" width="672" /></p> -<div align="center"> -<p><strong>Figure 6:</strong> Correlation dendrogram of samples for <em><code>rlog</code></em> values.</p> -</div> -</br> -<p>Alternatively, the clustering can be performed with <em><code>RPKM</code></em> normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.</p> -<pre><code class="language-r">rpkmDFeBygpath &lt;- system.file(&quot;extdata&quot;, &quot;rpkmDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) + no.margin = TRUE) +</code></pre> +<p><img src="../../en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png" width="672" /></p> +<center> +<img src="fastqReport.png"> +</center> +<div align="center"> +<p><strong>Figure 2:</strong> Correlation dendrogram of samples for <em><code>rlog</code></em> values.</p> +</div> +</br> +<p>Alternatively, the clustering can be performed with <em><code>RPKM</code></em> normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.</p> +<pre><code class="language-r">rpkmDFeBygpath &lt;- system.file(&quot;extdata&quot;, &quot;rpkmDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) rpkmDFeByg &lt;- read.table(rpkmDFeBygpath, check.names = FALSE) rpkmDFeByg &lt;- rpkmDFeByg[rowMeans(rpkmDFeByg) &gt; 50, ] d &lt;- cor(rpkmDFeByg, method = &quot;spearman&quot;) hc &lt;- hclust(as.dist(1 - d)) plot.phylo(as.phylo(hc), type = &quot;p&quot;, edge.col = &quot;blue&quot;, edge.width = 2, show.node.label = TRUE, -no.margin = TRUE) -</code></pre> -<h2 id="deg-analysis-with-edger">DEG analysis with <em><code>edgeR</code></em></h2> -<p>The following *<code>run_edgeR</code>* function is a convenience wrapper for + no.margin = TRUE) +</code></pre> +<h2 id="deg-analysis-with-edger">DEG analysis with <em><code>edgeR</code></em></h2> +<p>The following *<code>run_edgeR</code>* function is a convenience wrapper for identifying differentially expressed genes (DEGs) in batch mode with -*<code>edgeR</code><em>’s GML method (Robinson, McCarthy, and Smyth 2010) for any number of -pairwise sample comparisons specified under the <em><code>cmp</code>* argument. Users +*<code>edgeR</code><em>’s GML method (Robinson, McCarthy, and Smyth 2010) for any number of +pairwise sample comparisons specified under the <em><code>cmp</code>* argument. Users are strongly encouraged to consult the -</em><code>edgeR</code></em><a href="%5Chref%7Bhttp://www.bioconductor.org/packages/devel/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf"></a> vignette -for more detailed information on this topic and how to properly run <em><code>edgeR</code></em> -on data sets with more complex experimental designs.</p> -<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) +</em><code>edgeR</code></em><a href="%5Chref%7Bhttp://www.bioconductor.org/packages/devel/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf"></a> vignette +for more detailed information on this topic and how to properly run <em><code>edgeR</code></em> +on data sets with more complex experimental designs.</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) targets &lt;- read.delim(targetspath, comment = &quot;#&quot;) cmp &lt;- readComp(file = targetspath, format = &quot;matrix&quot;, delim = &quot;-&quot;) cmp[[1]] -</code></pre> -<pre><code>## [,1] [,2] -## [1,] &quot;M1&quot; &quot;A1&quot; -## [2,] &quot;M1&quot; &quot;V1&quot; -## [3,] &quot;A1&quot; &quot;V1&quot; -## [4,] &quot;M6&quot; &quot;A6&quot; -## [5,] &quot;M6&quot; &quot;V6&quot; -## [6,] &quot;A6&quot; &quot;V6&quot; -## [7,] &quot;M12&quot; &quot;A12&quot; -## [8,] &quot;M12&quot; &quot;V12&quot; -## [9,] &quot;A12&quot; &quot;V12&quot; -</code></pre> -<pre><code class="language-r">countDFeBygpath &lt;- system.file(&quot;extdata&quot;, &quot;countDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<pre><code>## [,1] [,2] +## [1,] &quot;M1&quot; &quot;A1&quot; +## [2,] &quot;M1&quot; &quot;V1&quot; +## [3,] &quot;A1&quot; &quot;V1&quot; +## [4,] &quot;M6&quot; &quot;A6&quot; +## [5,] &quot;M6&quot; &quot;V6&quot; +## [6,] &quot;A6&quot; &quot;V6&quot; +## [7,] &quot;M12&quot; &quot;A12&quot; +## [8,] &quot;M12&quot; &quot;V12&quot; +## [9,] &quot;A12&quot; &quot;V12&quot; +</code></pre> +<pre><code class="language-r">countDFeBygpath &lt;- system.file(&quot;extdata&quot;, &quot;countDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) countDFeByg &lt;- read.delim(countDFeBygpath, row.names = 1) edgeDF &lt;- run_edgeR(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], independent = FALSE, -mdsplot = &quot;&quot;) -</code></pre> -<pre><code>## Disp = 0.21829 , BCV = 0.4672 -</code></pre> -<p>Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the <em>FDR</em> value has been set to a relatively high threshold (here 10%). More commonly used <em>FDR</em> cutoffs are 1% or 5%. The definition of ‘<em>up</em>’ and ‘<em>down</em>’ is given in the corresponding help file. To open it, type <em><code>?filterDEGs</code></em> in the R console.</p> -<pre><code class="language-r">DEG_list &lt;- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10)) -</code></pre> -<p><img src="../../en/spr/systempiper/steps_files/figure-html/edger_deg_counts-1.png" width="672" /></p> -<div align="center"> -<p><strong>Figure 7:</strong> Up and down regulated DEGs identified by <em><code>edgeR</code></em>.</p> -</div> -</br> -<pre><code class="language-r">names(DEG_list) -</code></pre> -<pre><code>## [1] &quot;UporDown&quot; &quot;Up&quot; &quot;Down&quot; &quot;Summary&quot; -</code></pre> -<pre><code class="language-r">DEG_list$Summary[1:4, ] -</code></pre> -<pre><code>## Comparisons Counts_Up_or_Down Counts_Up Counts_Down -## M1-A1 M1-A1 0 0 0 -## M1-V1 M1-V1 1 1 0 -## A1-V1 A1-V1 1 1 0 -## M6-A6 M6-A6 0 0 0 -</code></pre> -<h2 id="deg-analysis-with-deseq2">DEG analysis with <em><code>DESeq2</code></em></h2> -<p>The following *<code>run_DESeq2</code>* function is a convenience wrapper for -identifying DEGs in batch mode with <em><code>DESeq2</code>* (Love, Huber, and Anders 2014) for any number of -pairwise sample comparisons specified under the <em><code>cmp</code>* argument. Users + mdsplot = &quot;&quot;) +</code></pre> +<pre><code>## Loading required namespace: edgeR + +## Disp = 0.21829 , BCV = 0.4672 +</code></pre> +<p>Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the <em>FDR</em> value has been set to a relatively high threshold (here 10%). More commonly used <em>FDR</em> cutoffs are 1% or 5%. The definition of ‘<em>up</em>’ and ‘<em>down</em>’ is given in the corresponding help file. To open it, type <em><code>?filterDEGs</code></em> in the R console.</p> +<pre><code class="language-r">DEG_list &lt;- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10)) +</code></pre> +<p><img src="../../en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png" width="672" /></p> +<div align="center"> +<p><strong>Figure 7:</strong> Up and down regulated DEGs identified by <em><code>edgeR</code></em>.</p> +</div> +</br> +<pre><code class="language-r">names(DEG_list) +</code></pre> +<pre><code>## [1] &quot;UporDown&quot; &quot;Up&quot; &quot;Down&quot; &quot;Summary&quot; +</code></pre> +<pre><code class="language-r">DEG_list$Summary[1:4, ] +</code></pre> +<pre><code>## Comparisons Counts_Up_or_Down Counts_Up Counts_Down +## M1-A1 M1-A1 0 0 0 +## M1-V1 M1-V1 1 1 0 +## A1-V1 A1-V1 1 1 0 +## M6-A6 M6-A6 0 0 0 +</code></pre> +<h2 id="deg-analysis-with-deseq2">DEG analysis with <em><code>DESeq2</code></em></h2> +<p>The following *<code>run_DESeq2</code>* function is a convenience wrapper for +identifying DEGs in batch mode with <em><code>DESeq2</code>* (Love, Huber, and Anders 2014) for any number of +pairwise sample comparisons specified under the <em><code>cmp</code>* argument. Users are strongly encouraged to consult the -</em><code>DESeq2</code></em><a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.pdf"></a> vignette -for more detailed information on this topic and how to properly run <em><code>DESeq2</code></em> -on data sets with more complex experimental designs.</p> -<pre><code class="language-r">degseqDF &lt;- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], -independent = FALSE) -</code></pre> -<pre><code>## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in +</em><code>DESeq2</code></em><a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.pdf"></a> vignette +for more detailed information on this topic and how to properly run <em><code>DESeq2</code></em> +on data sets with more complex experimental designs.</p> +<pre><code class="language-r">degseqDF &lt;- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], + independent = FALSE) +</code></pre> +<pre><code>## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in ## design formula are characters, converting to factors -</code></pre> -<p>Filter and plot DEG results for up and down-regulated genes.</p> -<pre><code class="language-r">DEG_list2 &lt;- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10)) -</code></pre> -<p><img src="../../en/spr/systempiper/steps_files/figure-html/deseq2_deg_counts-1.png" width="672" /></p> -<div align="center"> -<p><strong>Figure 8:</strong> Up and down regulated DEGs identified by <em><code>DESeq2</code></em>.</p> -</div> -</br> -<h2 id="venn-diagrams">Venn Diagrams</h2> -<p>The function <em><code>overLapper</code></em> can compute Venn intersects for large numbers of sample sets (up to 20 or more) and <em><code>vennPlot</code></em> can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).</p> -<pre><code class="language-r">vennsetup &lt;- overLapper(DEG_list$Up[6:9], type = &quot;vennsets&quot;) +</code></pre> +<p>Filter and plot DEG results for up and down-regulated genes.</p> +<pre><code class="language-r">DEG_list2 &lt;- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10)) +</code></pre> +<p><img src="../../en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png" width="672" /></p> +<div align="center"> +<p><strong>Figure 8:</strong> Up and down regulated DEGs identified by <em><code>DESeq2</code></em>.</p> +</div> +</br> +<h2 id="venn-diagrams">Venn Diagrams</h2> +<p>The function <em><code>overLapper</code></em> can compute Venn intersects for large numbers of sample sets (up to 20 or more) and <em><code>vennPlot</code></em> can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).</p> +<pre><code class="language-r">vennsetup &lt;- overLapper(DEG_list$Up[6:9], type = &quot;vennsets&quot;) vennsetdown &lt;- overLapper(DEG_list$Down[6:9], type = &quot;vennsets&quot;) vennPlot(list(vennsetup, vennsetdown), mymain = &quot;&quot;, mysub = &quot;&quot;, colmode = 2, ccol = c(&quot;blue&quot;, -&quot;red&quot;)) -</code></pre> -<p><img src="../../en/spr/systempiper/steps_files/figure-html/vennplot-1.png" width="672" /></p> -<div align="center"> -<p><strong>Figure 9:</strong> Venn Diagram for 4 Up and Down DEG Sets.</p> -</div> -</br> -<h2 id="go-term-enrichment-analysis-of-degs">GO term enrichment analysis of DEGs</h2> -<h3 id="obtain-gene-to-go-mappings">Obtain gene-to-GO mappings</h3> -<p>The following shows how to obtain gene-to-GO mappings from <em><code>biomaRt</code></em> (here for <em>A. thaliana</em>) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s <em><code>*.db</code></em> genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the <em><code>load</code></em> function as shown in the next subsection.</p> -<pre><code class="language-r">library(&quot;biomaRt&quot;) -listMarts() # To choose BioMart database + &quot;red&quot;)) +</code></pre> +<p><img src="../../en/sp/spr/steps_files/figure-html/vennplot-1.png" width="672" /></p> +<div align="center"> +<p><strong>Figure 9:</strong> Venn Diagram for 4 Up and Down DEG Sets.</p> +</div> +</br> +<h2 id="go-term-enrichment-analysis-of-degs">GO term enrichment analysis of DEGs</h2> +<h3 id="obtain-gene-to-go-mappings">Obtain gene-to-GO mappings</h3> +<p>The following shows how to obtain gene-to-GO mappings from <em><code>biomaRt</code></em> (here for <em>A. thaliana</em>) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s <em><code>*.db</code></em> genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the <em><code>load</code></em> function as shown in the next subsection.</p> +<pre><code class="language-r">library(&quot;biomaRt&quot;) +listMarts() # To choose BioMart database listMarts(host = &quot;plants.ensembl.org&quot;) m &lt;- useMart(&quot;plants_mart&quot;, host = &quot;plants.ensembl.org&quot;) listDatasets(m) m &lt;- useMart(&quot;plants_mart&quot;, dataset = &quot;athaliana_eg_gene&quot;, host = &quot;plants.ensembl.org&quot;) -listAttributes(m) # Choose data types you want to download +listAttributes(m) # Choose data types you want to download go &lt;- getBM(attributes = c(&quot;go_id&quot;, &quot;tair_locus&quot;, &quot;namespace_1003&quot;), mart = m) go &lt;- go[go[, 3] != &quot;&quot;, ] go[, 3] &lt;- as.character(go[, 3]) @@ -2309,14 +2401,14 @@ go[go[, 3] == &quot;cellular_component&quot;, 3] &lt;- &quot;C&a go[1:4, ] dir.create(&quot;./data/GO&quot;) write.table(go, &quot;data/GO/GOannotationsBiomart_mod.txt&quot;, quote = FALSE, row.names = FALSE, -col.names = FALSE, sep = &quot;\t&quot;) + col.names = FALSE, sep = &quot;\t&quot;) catdb &lt;- makeCATdb(myfile = &quot;data/GO/GOannotationsBiomart_mod.txt&quot;, lib = NULL, org = &quot;&quot;, -colno = c(1, 2, 3), idconv = NULL) + colno = c(1, 2, 3), idconv = NULL) save(catdb, file = &quot;data/GO/catdb.RData&quot;) -</code></pre> -<h3 id="batch-go-term-enrichment-analysis">Batch GO term enrichment analysis</h3> -<p>Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the <em>FDR</em> filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the <em><code>GOCluster_Report</code></em> function. When <em><code>method=&quot;all&quot;</code></em>, it returns all GO terms passing the p-value cutoff specified under the <em><code>cutoff</code></em> arguments. When <em><code>method=&quot;slim&quot;</code></em>, it returns only the GO terms specified under the <em><code>myslimv</code></em> argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.</p> -<pre><code class="language-r">load(&quot;data/GO/catdb.RData&quot;) +</code></pre> +<h3 id="batch-go-term-enrichment-analysis">Batch GO term enrichment analysis</h3> +<p>Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the <em>FDR</em> filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the <em><code>GOCluster_Report</code></em> function. When <em><code>method=&quot;all&quot;</code></em>, it returns all GO terms passing the p-value cutoff specified under the <em><code>cutoff</code></em> arguments. When <em><code>method=&quot;slim&quot;</code></em>, it returns only the GO terms specified under the <em><code>myslimv</code></em> argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.</p> +<pre><code class="language-r">load(&quot;data/GO/catdb.RData&quot;) DEG_list &lt;- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 50), plot = FALSE) up_down &lt;- DEG_list$UporDown names(up_down) &lt;- paste(names(up_down), &quot;_up_down&quot;, sep = &quot;&quot;) @@ -2327,658 +2419,1756 @@ names(down) &lt;- paste(names(down), &quot;_down&quot;, sep = &q DEGlist &lt;- c(up_down, up, down) DEGlist &lt;- DEGlist[sapply(DEGlist, length) &gt; 0] BatchResult &lt;- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = &quot;all&quot;, -id_type = &quot;gene&quot;, CLSZ = 2, cutoff = 0.9, gocats = c(&quot;MF&quot;, &quot;BP&quot;, &quot;CC&quot;), recordSpecGO = NULL) + id_type = &quot;gene&quot;, CLSZ = 2, cutoff = 0.9, gocats = c(&quot;MF&quot;, &quot;BP&quot;, &quot;CC&quot;), recordSpecGO = NULL) library(&quot;biomaRt&quot;) m &lt;- useMart(&quot;plants_mart&quot;, dataset = &quot;athaliana_eg_gene&quot;, host = &quot;plants.ensembl.org&quot;) goslimvec &lt;- as.character(getBM(attributes = c(&quot;goslim_goa_accession&quot;), mart = m)[, -1]) + 1]) BatchResultslim &lt;- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = &quot;slim&quot;, -id_type = &quot;gene&quot;, myslimv = goslimvec, CLSZ = 10, cutoff = 0.01, gocats = c(&quot;MF&quot;, -&quot;BP&quot;, &quot;CC&quot;), recordSpecGO = NULL) -</code></pre> -<h3 id="plot-batch-go-term-results">Plot batch GO term results</h3> -<p>The <em><code>data.frame</code></em> generated by <em><code>GOCluster_Report</code></em> can be plotted with the <em><code>goBarplot</code></em> function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.</p> -<pre><code class="language-r">gos &lt;- BatchResultslim[grep(&quot;M6-V6_up_down&quot;, BatchResultslim$CLID), ] + id_type = &quot;gene&quot;, myslimv = goslimvec, CLSZ = 10, cutoff = 0.01, gocats = c(&quot;MF&quot;, + &quot;BP&quot;, &quot;CC&quot;), recordSpecGO = NULL) +</code></pre> +<h3 id="plot-batch-go-term-results">Plot batch GO term results</h3> +<p>The <em><code>data.frame</code></em> generated by <em><code>GOCluster_Report</code></em> can be plotted with the <em><code>goBarplot</code></em> function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.</p> +<pre><code class="language-r">gos &lt;- BatchResultslim[grep(&quot;M6-V6_up_down&quot;, BatchResultslim$CLID), ] gos &lt;- BatchResultslim pdf(&quot;GOslimbarplotMF.pdf&quot;, height = 8, width = 10) goBarplot(gos, gocat = &quot;MF&quot;) dev.off() goBarplot(gos, gocat = &quot;BP&quot;) goBarplot(gos, gocat = &quot;CC&quot;) -</code></pre> -<p><img src="GOslimbarplotMF.png" alt=""></p> -<div align="center"> -<p><strong>Figure 10:</strong> GO Slim Barplot for MF Ontology.</p> -</div> -</br> -<h2 id="clustering-and-heat-maps">Clustering and heat maps</h2> -<p>The following example performs hierarchical clustering on the <em><code>rlog</code></em> transformed expression matrix subsetted by the DEGs identified in the -above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.</p> -<pre><code class="language-r">library(pheatmap) +</code></pre> +<p><img src="GOslimbarplotMF.png" alt=""></p> +<div align="center"> +<p><strong>Figure 10:</strong> GO Slim Barplot for MF Ontology.</p> +</div> +</br> +<h2 id="clustering-and-heat-maps">Clustering and heat maps</h2> +<p>The following example performs hierarchical clustering on the <em><code>rlog</code></em> transformed expression matrix subsetted by the DEGs identified in the +above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.</p> +<pre><code class="language-r">library(pheatmap) geneids &lt;- unique(as.character(unlist(DEG_list[[1]]))) y &lt;- assay(rlog(dds))[geneids, ] pdf(&quot;heatmap1.pdf&quot;) pheatmap(y, scale = &quot;row&quot;, clustering_distance_rows = &quot;correlation&quot;, clustering_distance_cols = &quot;correlation&quot;) dev.off() -</code></pre> -<center> -<img src="heatmap1.png"> -</center> -<div align="center"> -<p><strong>Figure 11:</strong> Heat map with hierarchical clustering dendrograms of DEGs.</p> -</div> -</br> -<h1 id="references">References</h1> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-Kim2015-ve" class="csl-entry"> -<p>Kim, Daehwan, Ben Langmead, and Steven L Salzberg. 2015. “HISAT: A Fast Spliced Aligner with Low Memory Requirements.” <em>Nat. Methods</em> 12 (4): 357–60.</p> -</div> -<div id="ref-Kim2013-vg" class="csl-entry"> -<p>Kim, Daehwan, Geo Pertea, Cole Trapnell, Harold Pimentel, Ryan Kelley, and Steven L Salzberg. 2013. “TopHat2: Accurate Alignment of Transcriptomes in the Presence of Insertions, Deletions and Gene Fusions.” <em>Genome Biol.</em> 14 (4): R36. <a href="https://doi.org/10.1186/gb-2013-14-4-r36">https://doi.org/10.1186/gb-2013-14-4-r36</a>.</p> -</div> -<div id="ref-Langmead2012-bs" class="csl-entry"> -<p>Langmead, Ben, and Steven L Salzberg. 2012. “Fast Gapped-Read Alignment with Bowtie 2.” <em>Nat. Methods</em> 9 (4): 357–59. <a href="https://doi.org/10.1038/nmeth.1923">https://doi.org/10.1038/nmeth.1923</a>.</p> -</div> -<div id="ref-Love2014-sh" class="csl-entry"> -<p>Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for <span class="nocase">RNA-seq</span> Data with DESeq2.” <em>Genome Biol.</em> 15 (12): 550. <a href="https://doi.org/10.1186/s13059-014-0550-8">https://doi.org/10.1186/s13059-014-0550-8</a>.</p> -</div> -<div id="ref-Rsamtools" class="csl-entry"> -<p>Morgan, Martin, Hervé Pagès, Valerie Obenchain, and Nathaniel Hayden. 2019. <em>Rsamtools: Binary Alignment (BAM), FASTA, Variant Call (BCF), and Tabix File Import</em>. <a href="http://bioconductor.org/packages/Rsamtools">http://bioconductor.org/packages/Rsamtools</a>.</p> -</div> -<div id="ref-Robinson2010-uk" class="csl-entry"> -<p>Robinson, M D, D J McCarthy, and G K Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” <em>Bioinformatics</em> 26 (1): 139–40. <a href="https://doi.org/10.1093/bioinformatics/btp616">https://doi.org/10.1093/bioinformatics/btp616</a>.</p> -</div> -<div id="ref-Wu2010-iq" class="csl-entry"> -<p>Wu, T D, and S Nacu. 2010. “Fast and <span class="nocase">SNP-tolerant</span> Detection of Complex Variants and Splicing in Short Reads.” <em>Bioinformatics</em> 26 (7): 873–81. <a href="https://doi.org/10.1093/bioinformatics/btq057">https://doi.org/10.1093/bioinformatics/btq057</a>.</p> -</div> -</div>Sp: Workflow Templates/sp/spr/templates/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/templates/ -<!-- +</code></pre> +<center> +<img src="heatmap1.png"> +</center> +<div align="center"> +<p><strong>Figure 11:</strong> Heat map with hierarchical clustering dendrograms of DEGs.</p> +</div> +</br> +<h1 id="references">References</h1> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-Kim2015-ve" class="csl-entry"> +<p>Kim, Daehwan, Ben Langmead, and Steven L Salzberg. 2015. “HISAT: A Fast Spliced Aligner with Low Memory Requirements.” <em>Nat. Methods</em> 12 (4): 357–60.</p> +</div> +<div id="ref-Kim2013-vg" class="csl-entry"> +<p>Kim, Daehwan, Geo Pertea, Cole Trapnell, Harold Pimentel, Ryan Kelley, and Steven L Salzberg. 2013. “TopHat2: Accurate Alignment of Transcriptomes in the Presence of Insertions, Deletions and Gene Fusions.” <em>Genome Biol.</em> 14 (4): R36. <a href="https://doi.org/10.1186/gb-2013-14-4-r36">https://doi.org/10.1186/gb-2013-14-4-r36</a>.</p> +</div> +<div id="ref-Langmead2012-bs" class="csl-entry"> +<p>Langmead, Ben, and Steven L Salzberg. 2012. “Fast Gapped-Read Alignment with Bowtie 2.” <em>Nat. Methods</em> 9 (4): 357–59. <a href="https://doi.org/10.1038/nmeth.1923">https://doi.org/10.1038/nmeth.1923</a>.</p> +</div> +<div id="ref-Love2014-sh" class="csl-entry"> +<p>Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for <span class="nocase">RNA-seq</span> Data with DESeq2.” <em>Genome Biol.</em> 15 (12): 550. <a href="https://doi.org/10.1186/s13059-014-0550-8">https://doi.org/10.1186/s13059-014-0550-8</a>.</p> +</div> +<div id="ref-Rsamtools" class="csl-entry"> +<p>Morgan, Martin, Hervé Pagès, Valerie Obenchain, and Nathaniel Hayden. 2019. <em>Rsamtools: Binary Alignment (BAM), FASTA, Variant Call (BCF), and Tabix File Import</em>. <a href="http://bioconductor.org/packages/Rsamtools">http://bioconductor.org/packages/Rsamtools</a>.</p> +</div> +<div id="ref-Robinson2010-uk" class="csl-entry"> +<p>Robinson, M D, D J McCarthy, and G K Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” <em>Bioinformatics</em> 26 (1): 139–40. <a href="https://doi.org/10.1093/bioinformatics/btp616">https://doi.org/10.1093/bioinformatics/btp616</a>.</p> +</div> +<div id="ref-Wu2010-iq" class="csl-entry"> +<p>Wu, T D, and S Nacu. 2010. “Fast and <span class="nocase">SNP-tolerant</span> Detection of Complex Variants and Splicing in Short Reads.” <em>Bioinformatics</em> 26 (7): 873–81. <a href="https://doi.org/10.1093/bioinformatics/btq057">https://doi.org/10.1093/bioinformatics/btq057</a>.</p> +</div> +</div> + + + + + + Sp: Workflow Templates + /sp/spr/templates/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/templates/ + + + + <!-- - Compile from command-line -Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeR.Rmd', tangle=TRUE)"; Rscript ../md2jekyll.R systemPipeR.knit.md 2; Rscript -e "rmarkdown::render('systemPipeR.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h1 id="workflow-templates">Workflow templates</h1> -<p>The intended way of running <em><code>systemPipeR</code></em> workflows is via <em><code>*.Rmd</code></em> files, which +</script> +<h1 id="workflow-templates">Workflow templates</h1> +<p>The intended way of running <em><code>systemPipeR</code></em> workflows is via <em><code>*.Rmd</code></em> files, which can be executed either line-wise in interactive mode or with a single command from R or the command-line. This way comprehensive and reproducible analysis reports can be generated in PDF or HTML format in a fully automated manner by making use of the highly functional reporting utilities available for R. -The following shows how to execute a workflow (<em>e.g.</em>, systemPipeRNAseq.Rmd) -from the command-line.</p> -<pre><code class="language-bash">Rscript -e &quot;rmarkdown::render('systemPipeRNAseq.Rmd')&quot; -</code></pre> -<p>Templates for setting up custom project reports are provided as *<code>*.Rmd</code>* files by the helper package *<code>systemPipeRdata</code>* and in the vignettes subdirectory of <em><code>systemPipeR</code><em>. The corresponding HTML of these report templates are available here: </em><code>systemPipeRNAseq</code></em><a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRNAseq.html"></a>, <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRIBOseq.html"><em><code>systemPipeRIBOseq</code></em></a>, <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeChIPseq.html"><em><code>systemPipeChIPseq</code></em></a> and <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeVARseq.html"><em><code>systemPipeVARseq</code></em></a>. To work with <em><code>*.Rnw</code>* or <em><code>*.Rmd</code>* files efficiently, basic knowledge of </em><code>Sweave</code></em><a href="https://www.stat.uni-muenchen.de/~leisch/Sweave/"></a> or <a href="http://yihui.name/knitr/"><em><code>knitr</code></em></a> and <a href="http://www.latex-project.org/"><em><code>Latex</code></em></a> or <a href="http://rmarkdown.rstudio.com/"><em><code>R Markdown v2</code></em></a> is required.</p> -<h2 id="rna-seq-sample">RNA-Seq sample</h2> -<p>Load the RNA-Seq sample workflow into your current working directory.</p> -<pre><code class="language-r">library(systemPipeRdata) +The following shows how to execute a workflow (<em>e.g.</em>, systemPipeRNAseq.Rmd) +from the command-line.</p> +<pre><code class="language-bash">Rscript -e &quot;rmarkdown::render('systemPipeRNAseq.Rmd')&quot; +</code></pre> +<p>Templates for setting up custom project reports are provided as *<code>*.Rmd</code>* files by the helper package *<code>systemPipeRdata</code>* and in the vignettes subdirectory of <em><code>systemPipeR</code><em>. The corresponding HTML of these report templates are available here: </em><code>systemPipeRNAseq</code></em><a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRNAseq.html"></a>, <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeRIBOseq.html"><em><code>systemPipeRIBOseq</code></em></a>, <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeChIPseq.html"><em><code>systemPipeChIPseq</code></em></a> and <a href="http://www.bioconductor.org/packages/devel/data/experiment/vignettes/systemPipeRdata/inst/doc/systemPipeVARseq.html"><em><code>systemPipeVARseq</code></em></a>. To work with <em><code>*.Rnw</code>* or <em><code>*.Rmd</code>* files efficiently, basic knowledge of </em><code>Sweave</code></em><a href="https://www.stat.uni-muenchen.de/~leisch/Sweave/"></a> or <a href="http://yihui.name/knitr/"><em><code>knitr</code></em></a> and <a href="http://www.latex-project.org/"><em><code>Latex</code></em></a> or <a href="http://rmarkdown.rstudio.com/"><em><code>R Markdown v2</code></em></a> is required.</p> +<h2 id="rna-seq-sample">RNA-Seq sample</h2> +<p>Load the RNA-Seq sample workflow into your current working directory.</p> +<pre><code class="language-r">library(systemPipeRdata) genWorkenvir(workflow = &quot;rnaseq&quot;) setwd(&quot;rnaseq&quot;) -</code></pre> -<h3 id="run-workflow">Run workflow</h3> -<p>Next, run the chosen sample workflow <em><code>systemPipeRNAseq</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/rnaseq/systemPipeRNAseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/rnaseq/systemPipeRNAseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>rnaseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> -<p>The workflow includes following steps:</p> -<ol> -<li>Read preprocessing -<ul> -<li>Quality filtering (trimming)</li> -<li>FASTQ quality report</li> -</ul> -</li> -<li>Alignments: <em><code>Tophat2</code></em> (or any other RNA-Seq aligner)</li> -<li>Alignment stats</li> -<li>Read counting</li> -<li>Sample-wise correlation analysis</li> -<li>Analysis of differentially expressed genes (DEGs)</li> -<li>GO term enrichment analysis</li> -<li>Gene-wise clustering</li> -</ol> -<h2 id="chip-seq-sample">ChIP-Seq sample</h2> -<p>Load the ChIP-Seq sample workflow into your current working directory.</p> -<pre><code class="language-r">library(systemPipeRdata) +</code></pre> +<h3 id="run-workflow">Run workflow</h3> +<p>Next, run the chosen sample workflow <em><code>systemPipeRNAseq</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/rnaseq/systemPipeRNAseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/rnaseq/systemPipeRNAseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>rnaseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> +<p>The workflow includes following steps:</p> +<ol> +<li>Read preprocessing +<ul> +<li>Quality filtering (trimming)</li> +<li>FASTQ quality report</li> +</ul> +</li> +<li>Alignments: <em><code>Tophat2</code></em> (or any other RNA-Seq aligner)</li> +<li>Alignment stats</li> +<li>Read counting</li> +<li>Sample-wise correlation analysis</li> +<li>Analysis of differentially expressed genes (DEGs)</li> +<li>GO term enrichment analysis</li> +<li>Gene-wise clustering</li> +</ol> +<h2 id="chip-seq-sample">ChIP-Seq sample</h2> +<p>Load the ChIP-Seq sample workflow into your current working directory.</p> +<pre><code class="language-r">library(systemPipeRdata) genWorkenvir(workflow = &quot;chipseq&quot;) setwd(&quot;chipseq&quot;) -</code></pre> -<h3 id="run-workflow-1">Run workflow</h3> -<p>Next, run the chosen sample workflow <em><code>systemPipeChIPseq_single</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/chipseq/systemPipeChIPseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/chipseq/systemPipeChIPseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>chipseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> -<p>The workflow includes the following steps:</p> -<ol> -<li>Read preprocessing -<ul> -<li>Quality filtering (trimming)</li> -<li>FASTQ quality report</li> -</ul> -</li> -<li>Alignments: <em><code>Bowtie2</code></em> or <em><code>rsubread</code></em></li> -<li>Alignment stats</li> -<li>Peak calling: <em><code>MACS2</code></em>, <em><code>BayesPeak</code></em></li> -<li>Peak annotation with genomic context</li> -<li>Differential binding analysis</li> -<li>GO term enrichment analysis</li> -<li>Motif analysis</li> -</ol> -<h2 id="var-seq-sample">VAR-Seq sample</h2> -<h3 id="var-seq-workflow-for-the-single-machine">VAR-Seq workflow for the single machine</h3> -<p>Load the VAR-Seq sample workflow into your current working directory.</p> -<pre><code class="language-r">library(systemPipeRdata) +</code></pre> +<h3 id="run-workflow-1">Run workflow</h3> +<p>Next, run the chosen sample workflow <em><code>systemPipeChIPseq_single</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/chipseq/systemPipeChIPseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/chipseq/systemPipeChIPseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>chipseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> +<p>The workflow includes the following steps:</p> +<ol> +<li>Read preprocessing +<ul> +<li>Quality filtering (trimming)</li> +<li>FASTQ quality report</li> +</ul> +</li> +<li>Alignments: <em><code>Bowtie2</code></em> or <em><code>rsubread</code></em></li> +<li>Alignment stats</li> +<li>Peak calling: <em><code>MACS2</code></em>, <em><code>BayesPeak</code></em></li> +<li>Peak annotation with genomic context</li> +<li>Differential binding analysis</li> +<li>GO term enrichment analysis</li> +<li>Motif analysis</li> +</ol> +<h2 id="var-seq-sample">VAR-Seq sample</h2> +<h3 id="var-seq-workflow-for-the-single-machine">VAR-Seq workflow for the single machine</h3> +<p>Load the VAR-Seq sample workflow into your current working directory.</p> +<pre><code class="language-r">library(systemPipeRdata) genWorkenvir(workflow = &quot;varseq&quot;) setwd(&quot;varseq&quot;) -</code></pre> -<h3 id="run-workflow-2">Run workflow</h3> -<p>Next, run the chosen sample workflow <em><code>systemPipeVARseq_single</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq_single.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq_single.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>varseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> -<p>The workflow includes following steps:</p> -<ol> -<li>Read preprocessing -<ul> -<li>Quality filtering (trimming)</li> -<li>FASTQ quality report</li> -</ul> -</li> -<li>Alignments: <em><code>gsnap</code></em>, <em><code>bwa</code></em></li> -<li>Variant calling: <em><code>VariantTools</code></em>, <em><code>GATK</code></em>, <em><code>BCFtools</code></em></li> -<li>Variant filtering: <em><code>VariantTools</code></em> and <em><code>VariantAnnotation</code></em></li> -<li>Variant annotation: <em><code>VariantAnnotation</code></em></li> -<li>Combine results from many samples</li> -<li>Summary statistics of samples</li> -</ol> -<h3 id="var-seq-workflow-for-computer-cluster">VAR-Seq workflow for computer cluster</h3> -<p>The workflow template provided for this step is called <em><code>systemPipeVARseq.Rmd</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq.Rmd">Rmd</a>). -It runs the above VAR-Seq workflow in parallel on multiple compute nodes of an HPC system using Slurm as the scheduler.</p> -<h2 id="ribo-seq-sample">Ribo-Seq sample</h2> -<p>Load the Ribo-Seq sample workflow into your current working directory.</p> -<pre><code class="language-r">library(systemPipeRdata) +</code></pre> +<h3 id="run-workflow-2">Run workflow</h3> +<p>Next, run the chosen sample workflow <em><code>systemPipeVARseq_single</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq_single.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq_single.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>varseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> +<p>The workflow includes following steps:</p> +<ol> +<li>Read preprocessing +<ul> +<li>Quality filtering (trimming)</li> +<li>FASTQ quality report</li> +</ul> +</li> +<li>Alignments: <em><code>gsnap</code></em>, <em><code>bwa</code></em></li> +<li>Variant calling: <em><code>VariantTools</code></em>, <em><code>GATK</code></em>, <em><code>BCFtools</code></em></li> +<li>Variant filtering: <em><code>VariantTools</code></em> and <em><code>VariantAnnotation</code></em></li> +<li>Variant annotation: <em><code>VariantAnnotation</code></em></li> +<li>Combine results from many samples</li> +<li>Summary statistics of samples</li> +</ol> +<h3 id="var-seq-workflow-for-computer-cluster">VAR-Seq workflow for computer cluster</h3> +<p>The workflow template provided for this step is called <em><code>systemPipeVARseq.Rmd</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/varseq/systemPipeVARseq.Rmd">Rmd</a>). +It runs the above VAR-Seq workflow in parallel on multiple compute nodes of an HPC system using Slurm as the scheduler.</p> +<h2 id="ribo-seq-sample">Ribo-Seq sample</h2> +<p>Load the Ribo-Seq sample workflow into your current working directory.</p> +<pre><code class="language-r">library(systemPipeRdata) genWorkenvir(workflow = &quot;riboseq&quot;) setwd(&quot;riboseq&quot;) -</code></pre> -<h3 id="run-workflow-3">Run workflow</h3> -<p>Next, run the chosen sample workflow <em><code>systemPipeRIBOseq</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/riboseq/systemPipeRIBOseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/ribseq/systemPipeRIBOseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>ribseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> -<p>The workflow includes following steps:</p> -<ol> -<li>Read preprocessing -<ul> -<li>Adaptor trimming and quality filtering</li> -<li>FASTQ quality report</li> -</ul> -</li> -<li>Alignments: <em><code>Tophat2</code></em> (or any other RNA-Seq aligner)</li> -<li>Alignment stats</li> -<li>Compute read distribution across genomic features</li> -<li>Adding custom features to the workflow (e.g. uORFs)</li> -<li>Genomic read coverage along with transcripts</li> -<li>Read counting</li> -<li>Sample-wise correlation analysis</li> -<li>Analysis of differentially expressed genes (DEGs)</li> -<li>GO term enrichment analysis</li> -<li>Gene-wise clustering</li> -<li>Differential ribosome binding (translational efficiency)</li> -</ol> -<h1 id="version-information">Version information</h1> -<p><strong>Note:</strong> the most recent version of this tutorial can be found <a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html">here</a>.</p> -<pre><code class="language-r">sessionInfo() -</code></pre> -<pre><code>## R version 4.0.3 (2020-10-10) +</code></pre> +<h3 id="run-workflow-3">Run workflow</h3> +<p>Next, run the chosen sample workflow <em><code>systemPipeRIBOseq</code></em> (<a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/riboseq/systemPipeRIBOseq.pdf?raw=true">PDF</a>, <a href="https://github.com/tgirke/systemPipeRdata/blob/master/inst/extdata/workflows/ribseq/systemPipeRIBOseq.Rmd">Rmd</a>) by executing from the command-line <em><code>make -B</code></em> within the <em><code>ribseq</code></em> directory. Alternatively, one can run the code from the provided <em><code>*.Rmd</code></em> template file from within R interactively.</p> +<p>The workflow includes following steps:</p> +<ol> +<li>Read preprocessing +<ul> +<li>Adaptor trimming and quality filtering</li> +<li>FASTQ quality report</li> +</ul> +</li> +<li>Alignments: <em><code>Tophat2</code></em> (or any other RNA-Seq aligner)</li> +<li>Alignment stats</li> +<li>Compute read distribution across genomic features</li> +<li>Adding custom features to the workflow (e.g. uORFs)</li> +<li>Genomic read coverage along with transcripts</li> +<li>Read counting</li> +<li>Sample-wise correlation analysis</li> +<li>Analysis of differentially expressed genes (DEGs)</li> +<li>GO term enrichment analysis</li> +<li>Gene-wise clustering</li> +<li>Differential ribosome binding (translational efficiency)</li> +</ol> +<h1 id="version-information">Version information</h1> +<p><strong>Note:</strong> the most recent version of this tutorial can be found <a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html">here</a>.</p> +<pre><code class="language-r">sessionInfo() +</code></pre> +<pre><code>## R version 4.0.3 (2020-10-10) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS -## +## ## Matrix products: default -## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 +## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-4.0.3/lib/libRlapack.so -## +## ## locale: -## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C -## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 -## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 -## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C -## [9] LC_ADDRESS=C LC_TELEPHONE=C -## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C -## +## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C +## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 +## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 +## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C +## [9] LC_ADDRESS=C LC_TELEPHONE=C +## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C +## ## attached base packages: -## [1] stats4 parallel stats graphics grDevices utils datasets -## [8] methods base -## +## [1] stats4 parallel stats graphics grDevices utils datasets +## [8] methods base +## ## other attached packages: -## [1] magrittr_2.0.1 batchtools_0.9.15 -## [3] ape_5.4-1 ggplot2_3.3.3 -## [5] systemPipeR_1.25.6 ShortRead_1.48.0 -## [7] GenomicAlignments_1.26.0 SummarizedExperiment_1.20.0 -## [9] Biobase_2.50.0 MatrixGenerics_1.2.1 -## [11] matrixStats_0.58.0 BiocParallel_1.24.1 -## [13] Rsamtools_2.6.0 Biostrings_2.58.0 -## [15] XVector_0.30.0 GenomicRanges_1.42.0 -## [17] GenomeInfoDb_1.26.2 IRanges_2.24.1 -## [19] S4Vectors_0.28.1 BiocGenerics_0.36.0 -## [21] BiocStyle_2.18.1 -## +## [1] magrittr_2.0.1 batchtools_0.9.15 +## [3] ape_5.4-1 ggplot2_3.3.3 +## [5] systemPipeR_1.25.6 ShortRead_1.48.0 +## [7] GenomicAlignments_1.26.0 SummarizedExperiment_1.20.0 +## [9] Biobase_2.50.0 MatrixGenerics_1.2.1 +## [11] matrixStats_0.58.0 BiocParallel_1.24.1 +## [13] Rsamtools_2.6.0 Biostrings_2.58.0 +## [15] XVector_0.30.0 GenomicRanges_1.42.0 +## [17] GenomeInfoDb_1.26.2 IRanges_2.24.1 +## [19] S4Vectors_0.28.1 BiocGenerics_0.36.0 +## [21] BiocStyle_2.18.1 +## ## loaded via a namespace (and not attached): -## [1] colorspace_2.0-0 rjson_0.2.20 hwriter_1.3.2 -## [4] ellipsis_0.3.1 bit64_4.0.5 AnnotationDbi_1.52.0 -## [7] xml2_1.3.2 codetools_0.2-18 splines_4.0.3 -## [10] cachem_1.0.3 knitr_1.31 jsonlite_1.7.2 -## [13] annotate_1.68.0 GO.db_3.12.1 dbplyr_2.1.0 -## [16] png_0.1-7 pheatmap_1.0.12 graph_1.68.0 -## [19] BiocManager_1.30.10 compiler_4.0.3 httr_1.4.2 -## [22] GOstats_2.56.0 backports_1.2.1 assertthat_0.2.1 -## [25] Matrix_1.3-2 fastmap_1.1.0 limma_3.46.0 -## [28] formatR_1.7 htmltools_0.5.1.1 prettyunits_1.1.1 -## [31] tools_4.0.3 gtable_0.3.0 glue_1.4.2 -## [34] GenomeInfoDbData_1.2.4 Category_2.56.0 dplyr_1.0.4 -## [37] rsvg_2.1 rappdirs_0.3.3 V8_3.4.0 -## [40] Rcpp_1.0.6 vctrs_0.3.6 nlme_3.1-152 -## [43] blogdown_1.1.7 rtracklayer_1.50.0 xfun_0.21 -## [46] stringr_1.4.0 lifecycle_1.0.0.9000 XML_3.99-0.5 -## [49] edgeR_3.32.1 zlibbioc_1.36.0 scales_1.1.1 -## [52] BSgenome_1.58.0 VariantAnnotation_1.36.0 hms_1.0.0 -## [55] RBGL_1.66.0 RColorBrewer_1.1-2 yaml_2.2.1 -## [58] curl_4.3 memoise_2.0.0 biomaRt_2.46.3 -## [61] latticeExtra_0.6-29 stringi_1.5.3 RSQLite_2.2.3 -## [64] genefilter_1.72.1 checkmate_2.0.0 GenomicFeatures_1.42.1 -## [67] DOT_0.1 rlang_0.4.10 pkgconfig_2.0.3 -## [70] bitops_1.0-6 evaluate_0.14 lattice_0.20-41 -## [73] purrr_0.3.4 bit_4.0.4 tidyselect_1.1.0 -## [76] GSEABase_1.52.1 AnnotationForge_1.32.0 bookdown_0.21 -## [79] R6_2.5.0 generics_0.1.0 base64url_1.4 -## [82] DelayedArray_0.16.1 DBI_1.1.1 withr_2.4.1 -## [85] pillar_1.4.7 survival_3.2-7 RCurl_1.98-1.2 -## [88] tibble_3.0.6 crayon_1.4.1 BiocFileCache_1.14.0 -## [91] rmarkdown_2.6 jpeg_0.1-8.1 progress_1.2.2 -## [94] locfit_1.5-9.4 grid_4.0.3 data.table_1.13.6 -## [97] blob_1.2.1 Rgraphviz_2.34.0 digest_0.6.27 -## [100] xtable_1.8-4 brew_1.0-6 openssl_1.4.3 -## [103] munsell_0.5.0 askpass_1.1 -</code></pre> -<h1 id="references">References</h1>Sp: Help Manual/sp/spr/spr_funcs/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/spr_funcs/ -<hr> -<style> -.td-content li a { -font-size: 1.5rem; -} -</style> -<h2 id="systempiper-functions-reference-manuals"><em>systempipeR</em> Functions Reference Manuals</h2> -<p>The following reference manual was created by <a href="http://bioconductor.org/packages/devel/bioc/html/systemPipeR.html">systemPipeR Development version</a>.</p> -<ul> -<li><a href="../../spr/funcs/spr/reference">systemPipeR Reference Manual</a></li> -</ul> -<hr>Sp: SPR detailed installation instructions/sp/spr/sprinstall/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/sprinstall/ -<style type="text/css"> +## [1] colorspace_2.0-0 rjson_0.2.20 hwriter_1.3.2 +## [4] ellipsis_0.3.1 bit64_4.0.5 AnnotationDbi_1.52.0 +## [7] xml2_1.3.2 codetools_0.2-18 splines_4.0.3 +## [10] cachem_1.0.3 knitr_1.31 jsonlite_1.7.2 +## [13] annotate_1.68.0 GO.db_3.12.1 dbplyr_2.1.0 +## [16] png_0.1-7 pheatmap_1.0.12 graph_1.68.0 +## [19] BiocManager_1.30.10 compiler_4.0.3 httr_1.4.2 +## [22] GOstats_2.56.0 backports_1.2.1 assertthat_0.2.1 +## [25] Matrix_1.3-2 fastmap_1.1.0 limma_3.46.0 +## [28] formatR_1.7 htmltools_0.5.1.1 prettyunits_1.1.1 +## [31] tools_4.0.3 gtable_0.3.0 glue_1.4.2 +## [34] GenomeInfoDbData_1.2.4 Category_2.56.0 dplyr_1.0.4 +## [37] rsvg_2.1 rappdirs_0.3.3 V8_3.4.0 +## [40] Rcpp_1.0.6 vctrs_0.3.6 nlme_3.1-152 +## [43] blogdown_1.1.7 rtracklayer_1.50.0 xfun_0.21 +## [46] stringr_1.4.0 lifecycle_1.0.0.9000 XML_3.99-0.5 +## [49] edgeR_3.32.1 zlibbioc_1.36.0 scales_1.1.1 +## [52] BSgenome_1.58.0 VariantAnnotation_1.36.0 hms_1.0.0 +## [55] RBGL_1.66.0 RColorBrewer_1.1-2 yaml_2.2.1 +## [58] curl_4.3 memoise_2.0.0 biomaRt_2.46.3 +## [61] latticeExtra_0.6-29 stringi_1.5.3 RSQLite_2.2.3 +## [64] genefilter_1.72.1 checkmate_2.0.0 GenomicFeatures_1.42.1 +## [67] DOT_0.1 rlang_0.4.10 pkgconfig_2.0.3 +## [70] bitops_1.0-6 evaluate_0.14 lattice_0.20-41 +## [73] purrr_0.3.4 bit_4.0.4 tidyselect_1.1.0 +## [76] GSEABase_1.52.1 AnnotationForge_1.32.0 bookdown_0.21 +## [79] R6_2.5.0 generics_0.1.0 base64url_1.4 +## [82] DelayedArray_0.16.1 DBI_1.1.1 withr_2.4.1 +## [85] pillar_1.4.7 survival_3.2-7 RCurl_1.98-1.2 +## [88] tibble_3.0.6 crayon_1.4.1 BiocFileCache_1.14.0 +## [91] rmarkdown_2.6 jpeg_0.1-8.1 progress_1.2.2 +## [94] locfit_1.5-9.4 grid_4.0.3 data.table_1.13.6 +## [97] blob_1.2.1 Rgraphviz_2.34.0 digest_0.6.27 +## [100] xtable_1.8-4 brew_1.0-6 openssl_1.4.3 +## [103] munsell_0.5.0 askpass_1.1 +</code></pre> +<h1 id="references">References</h1> + + + + + + Sp: CWL syntax + /sp/spr/cwl_syntax/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/cwl_syntax/ + + + + <script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; +}); +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; +}); +</script> +<h2 id="cwl-syntax">CWL syntax</h2> +<p>This section will introduce how CWL describes command-line tools and the +specification and terminology of each file. +For complete documentation, please check the CommandLineTools documentation <a href="https://www.commonwl.org/v1.2/CommandLineTool.html">here</a> +and <a href="https://www.commonwl.org/v1.2/Workflow.html">here</a> for Workflows and the user guide <a href="https://www.commonwl.org/user_guide/">here</a>.</p> +<p>CWL command-line specifications are written in <a href="http://yaml.org/">YAML</a> format.</p> +<p>In CWL, files with the extension <code>.cwl</code> define the parameters of a chosen +command-line step or workflow, while files with the extension <code>.yml</code> define +the input variables of command-line steps.</p> +<h3 id="cwl-commandlinetool">CWL <code>CommandLineTool</code></h3> +<p><code>CommandLineTool</code> by CWL definition is a standalone process, with no interaction +if other programs, execute a program, and produce output.</p> +<p>Let’s explore the <code>*.cwl</code> file:</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl&quot;, package = &quot;systemPipeR&quot;) +cwl &lt;- yaml::read_yaml(file.path(dir_path, &quot;example/example.cwl&quot;)) +</code></pre> +<ul> +<li>The <code>cwlVersion</code> component shows the CWL specification version used by the document.</li> +<li>The <code>class</code> component shows this document describes a <code>CommandLineTool.</code> +Note that CWL has another <code>class</code>, called <code>Workflow</code> which represents a union of one +or more command-line tools together.</li> +</ul> +<pre><code class="language-r">cwl[1:2] +</code></pre> +<pre><code>## $cwlVersion +## [1] &quot;v1.0&quot; +## +## $class +## [1] &quot;CommandLineTool&quot; +</code></pre> +<ul> +<li><code>baseCommand</code> component provides the name of the software that we desire to execute.</li> +</ul> +<pre><code class="language-r">cwl[3] +</code></pre> +<pre><code>## $baseCommand +## [1] &quot;echo&quot; +</code></pre> +<ul> +<li>The <code>inputs</code> section provides the input information to run the tool. Important +components of this section are: +<ul> +<li><code>id</code>: each input has an id describing the input name;</li> +<li><code>type</code>: describe the type of input value (string, int, long, float, double, +File, Directory or Any);</li> +<li><code>inputBinding</code>: It is optional. This component indicates if the input +parameter should appear on the command-line. If this component is missing +when describing an input parameter, it will not appear in the command-line +but can be used to build the command-line.</li> +</ul> +</li> +</ul> +<pre><code class="language-r">cwl[4] +</code></pre> +<pre><code>## $inputs +## $inputs$message +## $inputs$message$type +## [1] &quot;string&quot; +## +## $inputs$message$inputBinding +## $inputs$message$inputBinding$position +## [1] 1 +## +## +## +## $inputs$SampleName +## $inputs$SampleName$type +## [1] &quot;string&quot; +## +## +## $inputs$results_path +## $inputs$results_path$type +## [1] &quot;Directory&quot; +</code></pre> +<ul> +<li>The <code>outputs</code> section should provide a list of the expected outputs after running the command-line tools. Important +components of this section are: +<ul> +<li><code>id</code>: each input has an id describing the output name;</li> +<li><code>type</code>: describe the type of output value (string, int, long, float, double, +File, Directory, Any or <code>stdout</code>);</li> +<li><code>outputBinding</code>: This component defines how to set the outputs values. The <code>glob</code> component will define the name of the output value.</li> +</ul> +</li> +</ul> +<pre><code class="language-r">cwl[5] +</code></pre> +<pre><code>## $outputs +## $outputs$string +## $outputs$string$type +## [1] &quot;stdout&quot; +</code></pre> +<ul> +<li><code>stdout</code>: component to specify a <code>filename</code> to capture standard output. +Note here we are using a syntax that takes advantage of the inputs section, +using results_path parameter and also the <code>SampleName</code> to construct the output <code>filename.</code></li> +</ul> +<pre><code class="language-r">cwl[6] +</code></pre> +<pre><code>## $stdout +## [1] &quot;$(inputs.results_path.basename)/$(inputs.SampleName).txt&quot; +</code></pre> +<h3 id="cwl-workflow">CWL <code>Workflow</code></h3> +<p><code>Workflow</code> class in CWL is defined by multiple process steps, where can have +interdependencies between the steps, and the output for one step can be used as +input in the further steps.</p> +<pre><code class="language-r">cwl.wf &lt;- yaml::read_yaml(file.path(dir_path, &quot;example/workflow_example.cwl&quot;)) +</code></pre> +<ul> +<li>The <code>cwlVersion</code> component shows the CWL specification version used by the document.</li> +<li>The <code>class</code> component shows this document describes a <code>Workflow</code>.</li> +</ul> +<pre><code class="language-r">cwl.wf[1:2] +</code></pre> +<pre><code>## $class +## [1] &quot;Workflow&quot; +## +## $cwlVersion +## [1] &quot;v1.0&quot; +</code></pre> +<ul> +<li>The <code>inputs</code> section describes the inputs of the workflow.</li> +</ul> +<pre><code class="language-r">cwl.wf[3] +</code></pre> +<pre><code>## $inputs +## $inputs$message +## [1] &quot;string&quot; +## +## $inputs$SampleName +## [1] &quot;string&quot; +## +## $inputs$results_path +## [1] &quot;Directory&quot; +</code></pre> +<ul> +<li>The <code>outputs</code> section describes the outputs of the workflow.</li> +</ul> +<pre><code class="language-r">cwl.wf[4] +</code></pre> +<pre><code>## $outputs +## $outputs$string +## $outputs$string$outputSource +## [1] &quot;echo/string&quot; +## +## $outputs$string$type +## [1] &quot;stdout&quot; +</code></pre> +<ul> +<li>The <code>steps</code> section describes the steps of the workflow. In this simple example, +we demonstrate one step.</li> +</ul> +<pre><code class="language-r">cwl.wf[5] +</code></pre> +<pre><code>## $steps +## $steps$echo +## $steps$echo$`in` +## $steps$echo$`in`$message +## [1] &quot;message&quot; +## +## $steps$echo$`in`$SampleName +## [1] &quot;SampleName&quot; +## +## $steps$echo$`in`$results_path +## [1] &quot;results_path&quot; +## +## +## $steps$echo$out +## [1] &quot;[string]&quot; +## +## $steps$echo$run +## [1] &quot;example/example.cwl&quot; +</code></pre> +<h3 id="cwl-input-parameter">CWL Input Parameter</h3> +<p>Next, let’s explore the <em>.yml</em> file, which provide the input parameter values for all +the components we describe above.</p> +<p>For this simple example, we have three parameters defined:</p> +<pre><code class="language-r">yaml::read_yaml(file.path(dir_path, &quot;example/example_single.yml&quot;)) +</code></pre> +<pre><code>## $message +## [1] &quot;Hello World!&quot; +## +## $SampleName +## [1] &quot;M1&quot; +## +## $results_path +## $results_path$class +## [1] &quot;Directory&quot; +## +## $results_path$path +## [1] &quot;./results&quot; +</code></pre> +<p>Note that if we define an input component in the <em>.cwl</em> file, this value needs +to be also defined here in the <em>.yml</em> file.</p> +<h3 id="reference">Reference</h3> + + + + + + Sp: SPR and CWL + /sp/spr/cwl_and_spr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/cwl_and_spr/ + + + + <script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; +}); +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; +}); +</script> +<h2 id="how-to-connect-cwl-description-files-within-systempiper">How to connect CWL description files within <em><code>systemPipeR</code></em></h2> +<p>This section will demonstrate how to connect CWL parameters files to create +workflows. In addition, we will show how the workflow can be easily scalable +with <em><code>systemPipeR</code></em>.</p> +<p><code>SYSargsList</code> container stores all the information and instructions needed for processing +a set of input files with a single or many command-line steps within a workflow +(i.e. several components of the software or several independent software tools). +The <code>SYSargsList</code> object is created and fully populated with the <code>SYSargsList</code> construct +function. +Full documentation of <code>SYSargsList</code> management instances can be found <a href="#sysargslist">here</a> +and <a href="#appendstep">here</a>.</p> +<p>The following imports a <code>.cwl</code> file (here <code>example.cwl</code>) for running the <code>echo Hello World!</code> +example.</p> +<pre><code class="language-r">HW &lt;- SYSargsList(wf_file = &quot;example/workflow_example.cwl&quot;, input_file = &quot;example/example_single.yml&quot;, + dir_path = system.file(&quot;extdata/cwl&quot;, package = &quot;systemPipeR&quot;)) +HW +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. Step_x --&gt; Status: Pending +## Total Files: 1 | Existing: 0 | Missing: 1 +## 1.1. echo +## cmdlist: 1 | Pending: 1 +## +</code></pre> +<pre><code class="language-r">cmdlist(HW) +</code></pre> +<pre><code>## $Step_x +## $Step_x$defaultid +## $Step_x$defaultid$echo +## [1] &quot;echo Hello World! &gt; results/M1.txt&quot; +</code></pre> +<p>However, we are limited to run just one command-line or one sample in this example. +To scale the command-line over many samples, a simple solution offered by <code>systemPipeR</code> +is to provide a <code>variable</code> for each of the parameters that we want to run with multiple samples.</p> +<p>Let’s explore the example:</p> +<pre><code class="language-r">dir_path &lt;- system.file(&quot;extdata/cwl&quot;, package = &quot;systemPipeR&quot;) +yml &lt;- yaml::read_yaml(file.path(dir_path, &quot;example/example.yml&quot;)) +yml +</code></pre> +<pre><code>## $message +## [1] &quot;_STRING_&quot; +## +## $SampleName +## [1] &quot;_SAMPLE_&quot; +## +## $results_path +## $results_path$class +## [1] &quot;Directory&quot; +## +## $results_path$path +## [1] &quot;./results&quot; +</code></pre> +<p>For the <code>message</code> and <code>SampleName</code> parameter, we are passing a variable connecting +with a third file called <code>targets.</code></p> +<p>Now, let’s explore the <code>targets</code> file structure:</p> +<pre><code class="language-r">targetspath &lt;- system.file(&quot;extdata/cwl/example/targets_example.txt&quot;, package = &quot;systemPipeR&quot;) +read.delim(targetspath, comment.char = &quot;#&quot;) +</code></pre> +<pre><code>## Message SampleName +## 1 Hello World! M1 +## 2 Hello USA! M2 +## 3 Hello Bioconductor! M3 +</code></pre> +<p>The <code>targets</code> file defines all input files or values and sample ids of an analysis workflow. +For this example, we have defined a string message for the <code>echo</code> command-line tool, +in the first column that will be evaluated, and the second column is the +<code>SampleName</code> id for each one of the messages. +Any number of additional columns can be added as needed.</p> +<p>Users should note here, the usage of <code>targets</code> files is optional when using +<code>systemPipeR's</code> new CWL interface. Since for organizing experimental variables targets +files are extremely useful and user-friendly. Thus, we encourage users to keep using them.</p> +<h3 id="how-to-connect-the-parameter-files-and-targets-file-information">How to connect the parameter files and <code>targets</code> file information?</h3> +<p>The constructor function creates an <code>SYSargsList</code> S4 class object connecting three input files:</p> +<ul> +<li>CWL command-line specification file (<code>wf_file</code> argument);</li> +<li>Input variables (<code>input_file</code> argument);</li> +<li>Targets file (<code>targets</code> argument).</li> +</ul> +<p>As demonstrated above, the latter is optional for workflow steps lacking input files. +The connection between input variables (here defined by <code>input_file</code> argument) +and the <code>targets</code> file are defined under the <code>inputvars</code> argument. +A named vector is required, where each element name needs to match with column +names in the <code>targets</code> file, and the value must match the names of the <em>.yml</em> +variables. This is used to replace the CWL variable and construct all the command-line +for that particular step.</p> +<p>The variable pattern <code>_XXXX_</code> is used to distinguish CWL variables that target +columns will replace. This pattern is recommended for consistency and easy identification +but not enforced.</p> +<p>The following imports a <code>.cwl</code> file (same example demonstrated above) for running +the <code>echo Hello World</code> example. However, now we are connecting the variable defined +on the <code>.yml</code> file with the <code>targets</code> file inputs.</p> +<pre><code class="language-r">HW_mul &lt;- SYSargsList(step_name = &quot;echo&quot;, targets = targetspath, wf_file = &quot;example/workflow_example.cwl&quot;, + input_file = &quot;example/example.yml&quot;, dir_path = dir_path, inputvars = c(Message = &quot;_STRING_&quot;, + SampleName = &quot;_SAMPLE_&quot;)) +HW_mul +</code></pre> +<pre><code>## Instance of 'SYSargsList': +## WF Steps: +## 1. echo --&gt; Status: Pending +## Total Files: 3 | Existing: 0 | Missing: 3 +## 1.1. echo +## cmdlist: 3 | Pending: 3 +## +</code></pre> +<pre><code class="language-r">cmdlist(HW_mul) +</code></pre> +<pre><code>## $echo +## $echo$M1 +## $echo$M1$echo +## [1] &quot;echo Hello World! &gt; results/M1.txt&quot; +## +## +## $echo$M2 +## $echo$M2$echo +## [1] &quot;echo Hello USA! &gt; results/M2.txt&quot; +## +## +## $echo$M3 +## $echo$M3$echo +## [1] &quot;echo Hello Bioconductor! &gt; results/M3.txt&quot; +</code></pre> +<div class="figure" style="text-align: center"> +<p><img src="../../home/dcassol/src/R-4.1.0/library/systemPipeR/extdata/images/SPR_CWL_hello.png" alt="WConnectivity between CWL param files and targets files." width="100%" /></p> +<p class="caption"> +Figure 1: WConnectivity between CWL param files and targets files. +</p> +</div> +<h2 id="creating-the-cwl-param-files-from-the-command-line">Creating the CWL param files from the command-line</h2> +<p>Users need to define the command-line in a pseudo-bash script format:</p> +<pre><code class="language-r">command &lt;- &quot; + hisat2 \ + -S &lt;F, out: ./results/M1A.sam&gt; \ + -x &lt;F: ./data/tair10.fasta&gt; \ + -k &lt;int: 1&gt; \ + -min-intronlen &lt;int: 30&gt; \ + -max-intronlen &lt;int: 3000&gt; \ + -threads &lt;int: 4&gt; \ + -U &lt;F: ./data/SRR446027_1.fastq.gz&gt; +&quot; +</code></pre> +<h3 id="define-prefix-and-defaults">Define prefix and defaults</h3> +<ul> +<li> +<p>First line is the base command. Each line is an argument with its default value.</p> +</li> +<li> +<p>For argument lines (starting from the second line), any word before the first +space with leading <code>-</code> or <code>--</code> in each will be treated as a prefix, like <code>-S</code> or +<code>--min</code>. Any line without this first word will be treated as no prefix.</p> +</li> +<li> +<p>All defaults are placed inside <code>&lt;...&gt;</code>.</p> +</li> +<li> +<p>First argument is the input argument type. <code>F</code> for “File,” “int,” “string” are unchanged.</p> +</li> +<li> +<p>Optional: use the keyword <code>out</code> followed the type with a <code>,</code> comma separation to +indicate if this argument is also an CWL output.</p> +</li> +<li> +<p>Then, use <code>:</code> to separate keywords and default values, any non-space value after the <code>:</code> +will be treated as the default value.</p> +</li> +<li> +<p>If any argument has no default value, just a flag, like <code>--verbose</code>, there is no need to add any <code>&lt;...&gt;</code></p> +</li> +</ul> +<h3 id="createparam-function"><code>createParam</code> Function</h3> +<p><code>createParam</code> function requires the <code>string</code> as defined above as an input.</p> +<p>First of all, the function will print the three components of the <code>cwl</code> file:</p> +<ul> +<li><code>BaseCommand</code>: Specifies the program to execute.</li> +<li><code>Inputs</code>: Defines the input parameters of the process.</li> +<li><code>Outputs</code>: Defines the parameters representing the output of the process.</li> +</ul> +<p>The four component is the original command-line.</p> +<p>If in interactive mode, the function will verify that everything is correct and +will ask you to proceed. Here, the user can answer “no” and provide more +information at the string level. Another question is to save the param created here.</p> +<p>If running the workflow in non-interactive mode, the <code>createParam</code> function will +consider “yes” and returning the container.</p> +<pre><code class="language-r">cmd &lt;- createParam(command, writeParamFiles = FALSE) +</code></pre> +<pre><code>## *****BaseCommand***** +## hisat2 +## *****Inputs***** +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +## k: +## type: int +## preF: -k +## yml: 1 +## min-intronlen: +## type: int +## preF: -min-intronlen +## yml: 30 +## max-intronlen: +## type: int +## preF: -max-intronlen +## yml: 3000 +## threads: +## type: int +## preF: -threads +## yml: 4 +## U: +## type: File +## preF: -U +## yml: ./data/SRR446027_1.fastq.gz +## *****Outputs***** +## output1: +## type: File +## value: ./results/M1A.sam +## *****Parsed raw command line***** +## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz +</code></pre> +<p>If the user chooses not to save the <code>param</code> files on the above operation, +it can use the <code>writeParamFiles</code> function.</p> +<pre><code class="language-r">writeParamFiles(cmd, overwrite = TRUE) +</code></pre> +<h3 id="how-to-access-and-edit-param-files">How to access and edit param files</h3> +<h4 id="print-a-component">Print a component</h4> +<pre><code class="language-r">printParam(cmd, position = &quot;baseCommand&quot;) ## Print a baseCommand section +</code></pre> +<pre><code>## *****BaseCommand***** +## hisat2 +</code></pre> +<pre><code class="language-r">printParam(cmd, position = &quot;outputs&quot;) +</code></pre> +<pre><code>## *****Outputs***** +## output1: +## type: File +## value: ./results/M1A.sam +</code></pre> +<pre><code class="language-r">printParam(cmd, position = &quot;inputs&quot;, index = 1:2) ## Print by index +</code></pre> +<pre><code>## *****Inputs***** +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +</code></pre> +<pre><code class="language-r">printParam(cmd, position = &quot;inputs&quot;, index = -1:-2) ## Negative indexing printing to exclude certain indices in a position +</code></pre> +<pre><code>## *****Inputs***** +## k: +## type: int +## preF: -k +## yml: 1 +## min-intronlen: +## type: int +## preF: -min-intronlen +## yml: 30 +## max-intronlen: +## type: int +## preF: -max-intronlen +## yml: 3000 +## threads: +## type: int +## preF: -threads +## yml: 4 +## U: +## type: File +## preF: -U +## yml: ./data/SRR446027_1.fastq.gz +</code></pre> +<h4 id="subsetting-the-command-line">Subsetting the command-line</h4> +<pre><code class="language-r">cmd2 &lt;- subsetParam(cmd, position = &quot;inputs&quot;, index = 1:2, trim = TRUE) +</code></pre> +<pre><code>## *****Inputs***** +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +## *****Parsed raw command line***** +## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta +</code></pre> +<pre><code class="language-r">cmdlist(cmd2) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta&quot; +</code></pre> +<pre><code class="language-r">cmd2 &lt;- subsetParam(cmd, position = &quot;inputs&quot;, index = c(&quot;S&quot;, &quot;x&quot;), trim = TRUE) +</code></pre> +<pre><code>## *****Inputs***** +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +## *****Parsed raw command line***** +## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta +</code></pre> +<pre><code class="language-r">cmdlist(cmd2) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta&quot; +</code></pre> +<h4 id="replacing-a-existing-argument-in-the-command-line">Replacing a existing argument in the command-line</h4> +<pre><code class="language-r">cmd3 &lt;- replaceParam(cmd, &quot;base&quot;, index = 1, replace = list(baseCommand = &quot;bwa&quot;)) +</code></pre> +<pre><code>## Replacing baseCommand +## *****BaseCommand***** +## bwa +## *****Parsed raw command line***** +## bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz +</code></pre> +<pre><code class="language-r">cmdlist(cmd3) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;bwa -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz&quot; +</code></pre> +<pre><code class="language-r">new_inputs &lt;- new_inputs &lt;- list(new_input1 = list(type = &quot;File&quot;, preF = &quot;-b&quot;, yml = &quot;myfile&quot;), + new_input2 = &quot;-L &lt;int: 4&gt;&quot;) +cmd4 &lt;- replaceParam(cmd, &quot;inputs&quot;, index = 1:2, replace = new_inputs) +</code></pre> +<pre><code>## Replacing inputs +## *****Inputs***** +## new_input1: +## type: File +## preF: -b +## yml: myfile +## new_input2: +## type: int +## preF: -L +## yml: 4 +## k: +## type: int +## preF: -k +## yml: 1 +## min-intronlen: +## type: int +## preF: -min-intronlen +## yml: 30 +## max-intronlen: +## type: int +## preF: -max-intronlen +## yml: 3000 +## threads: +## type: int +## preF: -threads +## yml: 4 +## U: +## type: File +## preF: -U +## yml: ./data/SRR446027_1.fastq.gz +## *****Parsed raw command line***** +## hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz +</code></pre> +<pre><code class="language-r">cmdlist(cmd4) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;hisat2 -b myfile -L 4 -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz&quot; +</code></pre> +<h4 id="adding-new-arguments">Adding new arguments</h4> +<pre><code class="language-r">newIn &lt;- new_inputs &lt;- list(new_input1 = list(type = &quot;File&quot;, preF = &quot;-b1&quot;, yml = &quot;myfile1&quot;), + new_input2 = list(type = &quot;File&quot;, preF = &quot;-b2&quot;, yml = &quot;myfile2&quot;), new_input3 = &quot;-b3 &lt;F: myfile3&gt;&quot;) +cmd5 &lt;- appendParam(cmd, &quot;inputs&quot;, index = 1:2, append = new_inputs) +</code></pre> +<pre><code>## Replacing inputs +## *****Inputs***** +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +## k: +## type: int +## preF: -k +## yml: 1 +## min-intronlen: +## type: int +## preF: -min-intronlen +## yml: 30 +## max-intronlen: +## type: int +## preF: -max-intronlen +## yml: 3000 +## threads: +## type: int +## preF: -threads +## yml: 4 +## U: +## type: File +## preF: -U +## yml: ./data/SRR446027_1.fastq.gz +## new_input1: +## type: File +## preF: -b1 +## yml: myfile1 +## new_input2: +## type: File +## preF: -b2 +## yml: myfile2 +## new_input3: +## type: File +## preF: -b3 +## yml: myfile3 +## *****Parsed raw command line***** +## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3 +</code></pre> +<pre><code class="language-r">cmdlist(cmd5) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz -b1 myfile1 -b2 myfile2 -b3 myfile3&quot; +</code></pre> +<pre><code class="language-r">cmd6 &lt;- appendParam(cmd, &quot;inputs&quot;, index = 1:2, after = 0, append = new_inputs) +</code></pre> +<pre><code>## Replacing inputs +## *****Inputs***** +## new_input1: +## type: File +## preF: -b1 +## yml: myfile1 +## new_input2: +## type: File +## preF: -b2 +## yml: myfile2 +## new_input3: +## type: File +## preF: -b3 +## yml: myfile3 +## S: +## type: File +## preF: -S +## yml: ./results/M1A.sam +## x: +## type: File +## preF: -x +## yml: ./data/tair10.fasta +## k: +## type: int +## preF: -k +## yml: 1 +## min-intronlen: +## type: int +## preF: -min-intronlen +## yml: 30 +## max-intronlen: +## type: int +## preF: -max-intronlen +## yml: 3000 +## threads: +## type: int +## preF: -threads +## yml: 4 +## U: +## type: File +## preF: -U +## yml: ./data/SRR446027_1.fastq.gz +## *****Parsed raw command line***** +## hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz +</code></pre> +<pre><code class="language-r">cmdlist(cmd6) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;hisat2 -b1 myfile1 -b2 myfile2 -b3 myfile3 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz&quot; +</code></pre> +<h4 id="editing-output-param">Editing <code>output</code> param</h4> +<pre><code class="language-r">new_outs &lt;- list(sam_out = &quot;&lt;F: $(inputs.results_path)/test.sam&gt;&quot;) +cmd7 &lt;- replaceParam(cmd, &quot;outputs&quot;, index = 1, replace = new_outs) +</code></pre> +<pre><code>## Replacing outputs +## *****Outputs***** +## sam_out: +## type: File +## value: $(inputs.results_path)/test.sam +## *****Parsed raw command line***** +## hisat2 -S ./results/M1A.sam -x ./data/tair10.fasta -k 1 -min-intronlen 30 -max-intronlen 3000 -threads 4 -U ./data/SRR446027_1.fastq.gz +</code></pre> +<pre><code class="language-r">output(cmd7) +</code></pre> +<pre><code>## $defaultid +## $defaultid$hisat2 +## [1] &quot;./results/test.sam&quot; +</code></pre> + + + + + + Sp: SPR detailed installation instructions + /sp/spr/sprinstall/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/sprinstall/ + + + + <script src="../../rmarkdown-libs/kePrint/kePrint.js"></script> +<link href="../../rmarkdown-libs/lightable/lightable.css" rel="stylesheet" /> +<style type="text/css"> pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } -</style> +</style> <!-- - Compile from command-line -Rscript -e "rmarkdown::render('SPRinstall.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('SPRinstall.Rmd', tangle=TRUE)"; Rscript -e "rmarkdown::render('SPRinstall.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('SPRinstall.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('SPRinstall.Rmd', tangle=TRUE)"; Rscript -e "rmarkdown::render('SPRinstall.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h1 id="heading"></h1> -<h2 id="systempiper-installation"><code>systemPipeR</code> Installation</h2> -<p>To install the <code>systemPipeR</code> package (H Backman and Girke 2016), please use the <em><code>BiocManager::install</code></em> command:</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) +</script> +<h2 id="systempiper-installation"><code>systemPipeR</code> Installation</h2> +<p>To install the <code>systemPipeR</code> package (H Backman and Girke 2016), please use +the <em><code>BiocManager::install</code></em> command:</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) BiocManager::install(&quot;systemPipeR&quot;) -</code></pre> -<p>To obtain the most recent updates immediately, one can install it directly from -<a href="https://github.com/tgirke/systemPipeR">github</a> as follow:</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) -BiocManager::install(&quot;tgirke/systemPipeR&quot;, build_vignettes = TRUE, -dependencies = TRUE) -</code></pre> -<h2 id="third-party-software-tools-in-spr">Third-party software tools in <em><code>SPR</code></em></h2> -<p>This guide provides detailed installation instructions for the software tools used within <code>systemPipeR</code> package. This guide provides the instruction for a Linux system.</p> -<h3 id="bwa">BWA</h3> -<p><a href="https://github.com/lh3/bwa">Burrow-Wheeler Aligner (BWA)</a> for short-read alignment (Li 2013).</p> -<pre><code class="language-bash">git clone https://github.com/lh3/bwa.git -cd bwa -make -vim ~/.bashrc ## Open the Bash shell script -export PATH=$PATH:/path/to/bwa ## &quot;/path/to/bwa&quot; is an example! Replace with real PATH -source ~/.bashrc -bwa ## Test if the installation was successful -</code></pre> -<p>Note: In some systems, <code>~/.bash_profile</code> is used in place of <code>~/.bashrc</code>.</p> -<p>More information about how to set an enviroment variable <a href="https://en.wikipedia.org/wiki/Environment_variable">here</a>.</p> -<h3 id="blast">BLAST</h3> -<p>Please check the <a href="https://www.ncbi.nlm.nih.gov/books/NBK279671/">BLAST Command Line Applications User Manual</a> to -find the installation introduction for your system environment.</p> -<p>Download the latest version from <a href="https://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/">here</a>, as the following example:</p> -<pre><code class="language-bash">wget https://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/ncbi-blast-2.11.0+-x64-linux.tar.gz -tar zxvpf ncbi-blast-2.11.0+-x64-linux.tar.gz ncbi-blast-2.11.0+/ -cd ncbi-blast-2.11.0+/ -export PATH=$PATH:/path/to//ncbi-blast-2.11.0+/bin ## &quot;/path/to/ncbi-blast-2.11.0+&quot; is an example! Replace with real PATH -</code></pre> -<h3 id="cutadapt">Cutadapt</h3> -<p>Please check the <a href="https://cutadapt.readthedocs.io/en/stable/installation.html">Cutadapt Manual</a> to -find the installation introduction for your system environment.</p> -<pre><code class="language-bash">sudo apt install cutadapt -</code></pre> -<h2 id="references">References</h2> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-H_Backman2016-bt" class="csl-entry"> -<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> -</div> -<div id="ref-Li2013-sw" class="csl-entry"> -<p>Li, Heng. 2013. “Aligning Sequence Reads, Clone Sequences and Assembly Contigs with BWA-MEM,” March. <a href="http://arxiv.org/abs/1303.3997">http://arxiv.org/abs/1303.3997</a>.</p> -</div> -</div>Sp: SPR Docker container/sp/spr/sp_docker/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/sp_docker/ -<blockquote> -<p>Guidelines from <a href="https://github.com/Bioconductor/bioconductor_docker">bioconductor_docker</a>.</p> -</blockquote> -<h1 id="running-the-systempiper-with-docker">Running the <code>systemPipeR</code> with Docker</h1> -<h2 id="get-a-copy-of-the-public-docker-image">Get a copy of the public docker image</h2> -<pre><code class="language-bash">docker pull systempipe/systempipe_docker:latest -</code></pre> -<h2 id="to-run-rstudio-server">To run RStudio Server:</h2> -<pre><code class="language-bash">docker run -e PASSWORD=systemPipe -p 8787:8787 \ -systempipe/systempipe_docker:latest -</code></pre> -<p>You can then open a web browser pointing to your docker host on -port 8787. If you&rsquo;re on Linux and using default settings, the docker -host is <code>127.0.0.1</code> (or <code>localhost</code>, so the full URL to RStudio would -be <code>http://localhost:8787)</code>. If you are on Mac or Windows and running -<code>Docker Toolbox</code>, you can determine the docker host with the -<code>docker-machine ip default</code> command.</p> -<p>In the above command, <code>-e PASSWORD=</code> is setting the RStudio password +</code></pre> +<p>To obtain the most recent updates immediately, one can install it directly from +<a href="https://github.com/tgirke/systemPipeR">GitHub</a> as follow:</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) +BiocManager::install(&quot;tgirke/systemPipeR&quot;, dependencies = TRUE) +</code></pre> +<h2 id="third-party-software-tools-in-spr">Third-party software tools in <em><code>SPR</code></em></h2> +<p>Current, <em>systemPipeR</em> provides the <em><code>param</code></em> file templates for third-party +software tools. Please check the listed software tools.</p> +<div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:500px; overflow-x: scroll; width:100%; "> +<table class="table table-striped table-hover table-condensed" style="margin-left: auto; margin-right: auto;"> +<thead> +<tr> +<th style="text-align:center;position: sticky; top:0; background-color: #FFFFFF;"> +Tool Name +</th> +<th style="text-align:center;position: sticky; top:0; background-color: #FFFFFF;"> +Description +</th> +<th style="text-align:center;position: sticky; top:0; background-color: #FFFFFF;"> +Step +</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:center;"> +<a href="http://bio-bwa.sourceforge.net/bwa.shtml">bwa</a> +</td> +<td style="text-align:center;"> +BWA is a software package for mapping low-divergent sequences against a large reference genome, such as the human genome.  +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml">Bowtie2</a> +</td> +<td style="text-align:center;"> +Bowtie 2 is an ultrafast and memory-efficient tool for aligning sequencing reads to long reference sequences. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://hannonlab.cshl.edu/fastx_toolkit/commandline.html">FASTX-Toolkit</a> +</td> +<td style="text-align:center;"> +FASTX-Toolkit is a collection of command line tools for Short-Reads FASTA/FASTQ files preprocessing. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #EC7770 !important;">Read Preprocessing</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://hibberdlab.com/transrate/">TransRate</a> +</td> +<td style="text-align:center;"> +Transrate is software for de-novo transcriptome assembly quality analysis. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #D98576 !important;">Quality</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://research-pub.gene.com/gmap/">Gsnap</a> +</td> +<td style="text-align:center;"> +GSNAP is a genomic short-read nucleotide alignment program. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://www.htslib.org/doc/samtools-1.2.html">Samtools</a> +</td> +<td style="text-align:center;"> +Samtools is a suite of programs for interacting with high-throughput sequencing data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #D08C79 !important;">Post-processing</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="http://www.usadellab.org/cms/?page=trimmomatic">Trimmomatic</a> +</td> +<td style="text-align:center;"> +Trimmomatic is a flexible read trimming tool for Illumina NGS data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #EC7770 !important;">Read Preprocessing</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://bioconductor.org/packages/release/bioc/vignettes/Rsubread/inst/doc/SubreadUsersGuide.pdf">Rsubread</a> +</td> +<td style="text-align:center;"> +Rsubread is a Bioconductor software package that provides high-performance alignment and read counting functions for RNA-seq reads. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://broadinstitute.github.io/picard/">Picard</a> +</td> +<td style="text-align:center;"> +Picard is a set of command line tools for manipulating high-throughput sequencing (HTS) data and formats such as SAM/BAM/CRAM and VCF. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #B4A082 !important;">Manipulating HTS data</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://busco.ezlab.org/">Busco</a> +</td> +<td style="text-align:center;"> +BUSCO assesses genome assembly and annotation completeness with Benchmarking Universal Single-Copy Orthologs. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #D98576 !important;">Quality</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://ccb.jhu.edu/software/hisat2/manual.shtml">Hisat2</a> +</td> +<td style="text-align:center;"> +HISAT2 is a fast and sensitive alignment program for mapping NGS reads (both DNA and RNA) to reference genomes. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://ccb.jhu.edu/software/tophat/manual.shtml">Tophat2</a> +</td> +<td style="text-align:center;"> +TopHat is a fast splice junction mapper for RNA-Seq reads. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://gatk.broadinstitute.org/hc/en-us">GATK</a> +</td> +<td style="text-align:center;"> +Variant Discovery in High-Throughput Sequencing Data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #FF6A6A !important;">Variant Discovery</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://github.com/alexdobin/STAR">STAR</a> +</td> +<td style="text-align:center;"> +STAR is an ultrafast universal RNA-seq aligner. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #8FBC8F !important;">Alignment</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://github.com/FelixKrueger/TrimGalore">Trim\_galore</a> +</td> +<td style="text-align:center;"> +Trim Galore is a wrapper around Cutadapt and FastQC to consistently apply adapter and quality trimming to FastQ files. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #EC7770 !important;">Read Preprocessing</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://github.com/TransDecoder/TransDecoder/wiki">TransDecoder</a> +</td> +<td style="text-align:center;"> +TransDecoder identifies candidate coding regions within transcript sequences. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #ABA785 !important;">Find Coding Regions</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://github.com/trinityrnaseq/trinityrnaseq/wiki">Trinity</a> +</td> +<td style="text-align:center;"> +Trinity assembles transcript sequences from Illumina RNA-Seq data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #A1AE88 !important;">denovo Transcriptome Assembly</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://github.com/Trinotate/Trinotate.github.io/wiki">Trinotate</a> +</td> +<td style="text-align:center;"> +Trinotate is a comprehensive annotation suite designed for automatic functional annotation of transcriptomes. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #F5706D !important;">Transcriptome Functional Annotation</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://macs3-project.github.io/MACS/">MACS2</a> +</td> +<td style="text-align:center;"> +MACS2 identifies transcription factor binding sites in ChIP-seq data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #C7937C !important;">Peak calling</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://pachterlab.github.io/kallisto/manual">Kallisto</a> +</td> +<td style="text-align:center;"> +kallisto is a program for quantifying abundances of transcripts from RNA-Seq data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #E37E73 !important;">Read counting</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://samtools.github.io/bcftools/howtos/index.html">BCFtools</a> +</td> +<td style="text-align:center;"> +BCFtools is a program for variant calling and manipulating files in the Variant Call Format (VCF) and its binary counterpart BCF. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #FF6A6A !important;">Variant Discovery</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://www.bioinformatics.babraham.ac.uk/projects/bismark/">Bismark</a> +</td> +<td style="text-align:center;"> +Bismark is a program to map bisulfite treated sequencing reads to a genome of interest and perform methylation calls in a single step. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #98B58B !important;">Bisulfite mapping</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://www.bioinformatics.babraham.ac.uk/projects/fastqc/">Fastqc</a> +</td> +<td style="text-align:center;"> +FastQC is a quality control tool for high throughput sequence data. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #D98576 !important;">Quality</span> +</td> +</tr> +<tr> +<td style="text-align:center;"> +<a href="https://www.ncbi.nlm.nih.gov/books/NBK279690/">Blast</a> +</td> +<td style="text-align:center;"> +BLAST finds regions of similarity between biological sequences. +</td> +<td style="text-align:center;"> +<span style=" font-weight: bold; color: white !important;border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #BD997F !important;">Blast</span> +</td> +</tr> +</tbody> +</table> +</div> +<h2 id="references">References</h2> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-H_Backman2016-bt" class="csl-entry"> +<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> +</div> +</div> + + + + + + Sp: Help Manual + /sp/spr/spr_funcs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/spr_funcs/ + + + + <hr> +<style> +.td-content li a { + font-size: 1.5rem; +} +</style> +<h2 id="systempiper-functions-reference-manuals"><em>systempipeR</em> Functions Reference Manuals</h2> +<p>The following reference manual was created by <a href="http://bioconductor.org/packages/devel/bioc/html/systemPipeR.html">systemPipeR Development version</a>.</p> +<ul> +<li><a href="../../spr/funcs/spr/reference">systemPipeR Reference Manual</a></li> +</ul> +<hr> + + + + + + Sp: SPR Docker container + /sp/spr/sp_docker/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/sp_docker/ + + + + <blockquote> +<p>Guidelines from <a href="https://github.com/Bioconductor/bioconductor_docker">bioconductor_docker</a>.</p> +</blockquote> +<h1 id="running-the-systempiper-with-docker">Running the <code>systemPipeR</code> with Docker</h1> +<h2 id="get-a-copy-of-the-public-docker-image">Get a copy of the public docker image</h2> +<pre><code class="language-bash">docker pull systempipe/systempipe_docker:latest +</code></pre> +<h2 id="to-run-rstudio-server">To run RStudio Server:</h2> +<pre><code class="language-bash">docker run -e PASSWORD=systemPipe -p 8787:8787 \ + systempipe/systempipe_docker:latest +</code></pre> +<p>You can then open a web browser pointing to your docker host on +port 8787. If you&rsquo;re on Linux and using default settings, the docker +host is <code>127.0.0.1</code> (or <code>localhost</code>, so the full URL to RStudio would +be <code>http://localhost:8787)</code>. If you are on Mac or Windows and running +<code>Docker Toolbox</code>, you can determine the docker host with the +<code>docker-machine ip default</code> command.</p> +<p>In the above command, <code>-e PASSWORD=</code> is setting the RStudio password and is required by the RStudio Docker image. It can be whatever you -like except it cannot be <code>rstudio</code>. Log in to RStudio with the -username <code>rstudio</code> and whatever password was specified, in this -example <code>systemPipe</code>.</p> -<h2 id="to-run-r-from-the-command-line">To run R from the command line:</h2> -<pre><code class="language-bash">docker run -it --user rstudio systempipe/systempipe_docker:latest R -</code></pre> -<h2 id="to-open-a-bash-shell-on-the-container">To open a Bash shell on the container:</h2> -<pre><code class="language-bash">docker run -it --user rstudio systempipe/systempipe_docker:latest bash -</code></pre> -<!-- # Full Documentation --> -<!-- This tutorial shows how to create, access, run, build a Docker container. --> -<!-- ## Table of Content --> -<!-- 1. [Install](#Install) --> -<!-- 2. [Docker Hub Account](#dockerHub) --> -<!-- 3. [Log in to the Docker Hub](#login) --> -<!-- 4. [Run Docker](#run) --> -<!-- 5. [Create your first repository](#create) --> -<!-- 6. [Make changes to the container and Create the new image](#changes) --> -<!-- 7. [Commands](#commands) --> -<!-- 8. [Docker and GitHub Actions](#github) --> -<!-- 9. [Common Problems](#faq) --> -<!-- 10. [Singularity Container](#singularity) --> -<!-- 11. [Resources](#resources) --> -<hr> -<div id='Install'/> -<h1 id="install">Install</h1> -<p><strong>Prerequisites</strong>: -<a href="https://docs.docker.com/installation/">Linux</a> -<a href="http://docs.docker.com/installation/mac/">Mac</a> -<a href="http://docs.docker.com/installation/windows/">Windows</a></p> -<p>Instructions <a href="https://docs.docker.com/engine/install/ubuntu/">here</a> on how to install Docker Engine on Ubuntu.</p> -<pre><code>sudo apt-get update +like except it cannot be <code>rstudio</code>. Log in to RStudio with the +username <code>rstudio</code> and whatever password was specified, in this +example <code>systemPipe</code>.</p> +<h2 id="to-run-r-from-the-command-line">To run R from the command line:</h2> +<pre><code class="language-bash">docker run -it --user rstudio systempipe/systempipe_docker:latest R +</code></pre> +<h2 id="to-open-a-bash-shell-on-the-container">To open a Bash shell on the container:</h2> +<pre><code class="language-bash">docker run -it --user rstudio systempipe/systempipe_docker:latest bash +</code></pre> +<!-- # Full Documentation --> +<!-- This tutorial shows how to create, access, run, build a Docker container. --> +<!-- ## Table of Content --> +<!-- 1. [Install](#Install) --> +<!-- 2. [Docker Hub Account](#dockerHub) --> +<!-- 3. [Log in to the Docker Hub](#login) --> +<!-- 4. [Run Docker](#run) --> +<!-- 5. [Create your first repository](#create) --> +<!-- 6. [Make changes to the container and Create the new image](#changes) --> +<!-- 7. [Commands](#commands) --> +<!-- 8. [Docker and GitHub Actions](#github) --> +<!-- 9. [Common Problems](#faq) --> +<!-- 10. [Singularity Container](#singularity) --> +<!-- 11. [Resources](#resources) --> +<hr> +<div id='Install'/> +<h1 id="install">Install</h1> +<p><strong>Prerequisites</strong>: +<a href="https://docs.docker.com/installation/">Linux</a> +<a href="http://docs.docker.com/installation/mac/">Mac</a> +<a href="http://docs.docker.com/installation/windows/">Windows</a></p> +<p>Instructions <a href="https://docs.docker.com/engine/install/ubuntu/">here</a> on how to install Docker Engine on Ubuntu.</p> +<pre><code>sudo apt-get update sudo apt-get install \ -apt-transport-https \ -ca-certificates \ -curl \ -gnupg + apt-transport-https \ + ca-certificates \ + curl \ + gnupg curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ -&quot;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ -$(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null + &quot;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io + ## Verify that Docker Engine is installed correctly by running the hello-world image. sudo docker run hello-world -</code></pre> -<h2 id="uninstall">Uninstall</h2> -<pre><code>sudo apt-get remove docker docker-engine docker.io containerd runc -</code></pre> -<hr> -<div id='dockerHUb'/> -<h1 id="docker-hub-account">Docker Hub Account</h1> -<p>To be able to share a custom image, please go to <a href="https://hub.docker.com">https://hub.docker.com</a> and -create a free account.</p> -<hr> -<div id='login'/> -<h2 id="log-in-to-the-docker-hub-locally">Log in to the Docker Hub locally</h2> -<p>Login with your Docker ID to push and pull images from Docker Hub. If you don&rsquo;t -have a Docker ID, head over to <a href="https://hub.docker.com">https://hub.docker.com</a> to create one.</p> -<pre><code>docker login +</code></pre> +<h2 id="uninstall">Uninstall</h2> +<pre><code>sudo apt-get remove docker docker-engine docker.io containerd runc +</code></pre> +<hr> +<div id='dockerHUb'/> +<h1 id="docker-hub-account">Docker Hub Account</h1> +<p>To be able to share a custom image, please go to <a href="https://hub.docker.com">https://hub.docker.com</a> and +create a free account.</p> +<hr> +<div id='login'/> +<h2 id="log-in-to-the-docker-hub-locally">Log in to the Docker Hub locally</h2> +<p>Login with your Docker ID to push and pull images from Docker Hub. If you don&rsquo;t +have a Docker ID, head over to <a href="https://hub.docker.com">https://hub.docker.com</a> to create one.</p> +<pre><code>docker login # Username: XXXX # Password: xxx # Login Succeeded -</code></pre> -<hr> -<div id='run'/> -<h1 id="run-docker">Run Docker</h1> -<pre><code>docker run-dP systempipe/systempipe_docker:latest -</code></pre> -<p>Make sure the container is running:</p> -<pre><code>docker ps -# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # NAMES -#5d007f66a7b3 systempipe/systempipe_docker:latest &quot;/init&quot; 5 minutes ago Up 5 minutes 0.0.0.0:49153-&gt;8787/tcp determined_easle -</code></pre> -<h2 id="login-to-the-container">Login to the container</h2> -<p>Please check the <code>NAMES</code> in this example, <code>determined_easle,</code> to login into the container.</p> -<pre><code>docker exec -it determined_easle /bin/bash -</code></pre> -<h2 id="other-alternatives-to-run-the-container">Other alternatives to run the container</h2> -<h3 id="to-run-rstudio-server-1">To run RStudio Server:</h3> -<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 \ -systempipe/systempipe_docker:latest -</code></pre> -<h3 id="to-run-r-from-the-command-line-1">To run R from the command line:</h3> -<pre><code>docker run -it --user rstudio systempipe/systempipe_docker:latest R -</code></pre> -<h3 id="to-open-a-bash-shell-on-the-container-1">To open a Bash shell on the container:</h3> -<pre><code>docker run -it --user rstudio systempipe/systempipe_docker:latest bash -</code></pre> -<h3 id="check-r-version-into-the-container">Check R Version into the container</h3> -<pre><code>R --version -</code></pre> -<h2 id="stop-docker">Stop Docker</h2> -<pre><code>docker stop determined_easle -</code></pre> -<hr> -<div id='create'/> -<h1 id="create-your-first-repository-linkhttpsdocsdockercomdocker-hub">Create your first repository <a href="https://docs.docker.com/docker-hub/">Link</a></h1> -<h2 id="create-a-repository">Create a repository:</h2> -<ul> -<li>Sign in to Docker Hub.</li> -<li>Click Create a Repository on the Docker Hub welcome page:</li> -<li>Name it <your-username>/my-repo.</li> -<li>Click Create.</li> -</ul> -<h2 id="build-and-push-a-container-image-to-docker-hub-from-your-computer">Build and push a container image to Docker Hub from your computer</h2> -<h3 id="start-by-creating-a-dockerfile-to-specify-your-application">Start by creating a <em>Dockerfile</em> to specify your application</h3> -<pre><code>mkdir docker_test +</code></pre> +<hr> +<div id='run'/> +<h1 id="run-docker">Run Docker</h1> +<pre><code>docker run-dP systempipe/systempipe_docker:latest +</code></pre> +<p>Make sure the container is running:</p> +<pre><code>docker ps +# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # NAMES +#5d007f66a7b3 systempipe/systempipe_docker:latest &quot;/init&quot; 5 minutes ago Up 5 minutes 0.0.0.0:49153-&gt;8787/tcp determined_easle +</code></pre> +<h2 id="login-to-the-container">Login to the container</h2> +<p>Please check the <code>NAMES</code> in this example, <code>determined_easle,</code> to login into the container.</p> +<pre><code>docker exec -it determined_easle /bin/bash +</code></pre> +<h2 id="other-alternatives-to-run-the-container">Other alternatives to run the container</h2> +<h3 id="to-run-rstudio-server-1">To run RStudio Server:</h3> +<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 \ + systempipe/systempipe_docker:latest +</code></pre> +<h3 id="to-run-r-from-the-command-line-1">To run R from the command line:</h3> +<pre><code>docker run -it --user rstudio systempipe/systempipe_docker:latest R +</code></pre> +<h3 id="to-open-a-bash-shell-on-the-container-1">To open a Bash shell on the container:</h3> +<pre><code>docker run -it --user rstudio systempipe/systempipe_docker:latest bash +</code></pre> +<h3 id="check-r-version-into-the-container">Check R Version into the container</h3> +<pre><code>R --version +</code></pre> +<h2 id="stop-docker">Stop Docker</h2> +<pre><code>docker stop determined_easle +</code></pre> +<hr> +<div id='create'/> +<h1 id="create-your-first-repository-linkhttpsdocsdockercomdocker-hub">Create your first repository <a href="https://docs.docker.com/docker-hub/">Link</a></h1> +<h2 id="create-a-repository">Create a repository:</h2> +<ul> +<li>Sign in to Docker Hub.</li> +<li>Click Create a Repository on the Docker Hub welcome page:</li> +<li>Name it <your-username>/my-repo.</li> +<li>Click Create.</li> +</ul> +<h2 id="build-and-push-a-container-image-to-docker-hub-from-your-computer">Build and push a container image to Docker Hub from your computer</h2> +<h3 id="start-by-creating-a-dockerfile-to-specify-your-application">Start by creating a <em>Dockerfile</em> to specify your application</h3> +<pre><code>mkdir docker_test cd docker_test touch Dockerfile -</code></pre> -<pre><code># Docker inheritance +</code></pre> +<pre><code># Docker inheritance FROM systempipe/systempipe_docker:latest + ## Install BiocStyle -RUN R -e 'BiocManager::install(&quot;BiocStyle&quot;)' +RUN R -e 'BiocManager::install(&quot;BiocStyle&quot;)' + # Install required Bioconductor package from devel version -RUN R -e 'BiocManager::install(&quot;tgirke/systemPipeR&quot;)' -RUN R -e 'BiocManager::install(&quot;tgirke/systemPipeRdata&quot;)' +RUN R -e 'BiocManager::install(&quot;tgirke/systemPipeR&quot;)' +RUN R -e 'BiocManager::install(&quot;tgirke/systemPipeRdata&quot;)' + WORKDIR /home/rstudio/SPRojects + COPY --chown=rstudio:rstudio . /home/rstudio/SPRojects + # Metadata LABEL name=&quot;systempipe/systempipe_docker&quot; \ -version=$BIOCONDUCTOR_DOCKER_systempipe \ -url=&quot;https://github.com/systemPipeR/systempipe/systempipe_docker&quot; \ -vendor=&quot;systemPipeR Project&quot; \ -maintainer=&quot;email@gmail.com&quot; \ -description=&quot;Bioconductor docker image containing the systemPipeR Project&quot; \ -license=&quot;Artistic-2.0&quot; -</code></pre> -<h3 id="run-docker-build-to-build-your-docker-image">Run <code>docker build</code> to build your Docker image</h3> -<pre><code>docker build -t systempipe/systempipe_docker . -</code></pre> -<h3 id="run-docker-run-to-test-your-docker-image-locally">Run <code>docker run</code> to test your Docker image locally</h3> -<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest -</code></pre> -<h3 id="run-docker-push-to-push-your-docker-image-to-docker-hub">Run <code>docker push</code> to push your Docker image to Docker Hub</h3> -<pre><code>docker push systempipe/systempipe_docker -</code></pre> -<ul> -<li>Your repository in Docker Hub should now display a new latest tag under <code>Tags</code></li> -</ul> -<hr> -<div id='changes'/> -<h1 id="make-changes-to-the-container-and-create-the-new-image">Make changes to the container and Create the new image</h1> -<p>Create a folder, for example:</p> -<pre><code>docker run -dP systempipe/systempipe_docker + version=$BIOCONDUCTOR_DOCKER_systempipe \ + url=&quot;https://github.com/systemPipeR/systempipe/systempipe_docker&quot; \ + vendor=&quot;systemPipeR Project&quot; \ + maintainer=&quot;email@gmail.com&quot; \ + description=&quot;Bioconductor docker image containing the systemPipeR Project&quot; \ + license=&quot;Artistic-2.0&quot; +</code></pre> +<h3 id="run-docker-build-to-build-your-docker-image">Run <code>docker build</code> to build your Docker image</h3> +<pre><code>docker build -t systempipe/systempipe_docker . +</code></pre> +<h3 id="run-docker-run-to-test-your-docker-image-locally">Run <code>docker run</code> to test your Docker image locally</h3> +<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest +</code></pre> +<h3 id="run-docker-push-to-push-your-docker-image-to-docker-hub">Run <code>docker push</code> to push your Docker image to Docker Hub</h3> +<pre><code>docker push systempipe/systempipe_docker +</code></pre> +<ul> +<li>Your repository in Docker Hub should now display a new latest tag under <code>Tags</code></li> +</ul> +<hr> +<div id='changes'/> +<h1 id="make-changes-to-the-container-and-create-the-new-image">Make changes to the container and Create the new image</h1> +<p>Create a folder, for example:</p> +<pre><code>docker run -dP systempipe/systempipe_docker docker ps ## To check the NAME &lt;lucid_grothendieck&gt; docker exec -it lucid_grothendieck /bin/bash root@33c758eb1626:/# R -</code></pre> -<pre><code class="language-r">setwd(&quot;home/rstudio/&quot;) +</code></pre> +<pre><code class="language-r">setwd(&quot;home/rstudio/&quot;) systemPipeRdata::genWorkenvir(&quot;rnaseq&quot;) -</code></pre> -<pre><code>exit +</code></pre> +<pre><code>exit docker commit -m &quot;Added rnaseq template&quot; -a &quot;Dani Cassol&quot; lucid_grothendieck dcassol/systempipeworkshop2021:rnaseq docker push systempipe/systempipe_docker:rnaseq -</code></pre> -<p>Run the new image:</p> -<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq -</code></pre> -<hr> -<div id='commands'/> -<h1 id="commands">Commands</h1> -<h2 id="list-which-docker-machines-are-available-locally">List which docker machines are available locally</h2> -<p><code>docker images</code></p> -<h2 id="list-running-containers">List running containers</h2> -<p><code>docker ps</code></p> -<h2 id="list-all-containers">List all containers</h2> -<p><code>docker ps -a</code></p> -<h2 id="resume-a-stopped-container">Resume a stopped container</h2> -<p><code>docker start &lt;CONTAINER ID&gt;</code></p> -<h2 id="shell-into-a-running-container">Shell into a running container</h2> -<p><code>docker exec -it &lt;CONTAINER ID&gt; /bin/bash</code></p> -<h2 id="stop-or-remove-a-cointainer">Stop OR remove a cointainer</h2> -<p><code>docker stop &lt;CONTAINER ID&gt;</code> -<code>docker rm &lt;CONTAINER ID&gt;</code></p> -<h2 id="remove-a-image">Remove a image</h2> -<p><code>docker rmi dcassol/systempipeworkshop2021:rnaseq</code></p> -<hr> -<div id='github'/> -<h1 id="docker-and-github-actions">Docker and GitHub Actions</h1> -<ol> -<li>To create a new token, go to Docker Hub Settings</li> -</ol> -<p>1.1. Account Settings &raquo; Security &raquo; New Access Token +</code></pre> +<p>Run the new image:</p> +<pre><code>docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq +</code></pre> +<hr> +<div id='commands'/> +<h1 id="commands">Commands</h1> +<h2 id="list-which-docker-machines-are-available-locally">List which docker machines are available locally</h2> +<p><code>docker images</code></p> +<h2 id="list-running-containers">List running containers</h2> +<p><code>docker ps</code></p> +<h2 id="list-all-containers">List all containers</h2> +<p><code>docker ps -a</code></p> +<h2 id="resume-a-stopped-container">Resume a stopped container</h2> +<p><code>docker start &lt;CONTAINER ID&gt;</code></p> +<h2 id="shell-into-a-running-container">Shell into a running container</h2> +<p><code>docker exec -it &lt;CONTAINER ID&gt; /bin/bash</code></p> +<h2 id="stop-or-remove-a-cointainer">Stop OR remove a cointainer</h2> +<p><code>docker stop &lt;CONTAINER ID&gt;</code> +<code>docker rm &lt;CONTAINER ID&gt;</code></p> +<h2 id="remove-a-image">Remove a image</h2> +<p><code>docker rmi dcassol/systempipeworkshop2021:rnaseq</code></p> +<hr> +<div id='github'/> +<h1 id="docker-and-github-actions">Docker and GitHub Actions</h1> +<ol> +<li>To create a new token, go to Docker Hub Settings</li> +</ol> +<p>1.1. Account Settings &raquo; Security &raquo; New Access Token 1.2. Add Access Token Description &raquo; Create -1.3. Copy the Access Token &raquo; Copy and Close</p> -<ol start="2"> -<li>Go to the Repository at GitHub</li> -</ol> -<p>2.1. Settings &gt; Secrets &gt; New repository secret -2.2. Create a new secret with the name <code>DOCKER_HUB_USERNAME</code> and your <code>Docker ID</code> as value +1.3. Copy the Access Token &raquo; Copy and Close</p> +<ol start="2"> +<li>Go to the Repository at GitHub</li> +</ol> +<p>2.1. Settings &gt; Secrets &gt; New repository secret +2.2. Create a new secret with the name <code>DOCKER_HUB_USERNAME</code> and your <code>Docker ID</code> as value 2.3. Click at Add secret -2.4. Create a new secret with the name <code>DOCKER_HUB_ACCESS_TOKEN</code> and your <code>Personal Access Token (PAT)</code> as value (generated in the previous step)</p> -<ol start="3"> -<li>Set up the GitHub Actions workflow</li> -</ol> -<pre><code> steps: -- name: Checkout Repo -uses: actions/checkout@v2 -- name: Login to Docker Hub -uses: docker/login-action@v1 -with: -username: ${{ secrets.DOCKER_HUB_USERNAME }} -password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} -</code></pre> -<hr> -<div id='faq'/> -<h1 id="common-problems">Common Problems</h1> -<pre><code>## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied -</code></pre> -<p>Solution:</p> -<pre><code class="language-bash">sudo chmod 666 /var/run/docker.sock -</code></pre> -<hr> -<div id='singularity'/> -<h1 id="singularity-container">Singularity Container</h1> -<p>Please download the Docker image of systemPipe, as follow:</p> -<pre><code class="language-bash">singularity pull docker://systempipe/systempipe_docker:latest -</code></pre> -<p>You can also use the <code>build</code> command to download pre-built images from Docker. -Unlike <code>pull</code>, <code>build</code> will convert the image to the latest Singularity image format after -downloading it.</p> -<pre><code class="language-bash">singularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest -</code></pre> -<p>To run the container:</p> -<pre><code class="language-bash">singularity shell systempipe_docker_latest.sif -</code></pre> -<hr> -<div id='resources'/> -<h1 id="resources">Resources</h1> -<ul> -<li><a href="https://www.mirantis.com/blog/how-do-i-create-a-new-docker-image-for-my-application/">Docker Run: How to create images from an application</a></li> -<li><a href="https://docs.docker.com/docker-hub/">Docker Hub Quickstart</a></li> -<li><a href="https://docs.docker.com/ci-cd/github-actions/">Configure GitHub Actions</a></li> -<li><a href="https://sylabs.io/guides/3.0/user-guide/quick_start.html#interact-with-images">Singularity</a></li> -</ul>Sp: Workflow Plot Editor/sp/spr/editor/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/editor/ -<p>This is a SPR workflow editor, which will allow you to edit the workflow plot before/after running a workflow in SPR.</p> -<ol> -<li>Create a SPR workflow with the sysArgsList (sal) object, or directly use the sal object after workflow running.</li> -<li>make a workflow plot with <code>plotWF(sal)</code> to take a glimpse of the plot preview.</li> -<li>Use <code>plotWF(sal, out_format = &quot;dot_print&quot;)</code> to print out the plot in DOT language, copy the whole content to your clipboard.</li> -<li>Use <a href="../viz_editor">this link to open <strong>Workflow Plot Editor</strong></a>.</li> -<li>Paste plot code in the editor to start editing.</li> -</ol>Sp:/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/Mon, 01 Jan 0001 00:00:00 +0000/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ -<p>Hi there!</p> -<p>Thanks for submitting an issue to svg-pan-zoom.</p> -<p>To help us help you better, please do the following before submitting an issue:</p> -<ol> -<li>Review the available <a href="https://github.com/ariutta/svg-pan-zoom/blob/master/README.md">documentation</a> and existing <a href="https://github.com/ariutta/svg-pan-zoom#demos">examples</a></li> -<li>Check if the same bug/feature request <a href="https://github.com/ariutta/svg-pan-zoom/issues?q=is%3Aissue%20">wasn&rsquo;t previously reported</a></li> -<li>Make sure you are not asking a usage or debugging question. If you are, use <a href="http://stackoverflow.com/questions/tagged/svgpanzoom">StackOverflow</a>.</li> -<li>Fill in the information that corresponds to your type of issue below</li> -<li>If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via <a href="https://jsfiddle.net">https://jsfiddle.net</a> or similar (template: <a href="http://jsfiddle.net/bumbu/167usffr/)">http://jsfiddle.net/bumbu/167usffr/)</a>.</li> -<li>Delete this intro and any unrelated text :smile: (if you do not we&rsquo;ll assume you haven&rsquo;t read these instructions and automatically close the issue)</li> -</ol> -<h2 id="bug-report">Bug report</h2> -<h3 id="expected-behaviour">Expected behaviour</h3> -<p><em>your text here</em></p> -<h3 id="actual-behaviour">Actual behaviour</h3> -<p><em>your text here</em></p> -<h3 id="steps-to-reproduce-the-behaviour">Steps to reproduce the behaviour</h3> -<ol> -<li></li> -<li></li> -</ol> -<h3 id="configuration">Configuration</h3> -<ul> -<li>svg-pan-zoom version: ``</li> -<li>Browser(s): ``</li> -<li>Operating system(s): ``</li> -<li>A relevant example URL:</li> -</ul> -<h2 id="feature-request">Feature Request</h2> -<ul> -<li>Feature description</li> -<li>Reasons for adopting new feature</li> -<li>Is this a breaking change? (How will this affect existing functionality)</li> -</ul> \ No newline at end of file +2.4. Create a new secret with the name <code>DOCKER_HUB_ACCESS_TOKEN</code> and your <code>Personal Access Token (PAT)</code> as value (generated in the previous step)</p> +<ol start="3"> +<li>Set up the GitHub Actions workflow</li> +</ol> +<pre><code> steps: + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} +</code></pre> +<hr> +<div id='faq'/> +<h1 id="common-problems">Common Problems</h1> +<pre><code>## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied +</code></pre> +<p>Solution:</p> +<pre><code class="language-bash">sudo chmod 666 /var/run/docker.sock +</code></pre> +<hr> +<div id='singularity'/> +<h1 id="singularity-container">Singularity Container</h1> +<p>Please download the Docker image of systemPipe, as follow:</p> +<pre><code class="language-bash">singularity pull docker://systempipe/systempipe_docker:latest +</code></pre> +<p>You can also use the <code>build</code> command to download pre-built images from Docker. +Unlike <code>pull</code>, <code>build</code> will convert the image to the latest Singularity image format after +downloading it.</p> +<pre><code class="language-bash">singularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest +</code></pre> +<p>To run the container:</p> +<pre><code class="language-bash">singularity shell systempipe_docker_latest.sif +</code></pre> +<hr> +<div id='resources'/> +<h1 id="resources">Resources</h1> +<ul> +<li><a href="https://www.mirantis.com/blog/how-do-i-create-a-new-docker-image-for-my-application/">Docker Run: How to create images from an application</a></li> +<li><a href="https://docs.docker.com/docker-hub/">Docker Hub Quickstart</a></li> +<li><a href="https://docs.docker.com/ci-cd/github-actions/">Configure GitHub Actions</a></li> +<li><a href="https://sylabs.io/guides/3.0/user-guide/quick_start.html#interact-with-images">Singularity</a></li> +</ul> + + + + + + Sp: Workflow Plot Editor + /sp/spr/editor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/editor/ + + + + <p>This is a SPR workflow editor, which will allow you to edit the workflow plot before/after running a workflow in SPR.</p> +<ol> +<li>Create a SPR workflow with the sysArgsList (sal) object, or directly use the sal object after workflow running.</li> +<li>make a workflow plot with <code>plotWF(sal)</code> to take a glimpse of the plot preview.</li> +<li>Use <code>plotWF(sal, out_format = &quot;dot_print&quot;)</code> to print out the plot in DOT language, copy the whole content to your clipboard.</li> +<li>Use <a href="../viz_editor">this link to open <strong>Workflow Plot Editor</strong></a>.</li> +<li>Paste plot code in the editor to start editing.</li> +</ol> + + + + + + Sp: + /sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/ + + + + <p>Hi there!</p> +<p>Thanks for submitting an issue to svg-pan-zoom.</p> +<p>To help us help you better, please do the following before submitting an issue:</p> +<ol> +<li>Review the available <a href="https://github.com/ariutta/svg-pan-zoom/blob/master/README.md">documentation</a> and existing <a href="https://github.com/ariutta/svg-pan-zoom#demos">examples</a></li> +<li>Check if the same bug/feature request <a href="https://github.com/ariutta/svg-pan-zoom/issues?q=is%3Aissue%20">wasn&rsquo;t previously reported</a></li> +<li>Make sure you are not asking a usage or debugging question. If you are, use <a href="http://stackoverflow.com/questions/tagged/svgpanzoom">StackOverflow</a>.</li> +<li>Fill in the information that corresponds to your type of issue below</li> +<li>If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via <a href="https://jsfiddle.net">https://jsfiddle.net</a> or similar (template: <a href="http://jsfiddle.net/bumbu/167usffr/)">http://jsfiddle.net/bumbu/167usffr/)</a>.</li> +<li>Delete this intro and any unrelated text :smile: (if you do not we&rsquo;ll assume you haven&rsquo;t read these instructions and automatically close the issue)</li> +</ol> +<h2 id="bug-report">Bug report</h2> +<h3 id="expected-behaviour">Expected behaviour</h3> +<p><em>your text here</em></p> +<h3 id="actual-behaviour">Actual behaviour</h3> +<p><em>your text here</em></p> +<h3 id="steps-to-reproduce-the-behaviour">Steps to reproduce the behaviour</h3> +<ol> +<li></li> +<li></li> +</ol> +<h3 id="configuration">Configuration</h3> +<ul> +<li>svg-pan-zoom version: ``</li> +<li>Browser(s): ``</li> +<li>Operating system(s): ``</li> +<li>A relevant example URL:</li> +</ul> +<h2 id="feature-request">Feature Request</h2> +<ul> +<li>Feature description</li> +<li>Reasons for adopting new feature</li> +<li>Is this a breaking change? (How will this affect existing functionality)</li> +</ul> + + + + + + diff --git a/public/sp/spr/introduction/index.html b/public/sp/spr/introduction/index.html index 56f444b6a..2a79bb983 100644 --- a/public/sp/spr/introduction/index.html +++ b/public/sp/spr/introduction/index.html @@ -1,81 +1,973 @@ -Introduction | sysPipe

Introduction

Note: if you use systemPipeR in published research, please cite: -Backman, T.W.H and Girke, T. (2016). systemPipeR: NGS Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.

Introduction

systemPipeR + + + + + + + + + + + + + + + + + + + +Introduction | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Introduction

+ + + + + +

Note: if you use systemPipeR in published research, please cite: +Backman, T.W.H and Girke, T. (2016). systemPipeR: NGS Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.

+

Introduction

+

systemPipeR provides flexible utilities for designing, building, and running automated nd-to-end analysis workflows for a wide range of research applications, including next-generation sequencing (NGS) experiments (H Backman and Girke 2016). Important features include a uniform workflow interface across different data analysis applications, automated report generation, and support for running both R and command-line software, -on local computers or compute clusters (see Figure 1). +on local computers or compute clusters (see Figure 1). The latter supports interactive job submissions and batch submissions to queuing -systems of clusters.

It has been designed to improve the reproducibility of large-scale data analysis +systems of clusters.

+

It has been designed to improve the reproducibility of large-scale data analysis projects while substantially reducing the time it takes to analyze complex omics data sets. Its unique features include a uniform workflow interface and management system that allows the user to run selected steps, customize, and design entirely new workflows. Also, the package features take advantage of central community S4 -classes of the Bioconductor ecosystem and command-line-based software support.

The main motivation and advantages of using systemPipeR for complex data analysis tasks are:

  1. Facilitates the design of complex workflows involving multiple R/Bioconductor packages
  2. Common workflow interface for different applications
  3. Makes analysis with Bioconductor utilities more accessible to new users
  4. Simplifies usage of command-line software from within R
  5. Reduces the complexity of using compute clusters for R and command-line software
  6. Accelerates runtime of workflows via parallelization on computer systems with multiple CPU cores and/or multiple compute nodes
  7. Improves reproducibility by automating analyses and generation of analysis reports

Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A & B). Examples of *systemPipeR's* visualization functionalities are given under (C).

Figure 1: Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A & B). Examples of *systemPipeR’s* visualization functionalities are given under (C).

A central concept for designing workflows within the systemPipeR environment +classes of the Bioconductor ecosystem and command-line-based software support.

+

The main motivation and advantages of using systemPipeR for complex data analysis tasks are:

+
    +
  1. Facilitates the design of complex workflows involving multiple R/Bioconductor packages
  2. +
  3. Common workflow interface for different applications
  4. +
  5. Makes analysis with Bioconductor utilities more accessible to new users
  6. +
  7. Simplifies usage of command-line software from within R
  8. +
  9. Reduces the complexity of using compute clusters for R and command-line software
  10. +
  11. Accelerates runtime of workflows via parallelization on computer systems with multiple CPU cores and/or multiple compute nodes
  12. +
  13. Improves reproducibility by automating analyses and generation of analysis reports
  14. +
+
+

Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A & B). Examples of *systemPipeR's* visualization functionalities are given under (C).

+

+Figure 1: Relevant features in `systemPipeR`. Workflow design concepts are illustrated under (A & B). Examples of *systemPipeR’s* visualization functionalities are given under (C). +

+
+

A central concept for designing workflows within the systemPipeR environment is the use of workflow management containers. Workflow management containers allow the automation of design, build, run and scale different steps and tools in data analysis. -systemPipeR adopted the widely used community standard Common Workflow Language (CWL) +systemPipeR adopted the widely used community standard Common Workflow Language (CWL) (Amstutz et al. 2016) for describing parameters analysis workflows in a generic and reproducible manner. Using this community standard in systemPipeR has many advantages. For instance, the integration of CWL allows running systemPipeR workflows from a single specification instance either entirely from within R, from various command-line wrappers (e.g., cwl-runner) or from other languages (, e.g., Bash or Python). systemPipeR includes support for both command-line and R/Bioconductor software as well as resources for containerization, parallel evaluations on computer clusters -along with the automated generation of interactive analysis reports.

An important feature of systemPipeR's CWL interface is that it provides two +along with the automated generation of interactive analysis reports.

+

An important feature of systemPipeR's CWL interface is that it provides two options to run command-line tools and workflows based on CWL. First, one can run CWL in its native way via an R-based wrapper utility for cwl-runner or cwl-tools (CWL-based approach). Second, one can run workflows using CWL’s @@ -87,30 +979,147 @@ systemPipeR also provides several convenience functions that are useful for designing and debugging workflows, such as a command-line rendering function to retrieve the exact command-line strings for each data set and processing step -prior to running a command-line.

This overview introduces the design of a workflow management container, an S4 +prior to running a command-line.

+

This overview introduces the design of a workflow management container, an S4 class in systemPipeR, as well as the custom command-line interface, -combined with the overview of all the common analysis steps of NGS experiments.

New workflow management interface

systemPipeR allows creation (multi-step analyses) and execution of workflow +combined with the overview of all the common analysis steps of NGS experiments.

+

New workflow management interface

+

systemPipeR allows creation (multi-step analyses) and execution of workflow entirely for R, with control, flexibility, and scalability of the all process. The execution of the workflow can be sent to a HPC, can be parallelizes, -accelerating results acquisition.

The flexibility of systemPipeR's new interface workflow management class is +accelerating results acquisition.

+

The flexibility of systemPipeR's new interface workflow management class is the driving factor behind the use of as many steps necessary for the analysis, as well as the connection between command-line- or R-based software. The connectivity among all workflow steps is achieved by the SYSargsList workflow -management class.

SYSargsList S4 class is a list-like container where each instance stores all the +management class.

+

SYSargsList S4 class is a list-like container where each instance stores all the input/output paths and parameter components required for a particular data -analysis step (see Figure 2).

The SYSargsList constructor function will generate the instances, using as data +analysis step (see Figure 2).

+

The SYSargsList constructor function will generate the instances, using as data input initial targets files, as well as two-parameter files (for details, see below). When running preconfigured workflows, the only input the user needs to provide is the initial targets file containing the paths to the input files (e.g., FASTQ) along with unique sample labels. Subsequent targets instances are created automatically, based on the connectivity establish between the steps. The parameters required for running command-line software is provided by the -parameter (*.cwl and *.yml)) files described below.

The class store one or multiple steps, allowing central control for running, +parameter (*.cwl and *.yml)) files described below.

+

The class store one or multiple steps, allowing central control for running, checking status, and monitor complex workflows from start to finish. This design enhances the systemPipeR workflow framework with a generalized, flexible, and -robust design.

Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container.

Figure 2: Workflow steps with input/output file operations are controlled by `SYSargs2` objects. Each `SYSargs2`instance is constructed from one targets and two param files. The only input provided by the user is the initial targets file. Subsequent targets instances are created automatically, from the previous output files. Any number of predefined or custom workflow steps are supported. One or many `SYSargs2` objects are organized in an `SYSargsList` container.

Reference

Amstutz, Peter, Michael R Crusoe, Nebojša Tijanić, Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, et al. 2016. “Common Workflow Language, V1.0,” July. https://doi.org/10.6084/m9.figshare.3115156.v2.

H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/sp_docker/index.html b/public/sp/spr/sp_docker/index.html index 3aef7d19c..8840e0428 100644 --- a/public/sp/spr/sp_docker/index.html +++ b/public/sp/spr/sp_docker/index.html @@ -1,71 +1,1012 @@ -SPR Docker container | sysPipe

SPR Docker container

Guidelines from bioconductor_docker.

Running the systemPipeR with Docker

Get a copy of the public docker image

docker pull systempipe/systempipe_docker:latest
-

To run RStudio Server:

docker run -e PASSWORD=systemPipe -p 8787:8787 \
+
+
+  
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SPR Docker container | sysPipe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

SPR Docker container

+ + +
+

Guidelines from bioconductor_docker.

+
+

Running the systemPipeR with Docker

+

Get a copy of the public docker image

+
docker pull systempipe/systempipe_docker:latest
+
+

To run RStudio Server:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 \
         systempipe/systempipe_docker:latest
-

You can then open a web browser pointing to your docker host on -port 8787. If you’re on Linux and using default settings, the docker +

+

You can then open a web browser pointing to your docker host on +port 8787. If you’re on Linux and using default settings, the docker host is 127.0.0.1 (or localhost, so the full URL to RStudio would be http://localhost:8787). If you are on Mac or Windows and running Docker Toolbox, you can determine the docker host with the -docker-machine ip default command.

In the above command, -e PASSWORD= is setting the RStudio password +docker-machine ip default command.

+

In the above command, -e PASSWORD= is setting the RStudio password and is required by the RStudio Docker image. It can be whatever you like except it cannot be rstudio. Log in to RStudio with the username rstudio and whatever password was specified, in this -example systemPipe.

To run R from the command line:

docker run -it --user rstudio systempipe/systempipe_docker:latest R
-

To open a Bash shell on the container:

docker run -it --user rstudio systempipe/systempipe_docker:latest bash
-

Install

Prerequisites: -Linux -Mac -Windows

Instructions here on how to install Docker Engine on Ubuntu.

sudo apt-get update
+example systemPipe.

+

To run R from the command line:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest R
+
+

To open a Bash shell on the container:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest bash
+
+ + + + + + + + + + + + + + +
+
+

Install

+

Prerequisites: +Linux +Mac +Windows

+

Instructions here on how to install Docker Engine on Ubuntu.

+
sudo apt-get update
 sudo apt-get install \
     apt-transport-https \
     ca-certificates \
@@ -80,28 +1021,73 @@
  
 ## Verify that Docker Engine is installed correctly by running the hello-world image.
 sudo docker run hello-world
-

Uninstall

sudo apt-get remove docker docker-engine docker.io containerd runc
-

Docker Hub Account

To be able to share a custom image, please go to https://hub.docker.com and -create a free account.


Log in to the Docker Hub locally

Login with your Docker ID to push and pull images from Docker Hub. If you don’t -have a Docker ID, head over to https://hub.docker.com to create one.

docker login
+
+

Uninstall

+
sudo apt-get remove docker docker-engine docker.io containerd runc
+
+
+
+

Docker Hub Account

+

To be able to share a custom image, please go to https://hub.docker.com and +create a free account.

+
+
+

Log in to the Docker Hub locally

+

Login with your Docker ID to push and pull images from Docker Hub. If you don’t +have a Docker ID, head over to https://hub.docker.com to create one.

+
docker login
 # Username: XXXX
 # Password: xxx
 # Login Succeeded
-

Run Docker

docker run-dP systempipe/systempipe_docker:latest
-

Make sure the container is running:

docker ps
+
+
+
+

Run Docker

+
docker run-dP systempipe/systempipe_docker:latest
+
+

Make sure the container is running:

+
docker ps
 # CONTAINER ID   IMAGE                                    COMMAND   CREATED         STATUS         PORTS                     # NAMES
 #5d007f66a7b3   systempipe/systempipe_docker:latest   "/init"   5 minutes ago   Up 5 minutes   0.0.0.0:49153->8787/tcp   determined_easle
-

Login to the container

Please check the NAMES in this example, determined_easle, to login into the container.

docker exec -it determined_easle /bin/bash
-

Other alternatives to run the container

To run RStudio Server:

docker run -e PASSWORD=systemPipe -p 8787:8787 \
+
+

Login to the container

+

Please check the NAMES in this example, determined_easle, to login into the container.

+
docker exec -it determined_easle /bin/bash
+
+

Other alternatives to run the container

+

To run RStudio Server:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 \
     systempipe/systempipe_docker:latest
-

To run R from the command line:

docker run -it --user rstudio systempipe/systempipe_docker:latest R
-

To open a Bash shell on the container:

docker run -it --user rstudio systempipe/systempipe_docker:latest bash
-

Check R Version into the container

R --version
-

Stop Docker

docker stop determined_easle
-

Create your first repository Link

Create a repository:

  • Sign in to Docker Hub.
  • Click Create a Repository on the Docker Hub welcome page:
  • Name it /my-repo.
  • Click Create.

Build and push a container image to Docker Hub from your computer

Start by creating a Dockerfile to specify your application

mkdir docker_test
+
+

To run R from the command line:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest R
+
+

To open a Bash shell on the container:

+
docker run -it --user rstudio systempipe/systempipe_docker:latest bash
+
+

Check R Version into the container

+
R --version
+
+

Stop Docker

+
docker stop determined_easle
+
+
+
+

Create your first repository Link

+

Create a repository:

+
    +
  • Sign in to Docker Hub.
  • +
  • Click Create a Repository on the Docker Hub welcome page:
  • +
  • Name it /my-repo.
  • +
  • Click Create.
  • +
+

Build and push a container image to Docker Hub from your computer

+

Start by creating a Dockerfile to specify your application

+
mkdir docker_test
 cd docker_test
 touch Dockerfile
-
# Docker inheritance
+
+
# Docker inheritance
 FROM systempipe/systempipe_docker:latest
 
 ## Install BiocStyle
@@ -123,26 +1109,76 @@
       maintainer="email@gmail.com" \
       description="Bioconductor docker image containing the systemPipeR Project" \
       license="Artistic-2.0"
-

Run docker build to build your Docker image

docker build -t systempipe/systempipe_docker . 
-

Run docker run to test your Docker image locally

docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest
-

Run docker push to push your Docker image to Docker Hub

docker push systempipe/systempipe_docker
-
  • Your repository in Docker Hub should now display a new latest tag under Tags

Make changes to the container and Create the new image

Create a folder, for example:

docker run -dP systempipe/systempipe_docker
+
+

Run docker build to build your Docker image

+
docker build -t systempipe/systempipe_docker . 
+
+

Run docker run to test your Docker image locally

+
docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:latest
+
+

Run docker push to push your Docker image to Docker Hub

+
docker push systempipe/systempipe_docker
+
+
    +
  • Your repository in Docker Hub should now display a new latest tag under Tags
  • +
+
+
+

Make changes to the container and Create the new image

+

Create a folder, for example:

+
docker run -dP systempipe/systempipe_docker
 docker ps ## To check the NAME <lucid_grothendieck>
 docker exec -it lucid_grothendieck /bin/bash
 root@33c758eb1626:/# R
-
setwd("home/rstudio/")
+
+
setwd("home/rstudio/")
 systemPipeRdata::genWorkenvir("rnaseq")
-
exit
+
+
exit
 docker commit -m "Added rnaseq template" -a "Dani Cassol" lucid_grothendieck dcassol/systempipeworkshop2021:rnaseq
 docker push systempipe/systempipe_docker:rnaseq
-

Run the new image:

docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq
-

Commands

List which docker machines are available locally

docker images

List running containers

docker ps

List all containers

docker ps -a

Resume a stopped container

docker start <CONTAINER ID>

Shell into a running container

docker exec -it <CONTAINER ID> /bin/bash

Stop OR remove a cointainer

docker stop <CONTAINER ID> -docker rm <CONTAINER ID>

Remove a image

docker rmi dcassol/systempipeworkshop2021:rnaseq


Docker and GitHub Actions

  1. To create a new token, go to Docker Hub Settings

1.1. Account Settings » Security » New Access Token -1.2. Add Access Token Description » Create -1.3. Copy the Access Token » Copy and Close

  1. Go to the Repository at GitHub

2.1. Settings > Secrets > New repository secret +

+

Run the new image:

+
docker run -e PASSWORD=systemPipe -p 8787:8787 systempipe/systempipe_docker:rnaseq
+
+
+
+

Commands

+

List which docker machines are available locally

+

docker images

+

List running containers

+

docker ps

+

List all containers

+

docker ps -a

+

Resume a stopped container

+

docker start <CONTAINER ID>

+

Shell into a running container

+

docker exec -it <CONTAINER ID> /bin/bash

+

Stop OR remove a cointainer

+

docker stop <CONTAINER ID> +docker rm <CONTAINER ID>

+

Remove a image

+

docker rmi dcassol/systempipeworkshop2021:rnaseq

+
+
+

Docker and GitHub Actions

+
    +
  1. To create a new token, go to Docker Hub Settings
  2. +
+

1.1. Account Settings » Security » New Access Token +1.2. Add Access Token Description » Create +1.3. Copy the Access Token » Copy and Close

+
    +
  1. Go to the Repository at GitHub
  2. +
+

2.1. Settings > Secrets > New repository secret 2.2. Create a new secret with the name DOCKER_HUB_USERNAME and your Docker ID as value 2.3. Click at Add secret -2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)

  1. Set up the GitHub Actions workflow
    steps:
+2.4. Create a new secret with the name DOCKER_HUB_ACCESS_TOKEN and your Personal Access Token (PAT) as value (generated in the previous step)

+
    +
  1. Set up the GitHub Actions workflow
  2. +
+
    steps:
     
       - name: Checkout Repo 
         uses: actions/checkout@v2
@@ -152,16 +1188,135 @@
         with:
           username: ${{ secrets.DOCKER_HUB_USERNAME }}
           password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
-

Common Problems

## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied
-

Solution:

sudo chmod 666 /var/run/docker.sock
-

Singularity Container

Please download the Docker image of systemPipe, as follow:

singularity pull docker://systempipe/systempipe_docker:latest
-

You can also use the build command to download pre-built images from Docker. +

+
+
+

Common Problems

+
## Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth: dial unix /var/run/docker.sock: connect: permission denied
+
+

Solution:

+
sudo chmod 666 /var/run/docker.sock
+
+
+
+

Singularity Container

+

Please download the Docker image of systemPipe, as follow:

+
singularity pull docker://systempipe/systempipe_docker:latest
+
+

You can also use the build command to download pre-built images from Docker. Unlike pull, build will convert the image to the latest Singularity image format after -downloading it.

singularity build systempipe_docker_latest.sif docker://systempipe/systempipe_docker:latest
-

To run the container:

singularity shell systempipe_docker_latest.sif
-

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/spr_funcs/index.html b/public/sp/spr/spr_funcs/index.html index 33254d5e2..6d8c6042c 100644 --- a/public/sp/spr/spr_funcs/index.html +++ b/public/sp/spr/spr_funcs/index.html @@ -1,56 +1,1014 @@ -Help Manual | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Help Manual

+ + +
+ +

systempipeR Functions Reference Manuals

+

The following reference manual was created by systemPipeR Development version.

+ +
+ + + +
Last modified 2021-04-26: fix images path; no_render (7cf5004c) +
+
+ + +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/spr_run/index.html b/public/sp/spr/spr_run/index.html index b742f024d..1b77312cd 100644 --- a/public/sp/spr/spr_run/index.html +++ b/public/sp/spr/spr_run/index.html @@ -1,58 +1,972 @@ -How to run a Workflow | sysPipe

How to run a Workflow

Project initialization

To create a Workflow within systemPipeR, we can start by defining an empty -container and checking the directory structure:

sal <- SPRproject(projPath = tempdir())
-
## Creating directory: /tmp/RtmpzxxPO5/data 
+
+
+  
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+How to run a Workflow | sysPipe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

How to run a Workflow

+ + + + + + + + + + +

Project initialization

+

To create a Workflow within systemPipeR, we can start by defining an empty +container and checking the directory structure:

+
sal <- SPRproject(projPath = tempdir())
+
+
## Creating directory: /tmp/RtmpzxxPO5/data 
 ## Creating directory: /tmp/RtmpzxxPO5/param 
 ## Creating directory: /tmp/RtmpzxxPO5/results 
 ## Creating directory '/tmp/RtmpzxxPO5/.SPRproject'
@@ -61,27 +975,38 @@
 ## Your current working directory is different from the directory chosen for the Project Workflow.
 ## For accurate location of the files and running the Workflow, please set the working directory to 
 ## 'setwd(/tmp/RtmpzxxPO5)'
-

Internally, SPRproject function will create a hidden folder called .SPRproject, +

+

Internally, SPRproject function will create a hidden folder called .SPRproject, by default, to store all the log files. A YAML file, here called SYSargsList.yml, has been created, which initially contains the basic location of the project structure; however, every time the workflow object sal is updated in R, the new information will also be store in this flat-file database for easy recovery. If you desire different names for the logs folder and the YAML file, these can -be modified as follows:

sal <- SPRproject(logs.dir = ".SPRproject", sys.file = ".SPRproject/SYSargsList.yml")
-

Also, this function will check and/or create the basic folder structure if missing, -which means data, param, and results folder, as described here. +be modified as follows:

+
sal <- SPRproject(logs.dir = ".SPRproject", sys.file = ".SPRproject/SYSargsList.yml")
+
+

Also, this function will check and/or create the basic folder structure if missing, +which means data, param, and results folder, as described here. If the user wants to use a different names for these directories, can be specified -as follows:

sal <- SPRproject(data = "data", param = "param", results = "results")
-

It is possible to separate all the R objects created within the workflow analysis +as follows:

+
sal <- SPRproject(data = "data", param = "param", results = "results")
+
+

It is possible to separate all the R objects created within the workflow analysis from the current environment. SPRproject function provides the option to create a new environment, and in this way, it is not overwriting any object you may want -to have at your current section.

sal <- SPRproject(envir = new.env())
-

In this stage, the object sal is a empty container, except for the project information. The project information can be accessed by the projectInfo method:

sal
-
## Instance of 'SYSargsList': 
+to have at your current section.

+
sal <- SPRproject(envir = new.env())
+
+

In this stage, the object sal is a empty container, except for the project information. The project information can be accessed by the projectInfo method:

+
sal
+
+
## Instance of 'SYSargsList': 
 ##  No workflow steps added
-
projectInfo(sal)
-
## $project
+
+
projectInfo(sal)
+
+
## $project
 ## [1] "/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr"
 ## 
 ## $data
@@ -98,72 +1023,114 @@
 ## 
 ## $sysargslist
 ## [1] ".SPRproject/SYSargsList.yml"
-

Also, the length function will return how many steps this workflow contains and -in this case it is empty, as follow:

length(sal)
-
## [1] 0
-

Workflow Design

systemPipeR workflows can be designed and built from start to finish with a +

+

Also, the length function will return how many steps this workflow contains and +in this case it is empty, as follow:

+
length(sal)
+
+
## [1] 0
+
+

Workflow Design

+

systemPipeR workflows can be designed and built from start to finish with a single command, importing from an R Markdown file or stepwise in interactive mode from the R console. -In the next section, we will demonstrate how to build the workflow in an -interactive mode, and in the following section, we will show how to build from a -file.

New workflows are constructed, or existing ones modified, by connecting each +In the next section, we will demonstrate how to build the workflow in an +interactive mode, and in the following section, we will show how to build from a +file.

+

New workflows are constructed, or existing ones modified, by connecting each step via appendStep method. Each SYSargsList instance contains instructions needed for processing a set of input files with a specific command-line or R software, as well as the paths to the corresponding outfiles generated by a -particular tool/step.

To build R code based step, the constructor function Linewise is used. -For more details about this S4 class container, see here.

Build workflow interactive

This tutorial shows a very simple example for describing and explaining all main +particular tool/step.

+

To build R code based step, the constructor function Linewise is used. +For more details about this S4 class container, see here.

+

Build workflow interactive

+

This tutorial shows a very simple example for describing and explaining all main features available within systemPipeR to design, build, manage, run, and visualize the workflow. In summary, we are exporting a dataset to multiple files, compressing and decompressing each one of the files, and importing to R, -and finally performing a statistical analysis.

In the previous section, we initialize the project by building the sal object. -Until this moment, the container has no steps:

sal
-
## Instance of 'SYSargsList': 
+and finally performing a statistical analysis.

+

In the previous section, we initialize the project by building the sal object. +Until this moment, the container has no steps:

+
sal
+
+
## Instance of 'SYSargsList': 
 ##  No workflow steps added
-

Next, we need to populate the object created with the first step in the -workflow.

Adding the first step

The first step is R code based, and we are splitting the iris dataset by Species +

+

Next, we need to populate the object created with the first step in the +workflow.

+

Adding the first step

+

The first step is R code based, and we are splitting the iris dataset by Species and for each Species will be saved on file. Please note that this code will -not be executed now; it is just store in the container for further execution.

This constructor function requires the step_name and the R-based code under +not be executed now; it is just store in the container for further execution.

+

This constructor function requires the step_name and the R-based code under the code argument. -The R code should be enclosed by braces ({}) and separated by a new line.

appendStep(sal) <- LineWise(code = {
+The R code should be enclosed by braces ({}) and separated by a new line.

+
appendStep(sal) <- LineWise(code = {
     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results",
         paste0(names(split(iris, factor(iris$Species))), ".csv")))
 }, step_name = "export_iris")
-

For a brief overview of the workflow, we can check the object as follows:

sal
-
## Instance of 'SYSargsList': 
+
+

For a brief overview of the workflow, we can check the object as follows:

+
sal
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ## 
-

Also, for printing and double-check the R code in the step, we can use the -codeLine method:

codeLine(sal)
-
## export_iris
+
+

Also, for printing and double-check the R code in the step, we can use the +codeLine method:

+
codeLine(sal)
+
+
## export_iris
 ##     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", paste0(names(split(iris, factor(iris$Species))), ".csv")))
-

Adding more steps

Next, an example of how to compress the exported files using -gzip command-line.

The constructor function creates an SYSargsList S4 class object using data from -three input files:

- CWL command-line specification file (`wf_file` argument);
+
+

Adding more steps

+

Next, an example of how to compress the exported files using +gzip command-line.

+

The constructor function creates an SYSargsList S4 class object using data from +three input files:

+
- CWL command-line specification file (`wf_file` argument);
 - Input variables (`input_file` argument);
 - Targets file (`targets` argument).
-

In CWL, files with the extension .cwl define the parameters of a chosen +

+

In CWL, files with the extension .cwl define the parameters of a chosen command-line step or workflow, while files with the extension .yml define the -input variables of command-line steps.

The targets file is optional for workflow steps lacking input files. The connection +input variables of command-line steps.

+

The targets file is optional for workflow steps lacking input files. The connection between input variables and the targets file is defined under the inputvars argument. It is required a named vector, where each element name needs to match with column names in the targets file, and the value must match the names of -the input variables defined in the *.yml files (see Figure ??).

A detailed description of the dynamic between input variables and targets -files can be found here. -In addition, the CWL syntax overview can be found here.

Besides all the data form targets, wf_file, input_file and dir_path arguments, -SYSargsList constructor function options include:

  • step_name: a unique name for the step. This is not mandatory; however, +the input variables defined in the *.yml files (see Figure ??).

    +

    A detailed description of the dynamic between input variables and targets +files can be found here. +In addition, the CWL syntax overview can be found here.

    +

    Besides all the data form targets, wf_file, input_file and dir_path arguments, +SYSargsList constructor function options include:

    +
      +
    • step_name: a unique name for the step. This is not mandatory; however, it is highly recommended. If no name is provided, a default step_x, where -x reflects the step index, will be added.
    • dir: this option allows creating an exclusive subdirectory for the step +x reflects the step index, will be added.
    • +
    • dir: this option allows creating an exclusive subdirectory for the step in the workflow. All the outfiles and log files for this particular step will -be generated in the respective folders.
    • dependency: after the first step, all the additional steps appended to -the workflow require the information of the dependency tree.

    The appendStep<- method is used to append a new step in the workflow.

    targetspath <- system.file("extdata/cwl/gunzip", "targets_gunzip.txt", package = "systemPipeR")
    +be generated in the respective folders.
  • +
  • dependency: after the first step, all the additional steps appended to +the workflow require the information of the dependency tree.
  • +
+

The appendStep<- method is used to append a new step in the workflow.

+
targetspath <- system.file("extdata/cwl/gunzip", "targets_gunzip.txt", package = "systemPipeR")
 appendStep(sal) <- SYSargsList(step_name = "gzip", targets = targetspath, dir = TRUE,
     wf_file = "gunzip/workflow_gzip.cwl", input_file = "gunzip/gzip.yml", dir_path = system.file("extdata/cwl",
         package = "systemPipeR"), inputvars = c(FileName = "_FILE_PATH_", SampleName = "_SampleName_"),
     dependency = "export_iris")
-

Note: This will not work if the gzip is not available on your system -(installed and exported to PATH) and may only work on Windows systems using PowerShell.

For a overview of the workflow, we can check the object as follows:

sal
-
## Instance of 'SYSargsList': 
+
+

Note: This will not work if the gzip is not available on your system +(installed and exported to PATH) and may only work on Windows systems using PowerShell.

+

For a overview of the workflow, we can check the object as follows:

+
sal
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gzip --> Status: Pending 
@@ -171,12 +1138,16 @@
 ##          2.1. gzip
 ##              cmdlist: 3 | Pending: 3
 ## 
-

Note that we have two steps, and it is expected three files from the second step. + +

Note that we have two steps, and it is expected three files from the second step. Also, the workflow status is Pending, which means the workflow object is rendered in R; however, we did not execute the workflow yet. -In addition to this summary, it can be observed this step has three command lines.

For more details about the command-line rendered for each target file, it can be -checked as follows:

cmdlist(sal, step = "gzip")
-
## $gzip
+In addition to this summary, it can be observed this step has three command lines.

+

For more details about the command-line rendered for each target file, it can be +checked as follows:

+
cmdlist(sal, step = "gzip")
+
+
## $gzip
 ## $gzip$SE
 ## $gzip$SE$gzip
 ## [1] "gzip -c  results/setosa.csv > results/SE.csv.gz"
@@ -190,12 +1161,17 @@
 ## $gzip$VI
 ## $gzip$VI$gzip
 ## [1] "gzip -c  results/virginica.csv > results/VI.csv.gz"
-

Using the outfiles for the next step

For building this step, all the previous procedures are being used to append the +

+

Using the outfiles for the next step

+

For building this step, all the previous procedures are being used to append the next step. However, here, we can observe power features that build the -connectivity between steps in the workflow.

In this example, we would like to use the outfiles from gzip Step, as +connectivity between steps in the workflow.

+

In this example, we would like to use the outfiles from gzip Step, as input from the next step, which is the gunzip. In this case, let’s look at the -outfiles from the first step:

outfiles(sal)
-
## $export_iris
+outfiles from the first step:

+
outfiles(sal)
+
+
## $export_iris
 ## DataFrame with 0 rows and 0 columns
 ## 
 ## $gzip
@@ -205,39 +1181,51 @@
 ## 1 results/SE.csv.gz
 ## 2 results/VE.csv.gz
 ## 3 results/VI.csv.gz
-

The column we want to use is “gzip_file.” For the argument targets in the +

+

The column we want to use is “gzip_file.” For the argument targets in the SYSargsList function, it should provide the name of the correspondent step in the Workflow and which outfiles you would like to be incorporated in the next step. The argument inputvars allows the connectivity between outfiles and the new targets file. Here, the name of the previous outfiles should be provided -it. Please note that all outfiles column names must be unique.

It is possible to keep all the original columns from the targets files or remove +it. Please note that all outfiles column names must be unique.

+

It is possible to keep all the original columns from the targets files or remove some columns for a clean targets file. The argument rm_targets_col provides this flexibility, where it is possible to specify the names of the columns that should be removed. If no names are passing -here, the new columns will be appended.

appendStep(sal) <- SYSargsList(step_name = "gunzip", targets = "gzip", dir = TRUE,
+here, the new columns will be appended.

+
appendStep(sal) <- SYSargsList(step_name = "gunzip", targets = "gzip", dir = TRUE,
     wf_file = "gunzip/workflow_gunzip.cwl", input_file = "gunzip/gunzip.yml", dir_path = system.file("extdata/cwl",
         package = "systemPipeR"), inputvars = c(gzip_file = "_FILE_PATH_", SampleName = "_SampleName_"),
     rm_targets_col = "FileName", dependency = "gzip")
-

We can check the targets automatically create for this step, -based on the previous outfiles:

targetsWF(sal[3])
-
## $gunzip
+
+

We can check the targets automatically create for this step, +based on the previous outfiles:

+
targetsWF(sal[3])
+
+
## $gunzip
 ## DataFrame with 3 rows and 2 columns
 ##           gzip_file  SampleName
 ##         <character> <character>
 ## 1 results/SE.csv.gz          SE
 ## 2 results/VE.csv.gz          VE
 ## 3 results/VI.csv.gz          VI
-

We can also check all the expected outfiles for this particular step, as follows:

outfiles(sal[3])
-
## $gunzip
+
+

We can also check all the expected outfiles for this particular step, as follows:

+
outfiles(sal[3])
+
+
## $gunzip
 ## DataFrame with 3 rows and 1 column
 ##      gunzip_file
 ##      <character>
 ## 1 results/SE.csv
 ## 2 results/VE.csv
 ## 3 results/VI.csv
-

Now, we can observe that the third step has been added and contains one substep.

sal
-
## Instance of 'SYSargsList': 
+
+

Now, we can observe that the third step has been added and contains one substep.

+
sal
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gzip --> Status: Pending 
@@ -249,18 +1237,27 @@
 ##          3.1. gunzip
 ##              cmdlist: 3 | Pending: 3
 ## 
-

In addition, we can access all the command lines for each one of the substeps.

cmdlist(sal["gzip"], targets = 1)
-
## $gzip
+
+

In addition, we can access all the command lines for each one of the substeps.

+
cmdlist(sal["gzip"], targets = 1)
+
+
## $gzip
 ## $gzip$SE
 ## $gzip$SE$gzip
 ## [1] "gzip -c  results/setosa.csv > results/SE.csv.gz"
-

Getting data from a workflow instance

The final step in this simple workflow is an R code step. For that, we are using -the LineWise constructor function as demonstrated above.

One interesting feature showed here is the getColumn method that allows +

+

Getting data from a workflow instance

+

The final step in this simple workflow is an R code step. For that, we are using +the LineWise constructor function as demonstrated above.

+

One interesting feature showed here is the getColumn method that allows extracting the information for a workflow instance. Those files can be used in -an R code, as demonstrated below.

getColumn(sal, step = "gunzip", "outfiles")
-
##               SE               VE               VI 
+an R code, as demonstrated below.

+
getColumn(sal, step = "gunzip", "outfiles")
+
+
##               SE               VE               VI 
 ## "results/SE.csv" "results/VE.csv" "results/VI.csv"
-
appendStep(sal) <- LineWise(code = {
+
+
appendStep(sal) <- LineWise(code = {
     df <- lapply(getColumn(sal, step = "gunzip", "outfiles"), function(x) read.delim(x,
         sep = ",")[-1])
     df <- do.call(rbind, df)
@@ -273,16 +1270,23 @@
         ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd),
             width = 0.2, position = ggplot2::position_dodge(0.9))
 }, step_name = "iris_stats", dependency = "gzip")
-

Build workflow from a {R Markdown}

The precisely same workflow can be created by importing the steps from an +

+

Build workflow from a {R Markdown}

+

The precisely same workflow can be created by importing the steps from an R Markdown file. -As demonstrated above, it is required to initialize the project with SPRproject function.

importWF function will scan and import all the R chunk from the R Markdown file +As demonstrated above, it is required to initialize the project with SPRproject function.

+

importWF function will scan and import all the R chunk from the R Markdown file and build all the workflow instances. Then, each R chuck in the file will be -converted in a workflow step.

sal_rmd <- SPRproject(logs.dir = ".SPRproject_rmd")
-
## Creating directory '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd'
+converted in a workflow step.

+
sal_rmd <- SPRproject(logs.dir = ".SPRproject_rmd")
+
+
## Creating directory '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd'
 ## Creating file '/home/dcassol/danielac@ucr.edu/projects/SP/SPR_org/systemPipeR.github.io_docsy/content/en/sp/spr/.SPRproject_rmd/SYSargsList.yml'
-
sal_rmd <- importWF(sal_rmd, file_path = system.file("extdata", "spr_simple_wf.Rmd",
+
+
sal_rmd <- importWF(sal_rmd, file_path = system.file("extdata", "spr_simple_wf.Rmd",
     package = "systemPipeR"))
-
## Reading Rmd file
+
+
## Reading Rmd file
 
 ## 
 ##  ---- Actions ----
@@ -309,8 +1313,11 @@
 ## Now importing step 'gzip' 
 ## Now importing step 'gunzip' 
 ## Now importing step 'stats'
-

Let’s explore the workflow to check the steps:

stepsWF(sal_rmd)
-
## $export_iris
+
+

Let’s explore the workflow to check the steps:

+
stepsWF(sal_rmd)
+
+
## $export_iris
 ## Instance of 'LineWise'
 ##     Code Chunk length: 1
 ## 
@@ -343,8 +1350,10 @@
 ## $stats
 ## Instance of 'LineWise'
 ##     Code Chunk length: 5
-
dependency(sal_rmd)
-
## $export_iris
+
+
dependency(sal_rmd)
+
+
## $export_iris
 ## [1] ""
 ## 
 ## $gzip
@@ -355,8 +1364,10 @@
 ## 
 ## $stats
 ## [1] "gunzip"
-
codeLine(sal_rmd)
-
## gzip AND gunzip step have been dropped because it is not a LineWise object.
+
+
codeLine(sal_rmd)
+
+
## gzip AND gunzip step have been dropped because it is not a LineWise object.
 
 ## export_iris
 ##     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", paste0(names(split(iris, factor(iris$Species))), ".csv")))
@@ -366,8 +1377,10 @@
 ##     stats <- data.frame(cbind(mean = apply(df[, 1:4], 2, mean), sd = apply(df[, 1:4], 2, sd)))
 ##     stats$species <- rownames(stats)
 ##     plot <- ggplot2::ggplot(stats, ggplot2::aes(x = species, y = mean, fill = species)) + ggplot2::geom_bar(stat = "identity", color = "black", position = ggplot2::position_dodge()) + ggplot2::geom_errorbar(ggplot2::aes(ymin = mean - sd, ymax = mean + sd), width = 0.2, position = ggplot2::position_dodge(0.9))
-
targetsWF(sal_rmd)
-
## $export_iris
+
+
targetsWF(sal_rmd)
+
+
## $export_iris
 ## DataFrame with 0 rows and 0 columns
 ## 
 ## $gzip
@@ -388,36 +1401,64 @@
 ## 
 ## $stats
 ## DataFrame with 0 rows and 0 columns
-

Rules to create the R Markdown to import as workflow

To include a particular code chunk from the R Markdown file in the workflow -analysis, please use the following code chunk options:

-   `spr='r'`: for code chunks with R code lines;
+
+

Rules to create the R Markdown to import as workflow

+

To include a particular code chunk from the R Markdown file in the workflow +analysis, please use the following code chunk options:

+
-   `spr='r'`: for code chunks with R code lines;
 -   `spr='sysargs'`: for code chunks with an `SYSargsList` object;
 -   `spr.dep=<StepName>`: for specify the previous dependency.
-

For example:

```{r step_1, eval=TRUE, spr=‘r,’ spr.dep=‘step_0’}

```{r step_2, eval=TRUE, spr=‘sysargs,’ spr.dep=‘step_1’}

For spr = 'sysargs', the last object assigned must to be the SYSargsList, for example:

targetspath <- system.file("extdata/cwl/example/targets_example.txt", package = "systemPipeR")
+
+

For example:

+
+

```{r step_1, eval=TRUE, spr=‘r,’ spr.dep=‘step_0’}

+
+
+

```{r step_2, eval=TRUE, spr=‘sysargs,’ spr.dep=‘step_1’}

+
+

For spr = 'sysargs', the last object assigned must to be the SYSargsList, for example:

+
targetspath <- system.file("extdata/cwl/example/targets_example.txt", package = "systemPipeR")
 HW_mul <- SYSargsList(step_name = "Example", targets = targetspath, wf_file = "example/example.cwl",
     input_file = "example/example.yml", dir_path = system.file("extdata/cwl", package = "systemPipeR"),
     inputvars = c(Message = "_STRING_", SampleName = "_SAMPLE_"))
-

Also, note that all the required files or objects to generate one particular +

+

Also, note that all the required files or objects to generate one particular command-line step must be defined in a R code chunk imported. The motivation for this is that when R Markdown files are imported, the spr = 'sysargs' R chunk will be evaluated and stored in the workflow control class as the SYSargsList object, while the R code based (spr = 'r') is not -evaluated, and until the workflow is executed it will be store as an expression.

Running the workflow

For running the workflow, runWF function will execute all the command lines -store in the workflow container.

sal <- runWF(sal)
-

This essential function allows the user to choose one or multiple steps to be +evaluated, and until the workflow is executed it will be store as an expression.

+

Running the workflow

+

For running the workflow, runWF function will execute all the command lines +store in the workflow container.

+
sal <- runWF(sal)
+
+

This essential function allows the user to choose one or multiple steps to be executed using the steps argument. However, it is necessary to follow the workflow dependency graph. If a selected step depends on a previous step(s) that -was not executed, the execution will fail.

sal <- runWF(sal, steps = c(1, 3))
-

Also, it allows forcing the execution of the steps, even if the status of the +was not executed, the execution will fail.

+
sal <- runWF(sal, steps = c(1, 3))
+
+

Also, it allows forcing the execution of the steps, even if the status of the step is 'Success' and all the expected outfiles exists. Another feature of the runWF function is ignoring all the warnings and errors and running the workflow by the arguments warning.stop and -error.stop, respectively.

sal <- runWF(sal, force = TRUE, warning.stop = FALSE, error.stop = TRUE)
-

When the project was initialized by SPRproject function, it was created an +error.stop, respectively.

+
sal <- runWF(sal, force = TRUE, warning.stop = FALSE, error.stop = TRUE)
+
+

When the project was initialized by SPRproject function, it was created an environment for all objects created during the workflow execution. This -environment can be accessed as follows:

viewEnvir(sal)
-

The workflow execution allows to save this environment for future recovery:

sal <- runWF(sal, saveEnv = TRUE)
-

Workflow status

To check the summary of the workflow, we can use:

sal
-
## Instance of 'SYSargsList': 
+environment can be accessed as follows:

+
viewEnvir(sal)
+
+

The workflow execution allows to save this environment for future recovery:

+
sal <- runWF(sal, saveEnv = TRUE)
+
+

Workflow status

+

To check the summary of the workflow, we can use:

+
sal
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gzip --> Status: Pending 
@@ -430,8 +1471,11 @@
 ##              cmdlist: 3 | Pending: 3
 ##        4. iris_stats --> Status: Pending
 ## 
-

To access more details about the workflow instances, we can use the statusWF method:

statusWF(sal)
-
## $export_iris
+
+

To access more details about the workflow instances, we can use the statusWF method:

+
statusWF(sal)
+
+
## $export_iris
 ## DataFrame with 1 row and 2 columns
 ##          Step status.summary
 ##   <character>    <character>
@@ -458,14 +1502,19 @@
 ##          Step status.summary
 ##   <character>    <character>
 ## 1  iris_stats        Pending
-

Parallelization on clusters

This section of the tutorial provides an introduction to the usage of the -systemPipeR features on a cluster.

The computation can be greatly accelerated by processing many files +

+

Parallelization on clusters

+

This section of the tutorial provides an introduction to the usage of the +systemPipeR features on a cluster.

+

The computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing system is used for load balancing. For this the clusterRun function submits the computing requests to the scheduler using the run specifications -defined by runWF.

A named list provides the computational resources. By default, it can be defined +defined by runWF.

+

A named list provides the computational resources. By default, it can be defined the upper time limit in minutes for jobs before they get killed by the scheduler, -memory limit in Mb, number of CPUs, and number of tasks.

The number of independent parallel cluster processes is defined under the +memory limit in Mb, number of CPUs, and number of tasks.

+

The number of independent parallel cluster processes is defined under the Njobs argument. The following example will run one process in parallel using for each 4 CPU cores. If the resources available on a cluster allow running all the processes simultaneously, then the shown sample submission will utilize in @@ -473,68 +1522,119 @@ with most queueing systems as it is based on utilities from the batchtools package which supports the use of template files (*.tmpl) for defining the run parameters of different schedulers. To run the following code, one needs to -have both a conf file (see .batchtools.conf.R samples here) -and a template file (see *.tmpl samples here) +have both a conf file (see .batchtools.conf.R samples here) +and a template file (see *.tmpl samples here) for the queueing available on a system. The following example uses the sample -conf and template files for the Slurm scheduler provided by this package.

library(batchtools)
+conf and template files for the Slurm scheduler provided by this package.

+
library(batchtools)
 resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
 sal <- clusterRun(sal, FUN = runWF, more.args = list(), conffile = ".batchtools.conf.R",
     template = "batchtools.slurm.tmpl", Njobs = 1, runid = "01", resourceList = resources)
-

Note: The example is submitting the jog to short partition. If you desire to -use a different partition, please adjust accordingly (batchtools.slurm.tmpl).

Visualize workflow

systemPipeR workflows instances can be visualized with the plotWF function.

This function will make a plot of selected workflow instance and the following -information is displayed on the plot:

- Workflow structure (dependency graphs between different steps); 
+
+

Note: The example is submitting the jog to short partition. If you desire to +use a different partition, please adjust accordingly (batchtools.slurm.tmpl).

+

Visualize workflow

+

systemPipeR workflows instances can be visualized with the plotWF function.

+

This function will make a plot of selected workflow instance and the following +information is displayed on the plot:

+
- Workflow structure (dependency graphs between different steps); 
 - Workflow step status, *e.g.* `Success`, `Error`, `Pending`, `Warnings`; 
 - Sample status and statistics; 
 - Workflow timing: running duration time. 
-

If no argument is provided, the basic plot will automatically detect width, -height, layout, plot method, branches, etc.

plotWF(sal, show_legend = TRUE, width = "80%", rstudio = TRUE)
-

For more details about the plotWF function, please see here.

Technical report

systemPipeR compiles all the workflow execution logs in one central location, +

+

If no argument is provided, the basic plot will automatically detect width, +height, layout, plot method, branches, etc.

+
plotWF(sal, show_legend = TRUE, width = "80%", rstudio = TRUE)
+
+
+ +

For more details about the plotWF function, please see here.

+

Technical report

+

systemPipeR compiles all the workflow execution logs in one central location, making it easier to check any standard output (stdout) or standard error (stderr) for any command-line tools used on the workflow or the R code stdout. Also, the workflow plot is appended at the beginning of the report, making it -easier to click on the respective step.

sal <- renderLogs(sal)
-

Exported the workflow

systemPipeR workflow management system allows to translate and export the +easier to click on the respective step.

+
sal <- renderLogs(sal)
+
+

Exported the workflow

+

systemPipeR workflow management system allows to translate and export the workflow build interactively to R Markdown format or an executable bash script. This feature advances the reusability of the workflow, as well as the flexibility -for workflow execution.

R Markdown file

sal2rmd function takes an SYSargsList workflow container and translates it to +for workflow execution.

+

R Markdown file

+

sal2rmd function takes an SYSargsList workflow container and translates it to SPR workflow template R markdown format. This file can be imported with the -importWF function, as demonstrated above.

sal2rmd(sal)
-

Bash script

sal2bash function takes an SYSargsList workflow container and translates +importWF function, as demonstrated above.

+
sal2rmd(sal)
+
+

Bash script

+

sal2bash function takes an SYSargsList workflow container and translates it to an executable bash script, so one can run the workflow without loading -SPR or using an R console.

sal2bash(sal)
-

It will be generated on the project root an executable bash script, called by +SPR or using an R console.

+
sal2bash(sal)
+
+

It will be generated on the project root an executable bash script, called by default the spr_wf.sh. Also, a directory ./spr_wf will be created and store all the R scripts based on the workflow steps. Please note that this function will -“collapse” adjacent R steps into one file as much as possible.

Project Resume and Restart

If you desire to resume or restart a project that has been initialized in the past, -SPRproject function allows this operation.

With the resume option, it is possible to load the SYSargsList object in R and +“collapse” adjacent R steps into one file as much as possible.

+

Project Resume and Restart

+

If you desire to resume or restart a project that has been initialized in the past, +SPRproject function allows this operation.

+

With the resume option, it is possible to load the SYSargsList object in R and resume the analysis. Please, make sure to provide the logs.dir location, and the corresponded YAML file name. -The current working directory needs to be in the project root directory.

sal <- SPRproject(resume = TRUE, logs.dir = ".SPRproject", sys.file = ".SPRproject/SYSargsList.yml")
-

If you choose to save the environment in the last analysis, you can recover all +The current working directory needs to be in the project root directory.

+
sal <- SPRproject(resume = TRUE, logs.dir = ".SPRproject", sys.file = ".SPRproject/SYSargsList.yml")
+
+

If you choose to save the environment in the last analysis, you can recover all the files created in that particular section. SPRproject function allows this with load.envir argument. Please note that the environment was saved only with -you run the workflow in the last section (runWF()).

sal <- SPRproject(resume = TRUE, load.envir = TRUE)
-

After loading the workflow at your current section, you can check the objects +you run the workflow in the last section (runWF()).

+
sal <- SPRproject(resume = TRUE, load.envir = TRUE)
+
+

After loading the workflow at your current section, you can check the objects created in the old environment and decide if it is necessary to copy them to the -current environment.

viewEnvir(sal)
+current environment.

+
viewEnvir(sal)
 copyEnvir(sal, list = "plot", new.env = globalenv())
-

This option will keep all previous logs in the folder; however, if you desire to +

+

This option will keep all previous logs in the folder; however, if you desire to clean the execution history and restart the workflow, the restart=TRUE option -can be used.

sal <- SPRproject(restart = TRUE, overwrite = TRUE, load.envir = FALSE)
-

The last and more drastic option from SYSproject function is to overwrite the +can be used.

+
sal <- SPRproject(restart = TRUE, overwrite = TRUE, load.envir = FALSE)
+
+

The last and more drastic option from SYSproject function is to overwrite the logs and the workflow. This option will delete the hidden folder and the information on the SYSargsList.yml files. This will not delete any parameter -file nor any results it was created in previous runs. Please use with caution.

sal <- SPRproject(overwrite = TRUE)
-

Exploring workflow instances

systemPipeR provide several accessor methods and useful functions to explore -SYSargsList workflow object.

Accessor Methods

Several accessor methods are available that are named after the slot names of -the SYSargsList workflow object.

names(sal)
-
## [1] "stepsWF"            "statusWF"           "targetsWF"         
+file nor any results it was created in previous runs. Please use with caution.

+
sal <- SPRproject(overwrite = TRUE)
+
+

Exploring workflow instances

+

systemPipeR provide several accessor methods and useful functions to explore +SYSargsList workflow object.

+

Accessor Methods

+

Several accessor methods are available that are named after the slot names of +the SYSargsList workflow object.

+
names(sal)
+
+
## [1] "stepsWF"            "statusWF"           "targetsWF"         
 ## [4] "outfiles"           "SEobj"              "dependency"        
 ## [7] "targets_connection" "projectInfo"        "runInfo"
-
  • Check the length of the workflow:
length(sal)
-
## [1] 4
-
  • Check the steps of the workflow:
stepsWF(sal)
-
## $export_iris
+
+
    +
  • Check the length of the workflow:
  • +
+
length(sal)
+
+
## [1] 4
+
+
    +
  • Check the steps of the workflow:
  • +
+
stepsWF(sal)
+
+
## $export_iris
 ## Instance of 'LineWise'
 ##     Code Chunk length: 1
 ## 
@@ -567,14 +1667,20 @@
 ## $iris_stats
 ## Instance of 'LineWise'
 ##     Code Chunk length: 5
-
  • Checking the command-line for each target sample:

cmdlist() method printing the system commands for running command-line +

+
    +
  • Checking the command-line for each target sample:
  • +
+

cmdlist() method printing the system commands for running command-line software as specified by a given *.cwl file combined with the paths to the input samples (e.g. FASTQ files) provided by a targets file. The example below shows the cmdlist() output for running gzip and gunzip on the first sample. Evaluating the output of cmdlist() can be very helpful for designing and debugging *.cwl files of new command-line software or changing the -parameter settings of existing ones.

cmdlist(sal, step = c(2, 3), targets = 1)
-
## $gzip
+parameter settings of existing ones.

+
cmdlist(sal, step = c(2, 3), targets = 1)
+
+
## $gzip
 ## $gzip$SE
 ## $gzip$SE$gzip
 ## [1] "gzip -c  results/setosa.csv > results/SE.csv.gz"
@@ -585,8 +1691,13 @@
 ## $gunzip$SE
 ## $gunzip$SE$gunzip
 ## [1] "gunzip -c  results/SE.csv.gz > results/SE.csv"
-
  • Check the workflow status:
statusWF(sal)
-
## $export_iris
+
+
    +
  • Check the workflow status:
  • +
+
statusWF(sal)
+
+
## $export_iris
 ## DataFrame with 1 row and 2 columns
 ##          Step status.summary
 ##   <character>    <character>
@@ -613,25 +1724,41 @@
 ##          Step status.summary
 ##   <character>    <character>
 ## 1  iris_stats        Pending
-
  • Check the workflow targets files:
targetsWF(sal[2])
-
## $gzip
+
+
    +
  • Check the workflow targets files:
  • +
+
targetsWF(sal[2])
+
+
## $gzip
 ## DataFrame with 3 rows and 2 columns
 ##                 FileName  SampleName
 ##              <character> <character>
 ## 1     results/setosa.csv          SE
 ## 2 results/versicolor.csv          VE
 ## 3  results/virginica.csv          VI
-
  • Checking the expected outfiles files:

The outfiles components of SYSargsList define the expected outfiles files -for each step in the workflow, some of which are the input for the next workflow step.

outfiles(sal[2])
-
## $gzip
+
+
    +
  • Checking the expected outfiles files:
  • +
+

The outfiles components of SYSargsList define the expected outfiles files +for each step in the workflow, some of which are the input for the next workflow step.

+
outfiles(sal[2])
+
+
## $gzip
 ## DataFrame with 3 rows and 1 column
 ##           gzip_file
 ##         <character>
 ## 1 results/SE.csv.gz
 ## 2 results/VE.csv.gz
 ## 3 results/VI.csv.gz
-
  • Check the workflow dependencies:
dependency(sal)
-
## $export_iris
+
+
    +
  • Check the workflow dependencies:
  • +
+
dependency(sal)
+
+
## $export_iris
 ## [1] ""
 ## 
 ## $gzip
@@ -642,32 +1769,76 @@
 ## 
 ## $iris_stats
 ## [1] "gzip"
-
  • Check the sample comparisons:

Sample comparisons are defined in the header lines of the targets file -starting with ‘# <CMP>.’ This information can be accessed as follows:

targetsheader(sal, step = "Quality")
-
  • Get the workflow steps names:
stepName(sal)
-
## [1] "export_iris" "gzip"        "gunzip"      "iris_stats"
-
  • Get the Sample Id for on particular step:
SampleName(sal, step = "gzip")
-
## [1] "SE" "VE" "VI"
-
SampleName(sal, step = "iris_stats")
-
## This step doesn't contain multiple samples.
-
  • Get the outfiles or targets column files:
getColumn(sal, "outfiles", step = "gzip", column = "gzip_file")
-
##                  SE                  VE                  VI 
+
+
    +
  • Check the sample comparisons:
  • +
+

Sample comparisons are defined in the header lines of the targets file +starting with ‘# <CMP>.’ This information can be accessed as follows:

+
targetsheader(sal, step = "Quality")
+
+
    +
  • Get the workflow steps names:
  • +
+
stepName(sal)
+
+
## [1] "export_iris" "gzip"        "gunzip"      "iris_stats"
+
+
    +
  • Get the Sample Id for on particular step:
  • +
+
SampleName(sal, step = "gzip")
+
+
## [1] "SE" "VE" "VI"
+
+
SampleName(sal, step = "iris_stats")
+
+
## This step doesn't contain multiple samples.
+
+
    +
  • Get the outfiles or targets column files:
  • +
+
getColumn(sal, "outfiles", step = "gzip", column = "gzip_file")
+
+
##                  SE                  VE                  VI 
 ## "results/SE.csv.gz" "results/VE.csv.gz" "results/VI.csv.gz"
-
getColumn(sal, "targetsWF", step = "gzip", column = "FileName")
-
##                       SE                       VE                       VI 
+
+
getColumn(sal, "targetsWF", step = "gzip", column = "FileName")
+
+
##                       SE                       VE                       VI 
 ##     "results/setosa.csv" "results/versicolor.csv"  "results/virginica.csv"
-
  • Get the R code for a LineWise step:
codeLine(sal, step = "export_iris")
-
## export_iris
+
+
    +
  • Get the R code for a LineWise step:
  • +
+
codeLine(sal, step = "export_iris")
+
+
## export_iris
 ##     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", paste0(names(split(iris, factor(iris$Species))), ".csv")))
-
  • View all the objects in the running environment:
viewEnvir(sal)
-
## <environment: 0x55bbae3bc680>
+
+
    +
  • View all the objects in the running environment:
  • +
+
viewEnvir(sal)
+
+
## <environment: 0x55bbae3bc680>
 ## character(0)
-
  • Copy one or multiple objects from the running environment to a new environment:
copyEnvir(sal, list = c("plot"), new.env = globalenv(), silent = FALSE)
-
## <environment: 0x55bbae3bc680>
+
+
    +
  • Copy one or multiple objects from the running environment to a new environment:
  • +
+
copyEnvir(sal, list = c("plot"), new.env = globalenv(), silent = FALSE)
+
+
## <environment: 0x55bbae3bc680>
 ## Copying to 'new.env': 
 ## plot
-
  • Accessing the *.yml data
yamlinput(sal, step = "gzip")
-
## $file
+
+
    +
  • Accessing the *.yml data
  • +
+
yamlinput(sal, step = "gzip")
+
+
## $file
 ## $file$class
 ## [1] "File"
 ## 
@@ -687,13 +1858,21 @@
 ## 
 ## $results_path$path
 ## [1] "./results"
-

Subsetting the workflow details

  • The SYSargsList class and its subsetting operator [:
sal[1]
-
## Instance of 'SYSargsList': 
+
+

Subsetting the workflow details

+
    +
  • The SYSargsList class and its subsetting operator [:
  • +
+
sal[1]
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ## 
-
sal[1:3]
-
## Instance of 'SYSargsList': 
+
+
sal[1:3]
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gzip --> Status: Pending 
@@ -705,8 +1884,10 @@
 ##          3.1. gunzip
 ##              cmdlist: 3 | Pending: 3
 ## 
-
sal[c(1, 3)]
-
## Instance of 'SYSargsList': 
+
+
sal[c(1, 3)]
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gunzip --> Status: Pending 
@@ -714,9 +1895,14 @@
 ##          2.1. gunzip
 ##              cmdlist: 3 | Pending: 3
 ## 
-
  • The SYSargsList class and its subsetting by steps and input samples:
sal_sub <- subset(sal, subset_steps = c(2, 3), input_targets = ("SE"), keep_steps = TRUE)
+
+
    +
  • The SYSargsList class and its subsetting by steps and input samples:
  • +
+
sal_sub <- subset(sal, subset_steps = c(2, 3), input_targets = ("SE"), keep_steps = TRUE)
 stepsWF(sal_sub)
-
## $export_iris
+
+
## $export_iris
 ## Instance of 'LineWise'
 ##     Code Chunk length: 1
 ## 
@@ -749,8 +1935,10 @@
 ## $iris_stats
 ## Instance of 'LineWise'
 ##     Code Chunk length: 5
-
targetsWF(sal_sub)
-
## $export_iris
+
+
targetsWF(sal_sub)
+
+
## $export_iris
 ## DataFrame with 0 rows and 0 columns
 ## 
 ## $gzip
@@ -767,8 +1955,10 @@
 ## 
 ## $iris_stats
 ## DataFrame with 0 rows and 0 columns
-
outfiles(sal_sub)
-
## $export_iris
+
+
outfiles(sal_sub)
+
+
## $export_iris
 ## DataFrame with 0 rows and 0 columns
 ## 
 ## $gzip
@@ -785,11 +1975,21 @@
 ## 
 ## $iris_stats
 ## DataFrame with 0 rows and 0 columns
-
  • The SYSargsList class and its operator +
sal[1] + sal[2] + sal[3]
-

Replacement Methods

  • Update a input parameter in the workflow
sal_c <- sal
+
+
    +
  • The SYSargsList class and its operator +
  • +
+
sal[1] + sal[2] + sal[3]
+
+

Replacement Methods

+
    +
  • Update a input parameter in the workflow
  • +
+
sal_c <- sal
 ## check values
 yamlinput(sal_c, step = "gzip")
-
## $file
+
+
## $file
 ## $file$class
 ## [1] "File"
 ## 
@@ -809,18 +2009,22 @@
 ## 
 ## $results_path$path
 ## [1] "./results"
-
## check on command-line
+
+
## check on command-line
 cmdlist(sal_c, step = "gzip", targets = 1)
-
## $gzip
+
+
## $gzip
 ## $gzip$SE
 ## $gzip$SE$gzip
 ## [1] "gzip -c  results/setosa.csv > results/SE.csv.gz"
-
## Replace
+
+
## Replace
 yamlinput(sal_c, step = "gzip", paramName = "ext") <- "txt.gz"
 
 ## check NEW values
 yamlinput(sal_c, step = "gzip")
-
## $file
+
+
## $file
 ## $file$class
 ## [1] "File"
 ## 
@@ -840,28 +2044,43 @@
 ## 
 ## $results_path$path
 ## [1] "./results"
-
## Check on command-line
+
+
## Check on command-line
 cmdlist(sal_c, step = "gzip", targets = 1)
-
## $gzip
+
+
## $gzip
 ## $gzip$SE
 ## $gzip$SE$gzip
 ## [1] "gzip -c  results/setosa.csv > results/SE.txt.gz"
-
  • Append and Replacement methods for R Code Steps
appendCodeLine(sal_c, step = "export_iris", after = 1) <- "log_cal_100 <- log(100)"
+
+
    +
  • Append and Replacement methods for R Code Steps
  • +
+
appendCodeLine(sal_c, step = "export_iris", after = 1) <- "log_cal_100 <- log(100)"
 codeLine(sal_c, step = "export_iris")
-
## export_iris
+
+
## export_iris
 ##     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", paste0(names(split(iris, factor(iris$Species))), ".csv")))
 ##     log_cal_100 <- log(100)
-
replaceCodeLine(sal_c, step = "export_iris", line = 2) <- LineWise(code = {
+
+
replaceCodeLine(sal_c, step = "export_iris", line = 2) <- LineWise(code = {
     log_cal_100 <- log(50)
 })
 codeLine(sal_c, step = 1)
-
## export_iris
+
+
## export_iris
 ##     mapply(function(x, y) write.csv(x, y), split(iris, factor(iris$Species)), file.path("results", paste0(names(split(iris, factor(iris$Species))), ".csv")))
 ##     3.91202300542815
-

For more details about the LineWise class, please see below.

  • Rename a Step
renameStep(sal_c, step = 1) <- "newStep"
+
+

For more details about the LineWise class, please see below.

+
    +
  • Rename a Step
  • +
+
renameStep(sal_c, step = 1) <- "newStep"
 renameStep(sal_c, c(1, 2)) <- c("newStep2", "newIndex")
 sal_c
-
## Instance of 'SYSargsList': 
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. newStep2 --> Status: Pending
 ##        2. newIndex --> Status: Pending 
@@ -874,12 +2093,18 @@
 ##              cmdlist: 3 | Pending: 3
 ##        4. iris_stats --> Status: Pending
 ## 
-
names(outfiles(sal_c))
-
## [1] "newStep2"   "newIndex"   "gunzip"     "iris_stats"
-
names(targetsWF(sal_c))
-
## [1] "newStep2"   "newIndex"   "gunzip"     "iris_stats"
-
dependency(sal_c)
-
## $newStep2
+
+
names(outfiles(sal_c))
+
+
## [1] "newStep2"   "newIndex"   "gunzip"     "iris_stats"
+
+
names(targetsWF(sal_c))
+
+
## [1] "newStep2"   "newIndex"   "gunzip"     "iris_stats"
+
+
dependency(sal_c)
+
+
## $newStep2
 ## [1] ""
 ## 
 ## $newIndex
@@ -890,13 +2115,23 @@
 ## 
 ## $iris_stats
 ## [1] "newIndex"
-
  • Replace a Step
sal_test <- sal[c(1, 2)]
+
+
    +
  • Replace a Step
  • +
+
sal_test <- sal[c(1, 2)]
 replaceStep(sal_test, step = 1, step_name = "gunzip") <- sal[3]
 sal_test
-

Note: Please use this method with attention, because it can disrupt all -the dependency graphs.

  • Removing a Step
sal_test <- sal[-2]
+
+

Note: Please use this method with attention, because it can disrupt all +the dependency graphs.

+
    +
  • Removing a Step
  • +
+
sal_test <- sal[-2]
 sal_test
-
## Instance of 'SYSargsList': 
+
+
## Instance of 'SYSargsList': 
 ##     WF Steps:
 ##        1. export_iris --> Status: Pending
 ##        2. gunzip --> Status: Pending 
@@ -905,9 +2140,105 @@
 ##              cmdlist: 3 | Pending: 3
 ##        3. iris_stats --> Status: Pending
 ## 
-

References

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/sprinstall/index.html b/public/sp/spr/sprinstall/index.html index 63f1e5d82..9292d0185 100644 --- a/public/sp/spr/sprinstall/index.html +++ b/public/sp/spr/sprinstall/index.html @@ -1,78 +1,1334 @@ -SPR detailed installation instructions | sysPipe

SPR detailed installation instructions

systemPipeR Installation

To install the systemPipeR package (H Backman and Girke 2016), please use the BiocManager::install command:

if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
+
+
+  
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SPR detailed installation instructions | sysPipe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

SPR detailed installation instructions

+ + + + + + + + +

systemPipeR Installation

+

To install the systemPipeR package (H Backman and Girke 2016), please use +the BiocManager::install command:

+
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
 BiocManager::install("systemPipeR")
-

To obtain the most recent updates immediately, one can install it directly from -github as follow:

if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
-BiocManager::install("tgirke/systemPipeR", build_vignettes = TRUE,
-    dependencies = TRUE)
-

Third-party software tools in SPR

This guide provides detailed installation instructions for the software tools used within systemPipeR package. This guide provides the instruction for a Linux system.

BWA

Burrow-Wheeler Aligner (BWA) for short-read alignment (Li 2013).

git clone https://github.com/lh3/bwa.git
-cd bwa
-make
-vim ~/.bashrc ## Open the Bash shell script
-export PATH=$PATH:/path/to/bwa ## "/path/to/bwa" is an example! Replace with real PATH
-source ~/.bashrc
-bwa ## Test if the installation was successful
-

Note: In some systems, ~/.bash_profile is used in place of ~/.bashrc.

More information about how to set an enviroment variable here.

BLAST

Please check the BLAST Command Line Applications User Manual to -find the installation introduction for your system environment.

Download the latest version from here, as the following example:

wget https://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/ncbi-blast-2.11.0+-x64-linux.tar.gz
-tar zxvpf ncbi-blast-2.11.0+-x64-linux.tar.gz ncbi-blast-2.11.0+/
-cd ncbi-blast-2.11.0+/
-export PATH=$PATH:/path/to//ncbi-blast-2.11.0+/bin ## "/path/to/ncbi-blast-2.11.0+" is an example! Replace with real PATH
-

Cutadapt

Please check the Cutadapt Manual to -find the installation introduction for your system environment.

sudo apt install cutadapt
-

References

H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.

Li, Heng. 2013. “Aligning Sequence Reads, Clone Sequences and Assembly Contigs with BWA-MEM,” March. http://arxiv.org/abs/1303.3997.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/steps/index.html b/public/sp/spr/steps/index.html index 298dae44a..63ec64a8e 100644 --- a/public/sp/spr/steps/index.html +++ b/public/sp/spr/steps/index.html @@ -1,53 +1,970 @@ -Workflow steps overview | sysPipe

Workflow steps overview

Define environment settings and samples

A typical workflow starts with generating the expected working environment + + + + + + + + + + + + + + + + + + + +Workflow steps overview | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Workflow steps overview

+ + + + + +

Define environment settings and samples

+

A typical workflow starts with generating the expected working environment containing the proper directory structure, input files, and parameter settings. To simplify this task, one can load one of the existing NGS workflows templates provided by systemPipeRdata into the current working directory. The @@ -56,15 +973,19 @@ default NULL uses the name of the chosen workflow. An error is issued if a directory of the same name and path exists already. On Linux and OS X systems one can also create new workflow instances from the command-line of a terminal as shown -here. +here. To apply workflows to custom data, the user needs to modify the targets file and if necessary update the corresponding .cwl and .yml files. A collection of pre-generated .cwl and .yml files are provided in the param/cwl subdirectory of each workflow template. They -are also viewable in the GitHub repository of systemPipeRdata (see -here).

library(systemPipeR)
+are also viewable in the GitHub repository of systemPipeRdata (see
+here).

+
library(systemPipeR)
 library(systemPipeRdata)
 genWorkenvir(workflow = "rnaseq", mydirname = NULL)
 setwd("rnaseq")
-

Read Preprocessing

Preprocessing with preprocessReads function

The function preprocessReads allows to apply predefined or custom +

+

Read Preprocessing

+

Preprocessing with preprocessReads function

+

The function preprocessReads allows to apply predefined or custom read preprocessing functions to all FASTQ files referenced in a SYSargs2 container, such as quality filtering or adaptor trimming routines. The paths to the resulting output FASTQ files are stored in the @@ -77,7 +998,9 @@ targets_trimPE.txt) containing the paths to the trimmed FASTQ files. The new targets file can be used for the next workflow step with an updated SYSargs2 instance, e.g. running the NGS alignments with the -trimmed FASTQ files.

Construct SYSargs2 object from cwl and yml param and targets files.

targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+trimmed FASTQ files.

+

Construct SYSargs2 object from cwl and yml param and targets files.

+
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/preprocessReads/trim-pe", package = "systemPipeR")
 trim <- loadWorkflow(targets = targetsPE, wf_file = "trim-pe.cwl", input_file = "trim-pe.yml",
     dir_path = dir_path)
@@ -85,21 +1008,27 @@
     SampleName = "_SampleName_"))
 trim
 output(trim)[1:2]
-
preprocessReads(args = trim, Fct = "trimLRPatterns(Rpattern='GCCCGGGTAA',
+
+
preprocessReads(args = trim, Fct = "trimLRPatterns(Rpattern='GCCCGGGTAA', 
                 subject=fq)",
     batchsize = 1e+05, overwrite = TRUE, compress = TRUE)
-

The following example shows how one can design a custom read preprocessing function +

+

The following example shows how one can design a custom read preprocessing function using utilities provided by the ShortRead package, and then run it -in batch mode with the ‘preprocessReads’ function (here on paired-end reads).

filterFct <- function(fq, cutoff = 20, Nexceptions = 0) {
+in batch mode with the ‘preprocessReads’ function (here on paired-end reads).

+
filterFct <- function(fq, cutoff = 20, Nexceptions = 0) {
     qcount <- rowSums(as(quality(fq), "matrix") <= cutoff, na.rm = TRUE)
     # Retains reads where Phred scores are >= cutoff with N exceptions
     fq[qcount <= Nexceptions]
 }
 preprocessReads(args = trim, Fct = "filterFct(fq, cutoff=20, Nexceptions=0)", batchsize = 1e+05)
-

Preprocessing with TrimGalore!

TrimGalore! is +

+

Preprocessing with TrimGalore!

+

TrimGalore! is a wrapper tool to consistently apply quality and adapter trimming to fastq files, with some extra functionality for removing Reduced Representation Bisulfite-Seq -(RRBS) libraries.

targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
+(RRBS) libraries.

+
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/trim_galore/trim_galore-se", package = "systemPipeR")
 trimG <- loadWorkflow(targets = targets, wf_file = "trim_galore-se.cwl", input_file = "trim_galore-se.yml",
     dir_path = dir_path)
@@ -109,7 +1038,9 @@
 output(trimG)[1:2]
 ## Run Single Machine Option
 trimG <- runCommandline(trimG[1], make_bam = FALSE)
-

Preprocessing with Trimmomatic

targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+
+

Preprocessing with Trimmomatic

+
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/trimmomatic/trimmomatic-pe", package = "systemPipeR")
 trimM <- loadWorkflow(targets = targetsPE, wf_file = "trimmomatic-pe.cwl", input_file = "trimmomatic-pe.yml",
     dir_path = dir_path)
@@ -120,23 +1051,37 @@
 output(trimM)[1:2]
 ## Run Single Machine Option
 trimM <- runCommandline(trimM[1], make_bam = FALSE)
-

FASTQ quality report

The following seeFastq and seeFastqPlot functions generate and plot a series of +

+

FASTQ quality report

+

The following seeFastq and seeFastqPlot functions generate and plot a series of useful quality statistics for a set of FASTQ files including per cycle quality box plots, base proportions, base-level quality trends, relative k-mer diversity, length and occurrence distribution of reads, number of reads above -quality cutoffs and mean quality distribution. +quality cutoffs and mean quality distribution.
The function seeFastq computes the quality statistics and stores the results in a relatively small list object that can be saved to disk with save() and reloaded with load() for later plotting. The argument klength specifies the k-mer length and batchsize the number of reads to a random sample from each -FASTQ file.

fqlist <- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8)
+FASTQ file.

+
fqlist <- seeFastq(fastq = infile1(trim), batchsize = 10000, klength = 8)
 pdf("./results/fastqReport.pdf", height = 18, width = 4 * length(fqlist))
 seeFastqPlot(fqlist)
 dev.off()
-

Figure 5: FASTQ quality report


Parallelization of FASTQ quality report on a single machine with multiple cores.

f <- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8)
+
+
+ +
+
+

Figure 1: FASTQ quality report

+
+
+

Parallelization of FASTQ quality report on a single machine with multiple cores.

+
f <- function(x) seeFastq(fastq = infile1(trim)[x], batchsize = 1e+05, klength = 8)
 fqlist <- bplapply(seq(along = trim), f, BPPARAM = MulticoreParam(workers = 4))
 seeFastqPlot(unlist(fqlist, recursive = FALSE))
-

Parallelization of FASTQ quality report via scheduler (e.g. Slurm) across several compute nodes.

library(BiocParallel)
+
+

Parallelization of FASTQ quality report via scheduler (e.g. Slurm) across several compute nodes.

+
library(BiocParallel)
 library(batchtools)
 f <- function(x) {
     library(systemPipeR)
@@ -153,63 +1098,86 @@
     resources = resources)
 fqlist <- bplapply(seq(along = trim), f, BPPARAM = param)
 seeFastqPlot(unlist(fqlist, recursive = FALSE))
-

NGS Alignment software

After quality control, the sequence reads can be aligned to a reference genome or +

+

NGS Alignment software

+

After quality control, the sequence reads can be aligned to a reference genome or transcriptome database. The following sessions present some NGS sequence alignment software. Select the most accurate aligner and determining the optimal parameter -for your custom data set project.

For all the following examples, it is necessary to install the respective software -and export the PATH accordingly. If it is available Environment Module -in the system, you can load all the request software with moduleload(args) function.

Alignment with HISAT2 using SYSargs2

The following steps will demonstrate how to use the short read aligner Hisat2 +for your custom data set project.

+

For all the following examples, it is necessary to install the respective software +and export the PATH accordingly. If it is available Environment Module +in the system, you can load all the request software with moduleload(args) function.

+

Alignment with HISAT2 using SYSargs2

+

The following steps will demonstrate how to use the short read aligner Hisat2 (Kim, Langmead, and Salzberg 2015) in both interactive job submissions and batch submissions to -queuing systems of clusters using the systemPipeR's new CWL command-line interface.

The parameter settings of the aligner are defined in the hisat2-mapping-se.cwl +queuing systems of clusters using the systemPipeR's new CWL command-line interface.

+

The parameter settings of the aligner are defined in the hisat2-mapping-se.cwl and hisat2-mapping-se.yml files. The following shows how to construct the -corresponding SYSargs2 object, here args.

targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
+corresponding SYSargs2 object, here args.

+
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/hisat2/hisat2-se", package = "systemPipeR")
 args <- loadWorkflow(targets = targets, wf_file = "hisat2-mapping-se.cwl", input_file = "hisat2-mapping-se.yml",
     dir_path = dir_path)
 args <- renderWF(args, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
 args
-
## Instance of 'SYSargs2':
-##    Slot names/accessors:
+
+
## Instance of 'SYSargs2':
+##    Slot names/accessors: 
 ##       targets: 18 (M1A...V12B), targetsheader: 4 (lines)
 ##       modules: 1
-##       wf: 0, clt: 1, yamlinput: 7 (components)
+##       wf: 0, clt: 1, yamlinput: 7 (inputs)
 ##       input: 18, output: 18
 ##       cmdlist: 18
-##    WF Steps:
+##    Sub Steps:
 ##       1. hisat2-mapping-se (rendered: TRUE)
-
cmdlist(args)[1:2]
-
## $M1A
+
+
cmdlist(args)[1:2]
+
+
## $M1A
 ## $M1A$`hisat2-mapping-se`
 ## [1] "hisat2 -S ./results/M1A.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446027_1.fastq.gz --threads 4"
-##
-##
+## 
+## 
 ## $M1B
 ## $M1B$`hisat2-mapping-se`
 ## [1] "hisat2 -S ./results/M1B.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446028_1.fastq.gz --threads 4"
-
output(args)[1:2]
-
## $M1A
+
+
output(args)[1:2]
+
+
## $M1A
 ## $M1A$`hisat2-mapping-se`
 ## [1] "./results/M1A.sam"
-##
-##
+## 
+## 
 ## $M1B
 ## $M1B$`hisat2-mapping-se`
 ## [1] "./results/M1B.sam"
-

Subsetting SYSargs2 class slots for each workflow step.

subsetWF(args, slot = "input", subset = "FileName")[1:2]  ## Subsetting the input files for this particular workflow
-
##                           M1A                           M1B
+
+

Subsetting SYSargs2 class slots for each workflow step.

+
subsetWF(args, slot = "input", subset = "FileName")[1:2]  ## Subsetting the input files for this particular workflow 
+
+
##                           M1A                           M1B 
 ## "./data/SRR446027_1.fastq.gz" "./data/SRR446028_1.fastq.gz"
-
subsetWF(args, slot = "output", subset = 1, index = 1)[1:2]  ## Subsetting the output files for one particular step in the workflow
-
##                 M1A                 M1B
+
+
subsetWF(args, slot = "output", subset = 1, index = 1)[1:2]  ## Subsetting the output files for one particular step in the workflow 
+
+
##                 M1A                 M1B 
 ## "./results/M1A.sam" "./results/M1B.sam"
-
subsetWF(args, slot = "step", subset = 1)[1]  ## Subsetting the command-lines for one particular step in the workflow
-
##                                                                                                                                               M1A
+
+
subsetWF(args, slot = "step", subset = 1)[1]  ## Subsetting the command-lines for one particular step in the workflow 
+
+
##                                                                                                                                               M1A 
 ## "hisat2 -S ./results/M1A.sam  -x ./data/tair10.fasta  -k 1  --min-intronlen 30  --max-intronlen 3000  -U ./data/SRR446027_1.fastq.gz --threads 4"
-
subsetWF(args, slot = "output", subset = 1, index = 1, delete = TRUE)[1]  ## DELETING specific output files
-
## The subset cannot be deleted: no such file
+
+
subsetWF(args, slot = "output", subset = 1, index = 1, delete = TRUE)[1]  ## DELETING specific output files
+
+
## The subset cannot be deleted: no such file
 
-##                 M1A
+##                 M1A 
 ## "./results/M1A.sam"
-

Build Hisat2 index.

dir_path <- system.file("extdata/cwl/hisat2/hisat2-idx", package = "systemPipeR")
+
+

Build Hisat2 index.

+
dir_path <- system.file("extdata/cwl/hisat2/hisat2-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "hisat2-index.cwl", input_file = "hisat2-index.yml",
     dir_path = dir_path)
 idx <- renderWF(idx)
@@ -218,7 +1186,9 @@
 
 ## Run
 runCommandline(idx, make_bam = FALSE)
-

Interactive job submissions in a single machine

To simplify the short read alignment execution for the user, the command-line +

+

Interactive job submissions in a single machine

+

To simplify the short read alignment execution for the user, the command-line can be run with the runCommandline function. The execution will be on a single machine without submitting to a queuing system of a computer cluster. This way, the input FASTQ files will be processed sequentially. @@ -228,15 +1198,20 @@ results folder for each workflow and a sub-folder for each sample defined in the targets file. This includes all the output and log files for each step. When these options are used, the output location will be updated by default -and can be assigned to the same object.

runCommandline(args, make_bam = FALSE)  ## generates alignments and writes *.sam files to ./results folder
+and can be assigned to the same object.

+
runCommandline(args, make_bam = FALSE)  ## generates alignments and writes *.sam files to ./results folder 
 args <- runCommandline(args, make_bam = TRUE)  ## same as above but writes files and converts *.sam files to sorted and indexed BAM files. Assigning the new extention of the output files to the object args.
-

If available, multiple CPU cores can be used for processing each file. The number +

+

If available, multiple CPU cores can be used for processing each file. The number of CPU cores (here 4) to use for each process is defined in the *.yml file. -With yamlinput(args)['thread'] one can return this value from the SYSargs2 object.

Parallelization on clusters

Alternatively, the computation can be greatly accelerated by processing many files +With yamlinput(args)['thread'] one can return this value from the SYSargs2 object.

+

Parallelization on clusters

+

Alternatively, the computation can be greatly accelerated by processing many files in parallel using several compute nodes of a cluster, where a scheduling/queuing system is used for load balancing. For this the clusterRun function submits the computing requests to the scheduler using the run specifications -defined by runCommandline.

To avoid over-subscription of CPU cores on the compute nodes, the value from +defined by runCommandline.

+

To avoid over-subscription of CPU cores on the compute nodes, the value from yamlinput(args)['thread'] is passed on to the submission command, here ncpus in the resources list object. The number of independent parallel cluster processes is defined under the Njobs argument. The following example will run @@ -246,24 +1221,33 @@ with most queueing systems as it is based on utilities from the batchtools package which supports the use of template files (*.tmpl) for defining the run parameters of different schedulers. To run the following code, one needs to -have both a conf file (see .batchtools.conf.R samples here) -and a template file (see *.tmpl samples here) +have both a conf file (see .batchtools.conf.R samples here) +and a template file (see *.tmpl samples here) for the queueing available on a system. The following example uses the sample -conf and template files for the Slurm scheduler provided by this package.

library(batchtools)
+conf and template files for the Slurm scheduler provided by this package.

+
library(batchtools)
 resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
 reg <- clusterRun(args, FUN = runCommandline, more.args = list(args = args, make_bam = TRUE,
     dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
     Njobs = 18, runid = "01", resourceList = resources)
 getStatus(reg = reg)
 waitForJobs(reg = reg)
-

Check and update the output location if necessary.

args <- output_update(args, dir = FALSE, replace = TRUE, extension = c(".sam", ".bam"))  ## Updates the output(args) to the right location in the subfolders
+
+

Check and update the output location if necessary.

+
args <- output_update(args, dir = FALSE, replace = TRUE, extension = c(".sam", ".bam"))  ## Updates the output(args) to the right location in the subfolders
 output(args)
-

Create new targets file

To establish the connectivity to the next workflow step, one can write a new +

+

Create new targets file

+

To establish the connectivity to the next workflow step, one can write a new targets file with the writeTargetsout function. The new targets file -serves as input to the next loadWorkflow and renderWF call.

names(clt(args))
+serves as input to the next loadWorkflow and renderWF call.

+
names(clt(args))
 writeTargetsout(x = args, file = "default", step = 1, new_col = "FileName", new_col_output_index = 1,
     overwrite = TRUE)
-

Alignment with HISAT2 and SAMtools

Alternatively, it possible to build an workflow with HISAT2 and SAMtools.

targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
+
+

Alignment with HISAT2 and SAMtools

+

Alternatively, it possible to build an workflow with HISAT2 and SAMtools.

+
targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/workflow-hisat2/workflow-hisat2-se", package = "systemPipeR")
 WF <- loadWorkflow(targets = targets, wf_file = "workflow_hisat2-se.cwl", input_file = "workflow_hisat2-se.yml",
     dir_path = dir_path)
@@ -271,8 +1255,12 @@
 WF
 cmdlist(WF)[1:2]
 output(WF)[1:2]
-

Alignment with Tophat2

The NGS reads of this project can also be aligned against the reference genome -sequence using Bowtie2/TopHat2 (Kim et al. 2013; Langmead and Salzberg 2012).

Build Bowtie2 index.

dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
+
+

Alignment with Tophat2

+

The NGS reads of this project can also be aligned against the reference genome +sequence using Bowtie2/TopHat2 (Kim et al. 2013; Langmead and Salzberg 2012).

+

Build Bowtie2 index.

+
dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "bowtie2-index.cwl", input_file = "bowtie2-index.yml",
     dir_path = dir_path)
 idx <- renderWF(idx)
@@ -281,9 +1269,11 @@
 
 ## Run in single machine
 runCommandline(idx, make_bam = FALSE)
-

The parameter settings of the aligner are defined in the tophat2-mapping-pe.cwl +

+

The parameter settings of the aligner are defined in the tophat2-mapping-pe.cwl and tophat2-mapping-pe.yml files. The following shows how to construct the -corresponding SYSargs2 object, here tophat2PE.

targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+corresponding SYSargs2 object, here tophat2PE.

+
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/tophat2/tophat2-pe", package = "systemPipeR")
 tophat2PE <- loadWorkflow(targets = targetsPE, wf_file = "tophat2-mapping-pe.cwl",
     input_file = "tophat2-mapping-pe.yml", dir_path = dir_path)
@@ -295,15 +1285,23 @@
 
 ## Run in single machine
 tophat2PE <- runCommandline(tophat2PE[1], make_bam = TRUE)
-

Parallelization on clusters.

resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
+
+

Parallelization on clusters.

+
resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
 reg <- clusterRun(tophat2PE, FUN = runCommandline, more.args = list(args = tophat2PE,
     make_bam = TRUE, dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
     Njobs = 18, runid = "01", resourceList = resources)
 waitForJobs(reg = reg)
-

Create new targets file

names(clt(tophat2PE))
+
+

Create new targets file

+
names(clt(tophat2PE))
 writeTargetsout(x = tophat2PE, file = "default", step = 1, new_col = "tophat2PE",
     new_col_output_index = 1, overwrite = TRUE)
-

Alignment with Bowtie2 (e.g. for miRNA profiling)

The following example runs Bowtie2 as a single process without submitting it to a cluster.

Building the index:

dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
+
+

Alignment with Bowtie2 (e.g. for miRNA profiling)

+

The following example runs Bowtie2 as a single process without submitting it to a cluster.

+

Building the index:

+
dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "bowtie2-index.cwl", input_file = "bowtie2-index.yml",
     dir_path = dir_path)
 idx <- renderWF(idx)
@@ -312,7 +1310,9 @@
 
 ## Run in single machine
 runCommandline(idx, make_bam = FALSE)
-

Building all the command-line:

targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+
+

Building all the command-line:

+
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/bowtie2/bowtie2-pe", package = "systemPipeR")
 bowtiePE <- loadWorkflow(targets = targetsPE, wf_file = "bowtie2-mapping-pe.cwl",
     input_file = "bowtie2-mapping-pe.yml", dir_path = dir_path)
@@ -321,16 +1321,26 @@
 bowtiePE
 cmdlist(bowtiePE)[1:2]
 output(bowtiePE)[1:2]
-

Running all the jobs to computing nodes.

resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
+
+

Running all the jobs to computing nodes.

+
resources <- list(walltime = 120, ntasks = 1, ncpus = 4, memory = 1024)
 reg <- clusterRun(bowtiePE, FUN = runCommandline, more.args = list(args = bowtiePE,
     dir = FALSE), conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl",
     Njobs = 18, runid = "01", resourceList = resources)
 getStatus(reg = reg)
-

Alternatively, it possible to run all the jobs in a single machine.

bowtiePE <- runCommandline(bowtiePE)
-

Create new targets file.

names(clt(bowtiePE))
+
+

Alternatively, it possible to run all the jobs in a single machine.

+
bowtiePE <- runCommandline(bowtiePE)
+
+

Create new targets file.

+
names(clt(bowtiePE))
 writeTargetsout(x = bowtiePE, file = "default", step = 1, new_col = "bowtiePE", new_col_output_index = 1,
     overwrite = TRUE)
-

Alignment with BWA-MEM (e.g. for VAR-Seq)

The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference

Build the index:

dir_path <- system.file("extdata/cwl/bwa/bwa-idx", package = "systemPipeR")
+
+

Alignment with BWA-MEM (e.g. for VAR-Seq)

+

The following example runs BWA-MEM as a single process without submitting it to a cluster. ##TODO: add reference

+

Build the index:

+
dir_path <- system.file("extdata/cwl/bwa/bwa-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "bwa-index.cwl", input_file = "bwa-index.yml",
     dir_path = dir_path)
 idx <- renderWF(idx)
@@ -339,7 +1349,9 @@
 
 ## Run
 runCommandline(idx, make_bam = FALSE)
-

Running the alignment:

targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
+
+

Running the alignment:

+
targetsPE <- system.file("extdata", "targetsPE.txt", package = "systemPipeR")
 dir_path <- system.file("extdata/cwl/bwa/bwa-pe", package = "systemPipeR")
 bwaPE <- loadWorkflow(targets = targetsPE, wf_file = "bwa-pe.cwl", input_file = "bwa-pe.yml",
     dir_path = dir_path)
@@ -358,10 +1370,15 @@
     conffile = ".batchtools.conf.R", template = "batchtools.slurm.tmpl", Njobs = 18,
     runid = "01", resourceList = resources)
 getStatus(reg = reg)
-

Create new targets file.

names(clt(bwaPE))
+
+

Create new targets file.

+
names(clt(bwaPE))
 writeTargetsout(x = bwaPE, file = "default", step = 1, new_col = "bwaPE", new_col_output_index = 1,
     overwrite = TRUE)
-

Alignment with Rsubread (e.g. for RNA-Seq)

The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.

## Build the index:
+
+

Alignment with Rsubread (e.g. for RNA-Seq)

+

The following example shows how one can use within the environment the R-based aligner , allowing running from R or command-line.

+
## Build the index:
 dir_path <- system.file("extdata/cwl/rsubread/rsubread-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "rsubread-index.cwl", input_file = "rsubread-index.yml",
     dir_path = dir_path)
@@ -381,11 +1398,16 @@
 
 ## Single Machine
 rsubread <- runCommandline(args = rsubread[1])
-

Create new targets file.

names(clt(rsubread))
+
+

Create new targets file.

+
names(clt(rsubread))
 writeTargetsout(x = rsubread, file = "default", step = 1, new_col = "rsubread", new_col_output_index = 1,
     overwrite = TRUE)
-

Alignment with gsnap (e.g. for VAR-Seq and RNA-Seq)

Another R-based short read aligner is gsnap from the gmapR package (Wu and Nacu 2010). -The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.

## Build the index:
+
+

Alignment with gsnap (e.g. for VAR-Seq and RNA-Seq)

+

Another R-based short read aligner is gsnap from the gmapR package (Wu and Nacu 2010). +The code sample below introduces how to run this aligner on multiple nodes of a compute cluster.

+
## Build the index:
 dir_path <- system.file("extdata/cwl/gsnap/gsnap-idx", package = "systemPipeR")
 idx <- loadWorkflow(targets = NULL, wf_file = "gsnap-index.cwl", input_file = "gsnap-index.yml",
     dir_path = dir_path)
@@ -414,16 +1436,26 @@
 getStatus(reg = reg)
 gsnap <- output_update(gsnap, dir = FALSE, replace = TRUE, extension = c(".sam",
     ".bam"))
-

Create new targets file.

names(clt(gsnap))
+
+

Create new targets file.

+
names(clt(gsnap))
 writeTargetsout(x = gsnap, file = "default", step = 1, new_col = "gsnap", new_col_output_index = 1,
     overwrite = TRUE)
-

The genome browser IGV supports reading of indexed/sorted BAM files via web URLs. This way it can be avoided to create unnecessary copies of these large files. To enable this approach, an HTML directory with Http access needs to be available in the user account (e.g. home/publichtml) of a system. If this is not the case then the BAM files need to be moved or copied to the system where IGV runs. In the following, htmldir defines the path to the HTML directory with http access where the symbolic links to the BAM files will be stored. The corresponding URLs will be written to a text file specified under the _urlfile_ argument.

symLink2bam(sysargs = args, htmldir = c("~/.html/", "somedir/"), urlbase = "http://myserver.edu/~username/",
+
+ +

The genome browser IGV supports reading of indexed/sorted BAM files via web URLs. This way it can be avoided to create unnecessary copies of these large files. To enable this approach, an HTML directory with Http access needs to be available in the user account (e.g. home/publichtml) of a system. If this is not the case then the BAM files need to be moved or copied to the system where IGV runs. In the following, htmldir defines the path to the HTML directory with http access where the symbolic links to the BAM files will be stored. The corresponding URLs will be written to a text file specified under the _urlfile_ argument.

+
symLink2bam(sysargs = args, htmldir = c("~/.html/", "somedir/"), urlbase = "http://myserver.edu/~username/",
     urlfile = "IGVurl.txt")
-

Read counting for mRNA profiling experiments

Create txdb (needs to be done only once).

library(GenomicFeatures)
+
+

Read counting for mRNA profiling experiments

+

Create txdb (needs to be done only once).

+
library(GenomicFeatures)
 txdb <- makeTxDbFromGFF(file = "data/tair10.gff", format = "gff", dataSource = "TAIR",
     organism = "Arabidopsis thaliana")
 saveDb(txdb, file = "./data/tair10.sqlite")
-

The following performs read counting with summarizeOverlaps in parallel mode with multiple cores.

library(BiocParallel)
+
+

The following performs read counting with summarizeOverlaps in parallel mode with multiple cores.

+
library(BiocParallel)
 txdb <- loadDb("./data/tair10.sqlite")
 eByg <- exonsBy(txdb, by = "gene")
 outpaths <- subsetWF(args, slot = "output", subset = 1, index = 1)
@@ -434,8 +1466,8 @@
 counteByg <- bplapply(bfl, function(x) summarizeOverlaps(eByg, x, mode = "Union",
     ignore.strand = TRUE, inter.feature = TRUE, singleEnd = TRUE))
 
-# Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data set
-# 'singleEnd=FALSE'
+# Note: for strand-specific RNA-Seq set 'ignore.strand=FALSE' and for PE data
+# set 'singleEnd=FALSE'
 countDFeByg <- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts)
 rownames(countDFeByg) <- names(rowRanges(counteByg[[1]]))
 colnames(countDFeByg) <- names(bfl)
@@ -444,7 +1476,10 @@
     sep = "\t")
 write.table(rpkmDFeByg, "results/rpkmDFeByg.xls", col.names = NA, quote = FALSE,
     sep = "\t")
-

Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as edgeR or DESeq2, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, e.g. manually comparing the expression levels of different genes or features.

Read counting with summarizeOverlaps using multiple nodes of a cluster.

library(BiocParallel)
+
+

Please note, in addition to read counts this step generates RPKM normalized expression values. For most statistical differential expression or abundance analysis methods, such as edgeR or DESeq2, the raw count values should be used as input. The usage of RPKM values should be restricted to specialty applications required by some users, e.g. manually comparing the expression levels of different genes or features.

+

Read counting with summarizeOverlaps using multiple nodes of a cluster.

+
library(BiocParallel)
 f <- function(x) {
     library(systemPipeR)
     library(BiocParallel)
@@ -464,32 +1499,44 @@
 countDFeByg <- sapply(seq(along = counteByg), function(x) assays(counteByg[[x]])$counts)
 rownames(countDFeByg) <- names(rowRanges(counteByg[[1]]))
 colnames(countDFeByg) <- names(outpaths)
-

Useful commands for monitoring the progress of submitted jobs

getStatus(reg = reg)
+
+

Useful commands for monitoring the progress of submitted jobs

+
getStatus(reg = reg)
 outpaths <- subsetWF(args, slot = "output", subset = 1, index = 1)
 file.exists(outpaths)
 sapply(1:length(outpaths), function(x) loadResult(reg, id = x))  # Works after job completion
-

Read and alignment count stats

Generate a table of read and alignment counts for all samples.

read_statsDF <- alignStats(args)
+
+

Read and alignment count stats

+

Generate a table of read and alignment counts for all samples.

+
read_statsDF <- alignStats(args)
 write.table(read_statsDF, "results/alignStats.xls", row.names = FALSE, quote = FALSE,
     sep = "\t")
-

The following shows the first four lines of the sample alignment stats file +

+

The following shows the first four lines of the sample alignment stats file provided by the systemPipeR package. For simplicity the number of PE reads is multiplied here by 2 to approximate proper alignment frequencies where each -read in a pair is counted.

read.table(system.file("extdata", "alignStats.xls", package = "systemPipeR"), header = TRUE)[1:4,
+read in a pair is counted.

+
read.table(system.file("extdata", "alignStats.xls", package = "systemPipeR"), header = TRUE)[1:4,
     ]
-
##   FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary
+
+
##   FileName Nreads2x Nalign Perc_Aligned Nalign_Primary Perc_Aligned_Primary
 ## 1      M1A   192918 177961     92.24697         177961             92.24697
 ## 2      M1B   197484 159378     80.70426         159378             80.70426
 ## 3      A1A   189870 176055     92.72397         176055             92.72397
 ## 4      A1B   188854 147768     78.24457         147768             78.24457
-

Parallelization of read/alignment stats on single machine with multiple cores.

f <- function(x) alignStats(args[x])
+
+

Parallelization of read/alignment stats on single machine with multiple cores.

+
f <- function(x) alignStats(args[x])
 read_statsList <- bplapply(seq(along = args), f, BPPARAM = MulticoreParam(workers = 8))
 read_statsDF <- do.call("rbind", read_statsList)
-

Parallelization of read/alignment stats via scheduler (e.g. Slurm) across several compute nodes.

library(BiocParallel)
+
+

Parallelization of read/alignment stats via scheduler (e.g. Slurm) across several compute nodes.

+
library(BiocParallel)
 library(batchtools)
 f <- function(x) {
     library(systemPipeR)
     targets <- system.file("extdata", "targets.txt", package = "systemPipeR")
-    dir_path <- "param/cwl/hisat2/hisat2-se"  ## TODO: replace path to system.file
+    dir_path <- "param/cwl/hisat2/hisat2-se"  ## TODO: replace path to system.file 
     args <- loadWorkflow(targets = targets, wf_file = "hisat2-mapping-se.cwl", input_file = "hisat2-mapping-se.yml",
         dir_path = dir_path)
     args <- renderWF(args, inputvars = c(FileName = "_FASTQ_PATH1_", SampleName = "_SampleName_"))
@@ -502,7 +1549,10 @@
     resources = resources)
 read_statsList <- bplapply(seq(along = args), f, BPPARAM = param)
 read_statsDF <- do.call("rbind", read_statsList)
-

Read counting for miRNA profiling experiments

Download miRNA genes from miRBase.

system("wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/")
+
+

Read counting for miRNA profiling experiments

+

Download miRNA genes from miRBase.

+
system("wget ftp://mirbase.org/pub/mirbase/19/genomes/My_species.gff3 -P ./data/")
 gff <- import.gff("./data/My_species.gff3")
 gff <- split(gff, elementMetadata(gff)$ID)
 bams <- names(bampaths)
@@ -514,76 +1564,133 @@
 write.table(assays(countDFmiR)$counts, "results/countDFmiR.xls", col.names = NA,
     quote = FALSE, sep = "\t")
 write.table(rpkmDFmiR, "results/rpkmDFmiR.xls", col.names = NA, quote = FALSE, sep = "\t")
-

Correlation analysis of samples

The following computes the sample-wise Spearman correlation coefficients from the rlog (regularized-logarithm) transformed expression values generated with the DESeq2 package. After transformation to a distance matrix, hierarchical clustering is performed with the hclust function and the result is plotted as a dendrogram (sample_tree.pdf).

library(DESeq2, warn.conflicts = FALSE, quietly = TRUE)
+
+

Correlation analysis of samples

+

The following computes the sample-wise Spearman correlation coefficients from the rlog (regularized-logarithm) transformed expression values generated with the DESeq2 package. After transformation to a distance matrix, hierarchical clustering is performed with the hclust function and the result is plotted as a dendrogram (sample_tree.pdf).

+
library(DESeq2, warn.conflicts = FALSE, quietly = TRUE)
 library(ape, warn.conflicts = FALSE)
 countDFpath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
 countDF <- as.matrix(read.table(countDFpath))
 colData <- data.frame(row.names = targets.as.df(targets(args))$SampleName, condition = targets.as.df(targets(args))$Factor)
 dds <- DESeqDataSetFromMatrix(countData = countDF, colData = colData, design = ~condition)
-
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
+
+
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
 ## design formula are characters, converting to factors
-
d <- cor(assay(rlog(dds)), method = "spearman")
+
+
d <- cor(assay(rlog(dds)), method = "spearman")
 hc <- hclust(dist(1 - d))
 plot.phylo(as.phylo(hc), type = "p", edge.col = 4, edge.width = 3, show.node.label = TRUE,
     no.margin = TRUE)
-

Figure 6: Correlation dendrogram of samples for rlog values.


Alternatively, the clustering can be performed with RPKM normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.

rpkmDFeBygpath <- system.file("extdata", "rpkmDFeByg.xls", package = "systemPipeR")
+
+

+
+ +
+
+

Figure 2: Correlation dendrogram of samples for rlog values.

+
+
+

Alternatively, the clustering can be performed with RPKM normalized expression values. In combination with Spearman correlation the results of the two clustering methods are often relatively similar.

+
rpkmDFeBygpath <- system.file("extdata", "rpkmDFeByg.xls", package = "systemPipeR")
 rpkmDFeByg <- read.table(rpkmDFeBygpath, check.names = FALSE)
 rpkmDFeByg <- rpkmDFeByg[rowMeans(rpkmDFeByg) > 50, ]
 d <- cor(rpkmDFeByg, method = "spearman")
 hc <- hclust(as.dist(1 - d))
 plot.phylo(as.phylo(hc), type = "p", edge.col = "blue", edge.width = 2, show.node.label = TRUE,
     no.margin = TRUE)
-

DEG analysis with edgeR

The following *run_edgeR* function is a convenience wrapper for +

+

DEG analysis with edgeR

+

The following *run_edgeR* function is a convenience wrapper for identifying differentially expressed genes (DEGs) in batch mode with *edgeR’s GML method (Robinson, McCarthy, and Smyth 2010) for any number of pairwise sample comparisons specified under the cmp* argument. Users are strongly encouraged to consult the -edgeR vignette +edgeR vignette for more detailed information on this topic and how to properly run edgeR -on data sets with more complex experimental designs.

targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
+on data sets with more complex experimental designs.

+
targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
 targets <- read.delim(targetspath, comment = "#")
 cmp <- readComp(file = targetspath, format = "matrix", delim = "-")
 cmp[[1]]
-
##       [,1]  [,2]
-##  [1,] "M1"  "A1"
-##  [2,] "M1"  "V1"
-##  [3,] "A1"  "V1"
-##  [4,] "M6"  "A6"
-##  [5,] "M6"  "V6"
-##  [6,] "A6"  "V6"
+
+
##       [,1]  [,2] 
+##  [1,] "M1"  "A1" 
+##  [2,] "M1"  "V1" 
+##  [3,] "A1"  "V1" 
+##  [4,] "M6"  "A6" 
+##  [5,] "M6"  "V6" 
+##  [6,] "A6"  "V6" 
 ##  [7,] "M12" "A12"
 ##  [8,] "M12" "V12"
 ##  [9,] "A12" "V12"
-
countDFeBygpath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
+
+
countDFeBygpath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
 countDFeByg <- read.delim(countDFeBygpath, row.names = 1)
 edgeDF <- run_edgeR(countDF = countDFeByg, targets = targets, cmp = cmp[[1]], independent = FALSE,
     mdsplot = "")
-
## Disp = 0.21829 , BCV = 0.4672
-

Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the FDR value has been set to a relatively high threshold (here 10%). More commonly used FDR cutoffs are 1% or 5%. The definition of ‘up’ and ‘down’ is given in the corresponding help file. To open it, type ?filterDEGs in the R console.

DEG_list <- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10))
-

Figure 7: Up and down regulated DEGs identified by edgeR.


names(DEG_list)
-
## [1] "UporDown" "Up"       "Down"     "Summary"
-
DEG_list$Summary[1:4, ]
-
##       Comparisons Counts_Up_or_Down Counts_Up Counts_Down
+
+
## Loading required namespace: edgeR
+
+## Disp = 0.21829 , BCV = 0.4672
+
+

Filter and plot DEG results for up and down-regulated genes. Because of the small size of the toy data set used by this vignette, the FDR value has been set to a relatively high threshold (here 10%). More commonly used FDR cutoffs are 1% or 5%. The definition of ‘up’ and ‘down’ is given in the corresponding help file. To open it, type ?filterDEGs in the R console.

+
DEG_list <- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 10))
+
+

+
+

Figure 7: Up and down regulated DEGs identified by edgeR.

+
+
+
names(DEG_list)
+
+
## [1] "UporDown" "Up"       "Down"     "Summary"
+
+
DEG_list$Summary[1:4, ]
+
+
##       Comparisons Counts_Up_or_Down Counts_Up Counts_Down
 ## M1-A1       M1-A1                 0         0           0
 ## M1-V1       M1-V1                 1         1           0
 ## A1-V1       A1-V1                 1         1           0
 ## M6-A6       M6-A6                 0         0           0
-

DEG analysis with DESeq2

The following *run_DESeq2* function is a convenience wrapper for +

+

DEG analysis with DESeq2

+

The following *run_DESeq2* function is a convenience wrapper for identifying DEGs in batch mode with DESeq2* (Love, Huber, and Anders 2014) for any number of pairwise sample comparisons specified under the cmp* argument. Users are strongly encouraged to consult the -DESeq2 vignette +DESeq2 vignette for more detailed information on this topic and how to properly run DESeq2 -on data sets with more complex experimental designs.

degseqDF <- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]],
+on data sets with more complex experimental designs.

+
degseqDF <- run_DESeq2(countDF = countDFeByg, targets = targets, cmp = cmp[[1]],
     independent = FALSE)
-
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
+
+
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
 ## design formula are characters, converting to factors
-

Filter and plot DEG results for up and down-regulated genes.

DEG_list2 <- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10))
-

Figure 8: Up and down regulated DEGs identified by DESeq2.


Venn Diagrams

The function overLapper can compute Venn intersects for large numbers of sample sets (up to 20 or more) and vennPlot can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).

vennsetup <- overLapper(DEG_list$Up[6:9], type = "vennsets")
+
+

Filter and plot DEG results for up and down-regulated genes.

+
DEG_list2 <- filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10))
+
+

+
+

Figure 8: Up and down regulated DEGs identified by DESeq2.

+
+
+

Venn Diagrams

+

The function overLapper can compute Venn intersects for large numbers of sample sets (up to 20 or more) and vennPlot can plot 2-5 way Venn diagrams. A useful feature is the possibility to combine the counts from several Venn comparisons with the same number of sample sets in a single Venn diagram (here for 4 up and down DEG sets).

+
vennsetup <- overLapper(DEG_list$Up[6:9], type = "vennsets")
 vennsetdown <- overLapper(DEG_list$Down[6:9], type = "vennsets")
 vennPlot(list(vennsetup, vennsetdown), mymain = "", mysub = "", colmode = 2, ccol = c("blue",
     "red"))
-

Figure 9: Venn Diagram for 4 Up and Down DEG Sets.


GO term enrichment analysis of DEGs

Obtain gene-to-GO mappings

The following shows how to obtain gene-to-GO mappings from biomaRt (here for A. thaliana) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s *.db genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the load function as shown in the next subsection.

library("biomaRt")
+
+

+
+

Figure 9: Venn Diagram for 4 Up and Down DEG Sets.

+
+
+

GO term enrichment analysis of DEGs

+

Obtain gene-to-GO mappings

+

The following shows how to obtain gene-to-GO mappings from biomaRt (here for A. thaliana) and how to organize them for the downstream GO term enrichment analysis. Alternatively, the gene-to-GO mappings can be obtained for many organisms from Bioconductor’s *.db genome annotation packages or GO annotation files provided by various genome databases. For each annotation, this relatively slow preprocessing step needs to be performed only once. Subsequently, the preprocessed data can be loaded with the load function as shown in the next subsection.

+
library("biomaRt")
 listMarts()  # To choose BioMart database
 listMarts(host = "plants.ensembl.org")
 m <- useMart("plants_mart", host = "plants.ensembl.org")
@@ -603,7 +1710,10 @@
 catdb <- makeCATdb(myfile = "data/GO/GOannotationsBiomart_mod.txt", lib = NULL, org = "",
     colno = c(1, 2, 3), idconv = NULL)
 save(catdb, file = "data/GO/catdb.RData")
-

Batch GO term enrichment analysis

Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the FDR filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the GOCluster_Report function. When method="all", it returns all GO terms passing the p-value cutoff specified under the cutoff arguments. When method="slim", it returns only the GO terms specified under the myslimv argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.

load("data/GO/catdb.RData")
+
+

Batch GO term enrichment analysis

+

Apply the enrichment analysis to the DEG sets obtained in the above differential expression analysis. Note, in the following example the FDR filter is set here to an unreasonably high value, simply because of the small size of the toy data set used in this vignette. Batch enrichment analysis of many gene sets is performed with the GOCluster_Report function. When method="all", it returns all GO terms passing the p-value cutoff specified under the cutoff arguments. When method="slim", it returns only the GO terms specified under the myslimv argument. The given example shows how one can obtain such a GO slim vector from BioMart for a specific organism.

+
load("data/GO/catdb.RData")
 DEG_list <- filterDEGs(degDF = edgeDF, filter = c(Fold = 2, FDR = 50), plot = FALSE)
 up_down <- DEG_list$UporDown
 names(up_down) <- paste(names(up_down), "_up_down", sep = "")
@@ -622,23 +1732,160 @@
 BatchResultslim <- GOCluster_Report(catdb = catdb, setlist = DEGlist, method = "slim",
     id_type = "gene", myslimv = goslimvec, CLSZ = 10, cutoff = 0.01, gocats = c("MF",
         "BP", "CC"), recordSpecGO = NULL)
-

Plot batch GO term results

The data.frame generated by GOCluster_Report can be plotted with the goBarplot function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.

gos <- BatchResultslim[grep("M6-V6_up_down", BatchResultslim$CLID), ]
+
+

Plot batch GO term results

+

The data.frame generated by GOCluster_Report can be plotted with the goBarplot function. Because of the variable size of the sample sets, it may not always be desirable to show the results from different DEG sets in the same bar plot. Plotting single sample sets is achieved by subsetting the input data frame as shown in the first line of the following example.

+
gos <- BatchResultslim[grep("M6-V6_up_down", BatchResultslim$CLID), ]
 gos <- BatchResultslim
 pdf("GOslimbarplotMF.pdf", height = 8, width = 10)
 goBarplot(gos, gocat = "MF")
 dev.off()
 goBarplot(gos, gocat = "BP")
 goBarplot(gos, gocat = "CC")
-

Figure 10: GO Slim Barplot for MF Ontology.


Clustering and heat maps

The following example performs hierarchical clustering on the rlog transformed expression matrix subsetted by the DEGs identified in the -above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.

library(pheatmap)
+
+

+
+

Figure 10: GO Slim Barplot for MF Ontology.

+
+
+

Clustering and heat maps

+

The following example performs hierarchical clustering on the rlog transformed expression matrix subsetted by the DEGs identified in the +above differential expression analysis. It uses a Pearson correlation-based distance measure and complete linkage for cluster join.

+
library(pheatmap)
 geneids <- unique(as.character(unlist(DEG_list[[1]])))
 y <- assay(rlog(dds))[geneids, ]
 pdf("heatmap1.pdf")
 pheatmap(y, scale = "row", clustering_distance_rows = "correlation", clustering_distance_cols = "correlation")
 dev.off()
-

Figure 11: Heat map with hierarchical clustering dendrograms of DEGs.


References

Kim, Daehwan, Ben Langmead, and Steven L Salzberg. 2015. “HISAT: A Fast Spliced Aligner with Low Memory Requirements.” Nat. Methods 12 (4): 357–60.

Kim, Daehwan, Geo Pertea, Cole Trapnell, Harold Pimentel, Ryan Kelley, and Steven L Salzberg. 2013. “TopHat2: Accurate Alignment of Transcriptomes in the Presence of Insertions, Deletions and Gene Fusions.” Genome Biol. 14 (4): R36. https://doi.org/10.1186/gb-2013-14-4-r36.

Langmead, Ben, and Steven L Salzberg. 2012. “Fast Gapped-Read Alignment with Bowtie 2.” Nat. Methods 9 (4): 357–59. https://doi.org/10.1038/nmeth.1923.

Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-seq Data with DESeq2.” Genome Biol. 15 (12): 550. https://doi.org/10.1186/s13059-014-0550-8.

Morgan, Martin, Hervé Pagès, Valerie Obenchain, and Nathaniel Hayden. 2019. Rsamtools: Binary Alignment (BAM), FASTA, Variant Call (BCF), and Tabix File Import. http://bioconductor.org/packages/Rsamtools.

Robinson, M D, D J McCarthy, and G K Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616.

Wu, T D, and S Nacu. 2010. “Fast and SNP-tolerant Detection of Complex Variants and Splicing in Short Reads.” Bioinformatics 26 (7): 873–81. https://doi.org/10.1093/bioinformatics/btq057.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/systempiper/steps_files/figure-html/deseq2_deg_counts-1.png b/public/sp/spr/systempiper/steps_files/figure-html/deseq2_deg_counts-1.png new file mode 100644 index 000000000..9de90f5e0 Binary files /dev/null and b/public/sp/spr/systempiper/steps_files/figure-html/deseq2_deg_counts-1.png differ diff --git a/public/sp/spr/systempiper/steps_files/figure-html/edger_deg_counts-1.png b/public/sp/spr/systempiper/steps_files/figure-html/edger_deg_counts-1.png new file mode 100644 index 000000000..4a754b579 Binary files /dev/null and b/public/sp/spr/systempiper/steps_files/figure-html/edger_deg_counts-1.png differ diff --git a/public/sp/spr/systempiper/steps_files/figure-html/sample_tree_rlog-1.png b/public/sp/spr/systempiper/steps_files/figure-html/sample_tree_rlog-1.png new file mode 100644 index 000000000..36657a36e Binary files /dev/null and b/public/sp/spr/systempiper/steps_files/figure-html/sample_tree_rlog-1.png differ diff --git a/public/sp/spr/systempiper/steps_files/figure-html/vennplot-1.png b/public/sp/spr/systempiper/steps_files/figure-html/vennplot-1.png new file mode 100644 index 000000000..d419e4458 Binary files /dev/null and b/public/sp/spr/systempiper/steps_files/figure-html/vennplot-1.png differ diff --git a/public/sp/spr/templates/index.html b/public/sp/spr/templates/index.html index 732f9060a..57cda7677 100644 --- a/public/sp/spr/templates/index.html +++ b/public/sp/spr/templates/index.html @@ -1,74 +1,1061 @@ -Workflow Templates | sysPipe

Workflow Templates

Workflow templates

The intended way of running systemPipeR workflows is via *.Rmd files, which + + + + + + + + + + + + + + + + + + + +Workflow Templates | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Workflow Templates

+ + + + + +

Workflow templates

+

The intended way of running systemPipeR workflows is via *.Rmd files, which can be executed either line-wise in interactive mode or with a single command from R or the command-line. This way comprehensive and reproducible analysis reports can be generated in PDF or HTML format in a fully automated manner by making use of the highly functional reporting utilities available for R. The following shows how to execute a workflow (e.g., systemPipeRNAseq.Rmd) -from the command-line.

Rscript -e "rmarkdown::render('systemPipeRNAseq.Rmd')"
-

Templates for setting up custom project reports are provided as **.Rmd* files by the helper package *systemPipeRdata* and in the vignettes subdirectory of systemPipeR. The corresponding HTML of these report templates are available here: systemPipeRNAseq, systemPipeRIBOseq, systemPipeChIPseq and systemPipeVARseq. To work with *.Rnw* or *.Rmd* files efficiently, basic knowledge of Sweave or knitr and Latex or R Markdown v2 is required.

RNA-Seq sample

Load the RNA-Seq sample workflow into your current working directory.

library(systemPipeRdata)
+from the command-line.

+
Rscript -e "rmarkdown::render('systemPipeRNAseq.Rmd')"
+
+

Templates for setting up custom project reports are provided as **.Rmd* files by the helper package *systemPipeRdata* and in the vignettes subdirectory of systemPipeR. The corresponding HTML of these report templates are available here: systemPipeRNAseq, systemPipeRIBOseq, systemPipeChIPseq and systemPipeVARseq. To work with *.Rnw* or *.Rmd* files efficiently, basic knowledge of Sweave or knitr and Latex or R Markdown v2 is required.

+

RNA-Seq sample

+

Load the RNA-Seq sample workflow into your current working directory.

+
library(systemPipeRdata)
 genWorkenvir(workflow = "rnaseq")
 setwd("rnaseq")
-

Run workflow

Next, run the chosen sample workflow systemPipeRNAseq (PDF, Rmd) by executing from the command-line make -B within the rnaseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

The workflow includes following steps:

  1. Read preprocessing
    • Quality filtering (trimming)
    • FASTQ quality report
  2. Alignments: Tophat2 (or any other RNA-Seq aligner)
  3. Alignment stats
  4. Read counting
  5. Sample-wise correlation analysis
  6. Analysis of differentially expressed genes (DEGs)
  7. GO term enrichment analysis
  8. Gene-wise clustering

ChIP-Seq sample

Load the ChIP-Seq sample workflow into your current working directory.

library(systemPipeRdata)
+
+

Run workflow

+

Next, run the chosen sample workflow systemPipeRNAseq (PDF, Rmd) by executing from the command-line make -B within the rnaseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

+

The workflow includes following steps:

+
    +
  1. Read preprocessing +
      +
    • Quality filtering (trimming)
    • +
    • FASTQ quality report
    • +
    +
  2. +
  3. Alignments: Tophat2 (or any other RNA-Seq aligner)
  4. +
  5. Alignment stats
  6. +
  7. Read counting
  8. +
  9. Sample-wise correlation analysis
  10. +
  11. Analysis of differentially expressed genes (DEGs)
  12. +
  13. GO term enrichment analysis
  14. +
  15. Gene-wise clustering
  16. +
+

ChIP-Seq sample

+

Load the ChIP-Seq sample workflow into your current working directory.

+
library(systemPipeRdata)
 genWorkenvir(workflow = "chipseq")
 setwd("chipseq")
-

Run workflow

Next, run the chosen sample workflow systemPipeChIPseq_single (PDF, Rmd) by executing from the command-line make -B within the chipseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

The workflow includes the following steps:

  1. Read preprocessing
    • Quality filtering (trimming)
    • FASTQ quality report
  2. Alignments: Bowtie2 or rsubread
  3. Alignment stats
  4. Peak calling: MACS2, BayesPeak
  5. Peak annotation with genomic context
  6. Differential binding analysis
  7. GO term enrichment analysis
  8. Motif analysis

VAR-Seq sample

VAR-Seq workflow for the single machine

Load the VAR-Seq sample workflow into your current working directory.

library(systemPipeRdata)
+
+

Run workflow

+

Next, run the chosen sample workflow systemPipeChIPseq_single (PDF, Rmd) by executing from the command-line make -B within the chipseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

+

The workflow includes the following steps:

+
    +
  1. Read preprocessing +
      +
    • Quality filtering (trimming)
    • +
    • FASTQ quality report
    • +
    +
  2. +
  3. Alignments: Bowtie2 or rsubread
  4. +
  5. Alignment stats
  6. +
  7. Peak calling: MACS2, BayesPeak
  8. +
  9. Peak annotation with genomic context
  10. +
  11. Differential binding analysis
  12. +
  13. GO term enrichment analysis
  14. +
  15. Motif analysis
  16. +
+

VAR-Seq sample

+

VAR-Seq workflow for the single machine

+

Load the VAR-Seq sample workflow into your current working directory.

+
library(systemPipeRdata)
 genWorkenvir(workflow = "varseq")
 setwd("varseq")
-

Run workflow

Next, run the chosen sample workflow systemPipeVARseq_single (PDF, Rmd) by executing from the command-line make -B within the varseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

The workflow includes following steps:

  1. Read preprocessing
    • Quality filtering (trimming)
    • FASTQ quality report
  2. Alignments: gsnap, bwa
  3. Variant calling: VariantTools, GATK, BCFtools
  4. Variant filtering: VariantTools and VariantAnnotation
  5. Variant annotation: VariantAnnotation
  6. Combine results from many samples
  7. Summary statistics of samples

VAR-Seq workflow for computer cluster

The workflow template provided for this step is called systemPipeVARseq.Rmd (PDF, Rmd). -It runs the above VAR-Seq workflow in parallel on multiple compute nodes of an HPC system using Slurm as the scheduler.

Ribo-Seq sample

Load the Ribo-Seq sample workflow into your current working directory.

library(systemPipeRdata)
+
+

Run workflow

+

Next, run the chosen sample workflow systemPipeVARseq_single (PDF, Rmd) by executing from the command-line make -B within the varseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

+

The workflow includes following steps:

+
    +
  1. Read preprocessing +
      +
    • Quality filtering (trimming)
    • +
    • FASTQ quality report
    • +
    +
  2. +
  3. Alignments: gsnap, bwa
  4. +
  5. Variant calling: VariantTools, GATK, BCFtools
  6. +
  7. Variant filtering: VariantTools and VariantAnnotation
  8. +
  9. Variant annotation: VariantAnnotation
  10. +
  11. Combine results from many samples
  12. +
  13. Summary statistics of samples
  14. +
+

VAR-Seq workflow for computer cluster

+

The workflow template provided for this step is called systemPipeVARseq.Rmd (PDF, Rmd). +It runs the above VAR-Seq workflow in parallel on multiple compute nodes of an HPC system using Slurm as the scheduler.

+

Ribo-Seq sample

+

Load the Ribo-Seq sample workflow into your current working directory.

+
library(systemPipeRdata)
 genWorkenvir(workflow = "riboseq")
 setwd("riboseq")
-

Run workflow

Next, run the chosen sample workflow systemPipeRIBOseq (PDF, Rmd) by executing from the command-line make -B within the ribseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

The workflow includes following steps:

  1. Read preprocessing
    • Adaptor trimming and quality filtering
    • FASTQ quality report
  2. Alignments: Tophat2 (or any other RNA-Seq aligner)
  3. Alignment stats
  4. Compute read distribution across genomic features
  5. Adding custom features to the workflow (e.g. uORFs)
  6. Genomic read coverage along with transcripts
  7. Read counting
  8. Sample-wise correlation analysis
  9. Analysis of differentially expressed genes (DEGs)
  10. GO term enrichment analysis
  11. Gene-wise clustering
  12. Differential ribosome binding (translational efficiency)

Version information

Note: the most recent version of this tutorial can be found here.

sessionInfo()
-
## R version 4.0.3 (2020-10-10)
+
+

Run workflow

+

Next, run the chosen sample workflow systemPipeRIBOseq (PDF, Rmd) by executing from the command-line make -B within the ribseq directory. Alternatively, one can run the code from the provided *.Rmd template file from within R interactively.

+

The workflow includes following steps:

+
    +
  1. Read preprocessing +
      +
    • Adaptor trimming and quality filtering
    • +
    • FASTQ quality report
    • +
    +
  2. +
  3. Alignments: Tophat2 (or any other RNA-Seq aligner)
  4. +
  5. Alignment stats
  6. +
  7. Compute read distribution across genomic features
  8. +
  9. Adding custom features to the workflow (e.g. uORFs)
  10. +
  11. Genomic read coverage along with transcripts
  12. +
  13. Read counting
  14. +
  15. Sample-wise correlation analysis
  16. +
  17. Analysis of differentially expressed genes (DEGs)
  18. +
  19. GO term enrichment analysis
  20. +
  21. Gene-wise clustering
  22. +
  23. Differential ribosome binding (translational efficiency)
  24. +
+

Version information

+

Note: the most recent version of this tutorial can be found here.

+
sessionInfo()
+
+
## R version 4.0.3 (2020-10-10)
 ## Platform: x86_64-pc-linux-gnu (64-bit)
 ## Running under: Ubuntu 20.04.2 LTS
 ## 
@@ -137,9 +1124,105 @@
 ##  [97] blob_1.2.1               Rgraphviz_2.34.0         digest_0.6.27           
 ## [100] xtable_1.8-4             brew_1.0-6               openssl_1.4.3           
 ## [103] munsell_0.5.0            askpass_1.1
-

References

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/index.html b/public/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/index.html index 34d9520d1..eb3ebbba9 100644 --- a/public/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/index.html +++ b/public/sp/spr/viz_editor/bower_components/svg-pan-zoom/issue_template/index.html @@ -1,44 +1,654 @@ -sysPipe + + + + + + + + + + + + + + + + + +sysPipe + + + + + + + + + + + + + + +

Hi there!

Thanks for submitting an issue to svg-pan-zoom.

To help us help you better, please do the following before submitting an issue:

  1. Review the available documentation and existing examples
  2. Check if the same bug/feature request wasn’t previously reported
  3. Make sure you are not asking a usage or debugging question. If you are, use StackOverflow.
  4. Fill in the information that corresponds to your type of issue below
  5. If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via https://jsfiddle.net or similar (template: http://jsfiddle.net/bumbu/167usffr/).
  6. Delete this intro and any unrelated text :smile: (if you do not we’ll assume you haven’t read these instructions and automatically close the issue)

Bug report

Expected behaviour

your text here

Actual behaviour

your text here

Steps to reproduce the behaviour

Configuration

  • svg-pan-zoom version: ``
  • Browser(s): ``
  • Operating system(s): ``
  • A relevant example URL:

Feature Request

  • Feature description
  • Reasons for adopting new feature
  • Is this a breaking change? (How will this affect existing functionality)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + +

Hi there!

+

Thanks for submitting an issue to svg-pan-zoom.

+

To help us help you better, please do the following before submitting an issue:

+
    +
  1. Review the available documentation and existing examples
  2. +
  3. Check if the same bug/feature request wasn’t previously reported
  4. +
  5. Make sure you are not asking a usage or debugging question. If you are, use StackOverflow.
  6. +
  7. Fill in the information that corresponds to your type of issue below
  8. +
  9. If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via https://jsfiddle.net or similar (template: http://jsfiddle.net/bumbu/167usffr/).
  10. +
  11. Delete this intro and any unrelated text :smile: (if you do not we’ll assume you haven’t read these instructions and automatically close the issue)
  12. +
+

Bug report

+

Expected behaviour

+

your text here

+

Actual behaviour

+

your text here

+

Steps to reproduce the behaviour

+
    +
  1. +
  2. +
+

Configuration

+
    +
  • svg-pan-zoom version: ``
  • +
  • Browser(s): ``
  • +
  • Operating system(s): ``
  • +
  • A relevant example URL:
  • +
+

Feature Request

+
    +
  • Feature description
  • +
  • Reasons for adopting new feature
  • +
  • Is this a breaking change? (How will this affect existing functionality)
  • +
+ + + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/sp/sprdata/index.html b/public/sp/sprdata/index.html index faa1c5647..800a94eba 100644 --- a/public/sp/sprdata/index.html +++ b/public/sp/sprdata/index.html @@ -1,70 +1,1093 @@ -systemPipeRdata | sysPipe

systemPipeRdata

Find here all the documentation!

systemPipeRdata: Workflow templates and sample data

systemPipeRdata is a helper package -to generate with a single command workflow templates that are intended to be -used by its parent package systemPipeR. + + + + + + + + + + + + + + + + + + + + +systemPipeRdata | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

systemPipeRdata

+ + + + +
+

Find here all the documentation!

+ +
+ +

systemPipeRdata: Workflow templates and sample data

+

systemPipeRdata is a helper package +to generate with a single command workflow templates that are intended to be +used by its parent package systemPipeR. The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters -and cloud systems, while generating at the same time publication quality analysis reports.

To test workflows quickly or design new ones from existing templates, users can +and cloud systems, while generating at the same time publication quality analysis reports.

+

To test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow. Pre-configured directory structure of the workflow environment and the sample data -used by systemPipeRdata are described here.

Installation

To install the package, please use the BiocManager::install command:

if (!requireNamespace("BiocManager", quietly=TRUE))
+used by systemPipeRdata are described here.

+

Installation

+

To install the package, please use the BiocManager::install command:

+
if (!requireNamespace("BiocManager", quietly=TRUE))
     install.packages("BiocManager")
 BiocManager::install("systemPipeRdata")
-

To obtain the most recent updates immediately, one can install it directly from -github as follow:

if (!requireNamespace("BiocManager", quietly=TRUE))
+
+

To obtain the most recent updates immediately, one can install it directly from +github as follow:

+
if (!requireNamespace("BiocManager", quietly=TRUE))
     install.packages("BiocManager")
 BiocManager::install("tgirke/systemPipeRdata", build_vignettes=TRUE, dependencies=TRUE)
-

Due to the large size of the sample data (~320 MB) provided by systemPipeRdata, its download/install may take some time.

To install the parent package systemPipeR itself, please use the BiocManager::install method as instructed -here.

Usage

Detailed user manuals are available here:

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/sprdata/index.xml b/public/sp/sprdata/index.xml index 0657d32f3..aeb39d1b9 100644 --- a/public/sp/sprdata/index.xml +++ b/public/sp/sprdata/index.xml @@ -1,394 +1,436 @@ -sysPipe – systemPipeRdata/sp/sprdata/Recent content in systemPipeRdata on sysPipeHugo -- gohugo.ioSp: Workflow templates and sample data/sp/sprdata/systempiperdata/Mon, 01 Jan 0001 00:00:00 +0000/sp/sprdata/systempiperdata/ -<style type="text/css"> + + + sysPipe – systemPipeRdata + /sp/sprdata/ + Recent content in systemPipeRdata on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sp: Workflow templates and sample data + /sp/sprdata/systempiperdata/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/sprdata/systempiperdata/ + + + + <style type="text/css"> pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } -</style> +</style> <!--- - Compile from command-line -Rscript -e "rmarkdown::render('systemPipeRdata.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeRdata.Rmd', tangle=TRUE)"; Rscript -e "rmarkdown::render('systemPipeRdata.Rmd', c('BiocStyle::pdf_document'))" ---> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +Rscript -e "rmarkdown::render('systemPipeRdata.Rmd', c('BiocStyle::html_document'), clean=F); knitr::knit('systemPipeRdata.Rmd', tangle=TRUE)"; Rscript -e "rmarkdown::render('systemPipeRdata.Rmd', c('BiocStyle::pdf_document'))" +--> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<p><strong>Note:</strong> the most recent version of this vignette can be found <a href="https://github.com/tgirke/systemPipeRdata/blob/master/vignettes/systemPipeRdata.Rmd">here</a>.</p> -<p><strong>Note:</strong> if you use <em><code>systemPipeR</code></em> and <em><code>systemPipeRdata</code></em> in published research, please cite:</p> -<p>Backman, T.W.H and Girke, T. (2016). <em>systemPipeR</em>: Workflow and Report Generation Environment. <em>BMC Bioinformatics</em>, 17: 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">10.1186/s12859-016-1241-0</a>.</p> -<h1 id="introduction">Introduction</h1> -<p><a href="https://github.com/tgirke/systemPipeRdata"><em><code>systemPipeRdata</code></em></a> is a helper package +</script> +<p><strong>Note:</strong> the most recent version of this vignette can be found <a href="https://github.com/tgirke/systemPipeRdata/blob/master/vignettes/systemPipeRdata.Rmd">here</a>.</p> +<p><strong>Note:</strong> if you use <em><code>systemPipeR</code></em> and <em><code>systemPipeRdata</code></em> in published research, please cite:</p> +<p>Backman, T.W.H and Girke, T. (2016). <em>systemPipeR</em>: Workflow and Report Generation Environment. <em>BMC Bioinformatics</em>, 17: 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">10.1186/s12859-016-1241-0</a>.</p> +<h1 id="introduction">Introduction</h1> +<p><a href="https://github.com/tgirke/systemPipeRdata"><em><code>systemPipeRdata</code></em></a> is a helper package to generate with a single command workflow templates that are intended to be -used by its parent package <a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> (H Backman and Girke 2016). -The <em>systemPipeR</em> project provides a suite of R/Bioconductor packages for designing, +used by its parent package <a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"><em><code>systemPipeR</code></em></a> (H Backman and Girke 2016). +The <em>systemPipeR</em> project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters -and cloud systems, while generating at the same time publication quality analysis reports.</p> -<p>To test workflows quickly or design new ones from existing templates, users can +and cloud systems, while generating at the same time publication quality analysis reports.</p> +<p>To test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow. Pre-configured directory structure of the workflow environment and the sample data -used by <em><code>systemPipeRdata</code></em> are described <a href="http://bioconductor.org/packages/release/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html#load-sample-data-and-workflow-templates">here</a>.</p> -<h1 id="getting-started">Getting started</h1> -<h2 id="installation">Installation</h2> -<p>The <em><code>systemPipeRdata</code></em> package is available at <a href="http://www.bioconductor.org/packages/release/data/experiment/html/systemPipeRdata.html">Bioconductor</a> and can be installed from within R as follows:</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) +used by <em><code>systemPipeRdata</code></em> are described <a href="http://bioconductor.org/packages/release/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html#load-sample-data-and-workflow-templates">here</a>.</p> +<h1 id="getting-started">Getting started</h1> +<h2 id="installation">Installation</h2> +<p>The <em><code>systemPipeRdata</code></em> package is available at <a href="http://www.bioconductor.org/packages/release/data/experiment/html/systemPipeRdata.html">Bioconductor</a> and can be installed from within R as follows:</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) install.packages(&quot;BiocManager&quot;) BiocManager::install(&quot;systemPipeRdata&quot;) -</code></pre> -<p>Also, it is possible to install the development version from <a href="http://www.bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html">Bioconductor</a>.</p> -<pre><code class="language-r">BiocManager::install(&quot;systemPipeRdata&quot;, version = &quot;devel&quot;, build_vignettes = TRUE, -dependencies = TRUE) # Installs Devel version from Bioconductor -</code></pre> -<h2 id="loading-package-and-documentation">Loading package and documentation</h2> -<pre><code class="language-r">library(&quot;systemPipeRdata&quot;) # Loads the package -</code></pre> -<pre><code class="language-r">library(help = &quot;systemPipeRdata&quot;) # Lists package info -vignette(&quot;systemPipeRdata&quot;) # Opens vignette -</code></pre> -<h2 id="starting-with-pre-configured-workflow-templates">Starting with pre-configured workflow templates</h2> -<p>Load one of the available workflows into your current working directory. -The following does this for the <em><code>varseq</code></em> workflow template. The name of the resulting -workflow directory can be specified under the <em><code>mydirname</code></em> argument. The default <em><code>NULL</code></em> +</code></pre> +<p>Also, it is possible to install the development version from <a href="http://www.bioconductor.org/packages/devel/data/experiment/html/systemPipeRdata.html">Bioconductor</a>.</p> +<pre><code class="language-r">BiocManager::install(&quot;systemPipeRdata&quot;, version = &quot;devel&quot;, build_vignettes = TRUE, + dependencies = TRUE) # Installs Devel version from Bioconductor +</code></pre> +<h2 id="loading-package-and-documentation">Loading package and documentation</h2> +<pre><code class="language-r">library(&quot;systemPipeRdata&quot;) # Loads the package +</code></pre> +<pre><code class="language-r">library(help = &quot;systemPipeRdata&quot;) # Lists package info +vignette(&quot;systemPipeRdata&quot;) # Opens vignette +</code></pre> +<h2 id="starting-with-pre-configured-workflow-templates">Starting with pre-configured workflow templates</h2> +<p>Load one of the available workflows into your current working directory. +The following does this for the <em><code>varseq</code></em> workflow template. The name of the resulting +workflow directory can be specified under the <em><code>mydirname</code></em> argument. The default <em><code>NULL</code></em> uses the name of the chosen workflow. An error is issued if a directory of the same -name and path exists already.</p> -<pre><code class="language-r">genWorkenvir(workflow = &quot;systemPipeR/SPvarseq&quot;, mydirname = &quot;varseq&quot;) +name and path exists already.</p> +<pre><code class="language-r">genWorkenvir(workflow = &quot;systemPipeR/SPvarseq&quot;, mydirname = &quot;varseq&quot;) setwd(&quot;varseq&quot;) -</code></pre> -<p>On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.</p> -<pre><code class="language-bash">$ Rscript -e &quot;systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname='varseq')&quot; -</code></pre> -<h1 id="workflow-templates-collection">Workflow templates collection</h1> -<p>A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:</p> -<pre><code class="language-r">availableWF(github = TRUE) -</code></pre> -<p>This function returns the list of workflow templates available within the package -and <a href="https://github.com/systemPipeR">systemPipeR Organization</a> on GitHub. Each one -listed template can be created as described above.</p> -<p>The workflow template choose from Github will be installed as an R package, and +</code></pre> +<p>On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.</p> +<pre><code class="language-bash">$ Rscript -e &quot;systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname='varseq')&quot; +</code></pre> +<h1 id="workflow-templates-collection">Workflow templates collection</h1> +<p>A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:</p> +<pre><code class="language-r">availableWF(github = TRUE) +</code></pre> +<p>This function returns the list of workflow templates available within the package +and <a href="https://github.com/systemPipeR">systemPipeR Organization</a> on GitHub. Each one +listed template can be created as described above.</p> +<p>The workflow template choose from Github will be installed as an R package, and also it creates the environment with all the settings and files to run the demo -analysis.</p> -<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, mydirname=&quot;NULL&quot;) +analysis.</p> +<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, mydirname=&quot;NULL&quot;) setwd(&quot;SPrnaseq&quot;) -</code></pre> -<p>Besides, it is possible to choose different versions of the workflow template, -defined through other branches on the GitHub Repository. By default, the <em><code>master</code></em> -branch is selected, however, it is possible to define a different branch with the <em><code>ref</code></em> argument.</p> -<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, ref = &quot;singleMachine&quot;) +</code></pre> +<p>Besides, it is possible to choose different versions of the workflow template, +defined through other branches on the GitHub Repository. By default, the <em><code>master</code></em> +branch is selected, however, it is possible to define a different branch with the <em><code>ref</code></em> argument.</p> +<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, ref = &quot;singleMachine&quot;) setwd(&quot;SPrnaseq&quot;) -</code></pre> -<h2 id="download-a-specific-r-markdown-file">Download a specific R Markdown file</h2> -<p>Also, it is possible to download a specific workflow script for your analysis. -The URL can be specified under <em><code>url</code></em> argument and the R Markdown file name in -the <em><code>urlname</code></em> argument. The default <em><code>NULL</code></em> copies the current version available in the chose template.</p> -<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, url = &quot;https://raw.githubusercontent.com/systemPipeR/systemPipeRNAseq/cluster/vignettes/systemPipeRNAseq.Rmd&quot;, -urlname = &quot;rnaseq_V-cluster.Rmd&quot;) +</code></pre> +<h2 id="download-a-specific-r-markdown-file">Download a specific R Markdown file</h2> +<p>Also, it is possible to download a specific workflow script for your analysis. +The URL can be specified under <em><code>url</code></em> argument and the R Markdown file name in +the <em><code>urlname</code></em> argument. The default <em><code>NULL</code></em> copies the current version available in the chose template.</p> +<pre><code class="language-r">genWorkenvir(workflow=&quot;systemPipeR/SPrnaseq&quot;, url = &quot;https://raw.githubusercontent.com/systemPipeR/systemPipeRNAseq/cluster/vignettes/systemPipeRNAseq.Rmd&quot;, + urlname = &quot;rnaseq_V-cluster.Rmd&quot;) setwd(&quot;rnaseq&quot;) -</code></pre> -<h1 id="dynamic-generation-of-workflow-template">Dynamic generation of workflow template</h1> -<p>It is possible to create a new workflow structure from RStudio -menu <code>File -&gt; New File -&gt; R Markdown -&gt; From Template -&gt; systemPipeR New WorkFlow</code>. -This interactive option creates the same environment as demonstrated above.</p> -<p><img src="results/rstudio.png" alt=""> -<strong>Figure 1:</strong> Selecting workflow template within RStudio.</p> -<h1 id="directory-structure">Directory Structure</h1> -<p>The workflow templates generated by <em><code>genWorkenvir</code></em> contain the following preconfigured directory structure:</p> -<ul> -<li><span style="color:green"><em><strong>workflow/</strong></em></span> (<em>e.g.</em> <em>rnaseq/</em>) -<ul> -<li>This is the root directory of the R session running the workflow.</li> -<li>Run script ( <em>*.Rmd</em>) and sample annotation (<em>targets.txt</em>) files are located here.</li> -<li>Note, this directory can have any name (<em>e.g.</em> <span style="color:green"><em><strong>rnaseq</strong></em></span>, <span style="color:green"><em><strong>varseq</strong></em></span>). Changing its name does not require any modifications in the run script(s).</li> -<li><strong>Important subdirectories</strong>: -<ul> -<li><span style="color:green"><em><strong>param/</strong></em></span> -<ul> -<li>Stores non-CWL parameter files such as: <em>*.param</em>, <em>*.tmpl</em> and <em>*.run.sh</em>. These files are only required for backwards compatibility to run old workflows using the previous custom command-line interface.</li> -<li><span style="color:green"><em><strong>param/cwl/</strong></em></span>: This subdirectory stores all the CWL parameter files. To organize workflows, each can have its own subdirectory, where all <code>CWL param</code> and <code>input.yml</code> files need to be in the same subdirectory.</li> -</ul> -</li> -<li><span style="color:green"><em><strong>data/</strong></em> </span> -<ul> -<li>FASTQ files</li> -<li>FASTA file of reference (<em>e.g.</em> reference genome)</li> -<li>Annotation files</li> -<li>etc.</li> -</ul> -</li> -<li><span style="color:green"><em><strong>results/</strong></em></span> -<ul> -<li>Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files</li> -<li>Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.</li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -</ul> -<p><strong>Note</strong>: Directory names are indicated in <span style="color:grey"><em><strong>green</strong></em></span>. +</code></pre> +<h1 id="dynamic-generation-of-workflow-template">Dynamic generation of workflow template</h1> +<p>It is possible to create a new workflow structure from RStudio +menu <code>File -&gt; New File -&gt; R Markdown -&gt; From Template -&gt; systemPipeR New WorkFlow</code>. +This interactive option creates the same environment as demonstrated above.</p> +<p><img src="results/rstudio.png" alt=""> +<strong>Figure 1:</strong> Selecting workflow template within RStudio.</p> +<h1 id="directory-structure">Directory Structure</h1> +<p>The workflow templates generated by <em><code>genWorkenvir</code></em> contain the following preconfigured directory structure:</p> +<ul> +<li><span style="color:green"><em><strong>workflow/</strong></em></span> (<em>e.g.</em> <em>rnaseq/</em>) +<ul> +<li>This is the root directory of the R session running the workflow.</li> +<li>Run script ( <em>*.Rmd</em>) and sample annotation (<em>targets.txt</em>) files are located here.</li> +<li>Note, this directory can have any name (<em>e.g.</em> <span style="color:green"><em><strong>rnaseq</strong></em></span>, <span style="color:green"><em><strong>varseq</strong></em></span>). Changing its name does not require any modifications in the run script(s).</li> +<li><strong>Important subdirectories</strong>: +<ul> +<li><span style="color:green"><em><strong>param/</strong></em></span> +<ul> +<li>Stores non-CWL parameter files such as: <em>*.param</em>, <em>*.tmpl</em> and <em>*.run.sh</em>. These files are only required for backwards compatibility to run old workflows using the previous custom command-line interface.</li> +<li><span style="color:green"><em><strong>param/cwl/</strong></em></span>: This subdirectory stores all the CWL parameter files. To organize workflows, each can have its own subdirectory, where all <code>CWL param</code> and <code>input.yml</code> files need to be in the same subdirectory.</li> +</ul> +</li> +<li><span style="color:green"><em><strong>data/</strong></em> </span> +<ul> +<li>FASTQ files</li> +<li>FASTA file of reference (<em>e.g.</em> reference genome)</li> +<li>Annotation files</li> +<li>etc.</li> +</ul> +</li> +<li><span style="color:green"><em><strong>results/</strong></em></span> +<ul> +<li>Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files</li> +<li>Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.</li> +</ul> +</li> +</ul> +</li> +</ul> +</li> +</ul> +<p><strong>Note</strong>: Directory names are indicated in <span style="color:grey"><em><strong>green</strong></em></span>. Users can change this structure as needed, but need to adjust the code in their workflows -accordingly.</p> -<center> -<img src="results/directory.png"> -</center> -<p><strong>Figure 2:</strong> <em>systemPipeR’s</em> preconfigured directory structure.</p> -<h1 id="run-workflows">Run workflows</h1> -<p>Next, run from within R the chosen sample workflow by executing the code provided -in the corresponding <em><code>*.Rmd</code>* template file. -Much more detailed information on running and customizing </em><code>systemPipeR</code>*<a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"></a> -workflows is available in its overview vignette <a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html">here</a>. -This vignette can also be opened from R with the following command.</p> -<pre><code class="language-r">library(&quot;systemPipeR&quot;) # Loads systemPipeR which needs to be installed via BiocManager::install() from Bioconductor -</code></pre> -<pre><code class="language-r">vignette(&quot;systemPipeR&quot;, package = &quot;systemPipeR&quot;) -</code></pre> -<h2 id="return-paths-to-sample-data">Return paths to sample data</h2> -<p>The location of the sample data provided by <em><code>systemPipeRdata</code></em> can be returned as a <em><code>list</code></em>.</p> -<pre><code class="language-r">pathList() -</code></pre> -<pre><code>## $targets +accordingly.</p> +<center> +<img src="results/directory.png"> +</center> +<p><strong>Figure 2:</strong> <em>systemPipeR’s</em> preconfigured directory structure.</p> +<h1 id="run-workflows">Run workflows</h1> +<p>Next, run from within R the chosen sample workflow by executing the code provided +in the corresponding <em><code>*.Rmd</code>* template file. +Much more detailed information on running and customizing </em><code>systemPipeR</code>*<a href="http://www.bioconductor.org/packages/devel/bioc/html/systemPipeR.html"></a> +workflows is available in its overview vignette <a href="http://www.bioconductor.org/packages/devel/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html">here</a>. +This vignette can also be opened from R with the following command.</p> +<pre><code class="language-r">library(&quot;systemPipeR&quot;) # Loads systemPipeR which needs to be installed via BiocManager::install() from Bioconductor +</code></pre> +<pre><code class="language-r">vignette(&quot;systemPipeR&quot;, package = &quot;systemPipeR&quot;) +</code></pre> +<h2 id="return-paths-to-sample-data">Return paths to sample data</h2> +<p>The location of the sample data provided by <em><code>systemPipeRdata</code></em> can be returned as a <em><code>list</code></em>.</p> +<pre><code class="language-r">pathList() +</code></pre> +<pre><code>## $targets ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/targets.txt&quot; -## +## ## $targetsPE ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/targetsPE.txt&quot; -## +## ## $annotationdir ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/annotation/&quot; -## +## ## $fastqdir ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/fastq/&quot; -## +## ## $bamdir ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/bam/&quot; -## +## ## $paramdir ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/&quot; -## +## ## $workflows ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/&quot; -## +## ## $chipseq ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/chipseq/&quot; -## +## ## $rnaseq ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/rnaseq/&quot; -## +## ## $riboseq ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/riboseq/&quot; -## +## ## $varseq ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/varseq/&quot; -## +## ## $new ## [1] &quot;/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/new/&quot; -</code></pre> -<h1 id="version-information">Version information</h1> -<pre><code class="language-r">sessionInfo() -</code></pre> -<pre><code>## R Under development (unstable) (2021-02-04 r79940) +</code></pre> +<h1 id="version-information">Version information</h1> +<pre><code class="language-r">sessionInfo() +</code></pre> +<pre><code>## R Under development (unstable) (2021-02-04 r79940) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS -## +## ## Matrix products: default -## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 +## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-devel/lib/libRlapack.so -## +## ## locale: -## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C -## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 -## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 -## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C -## [9] LC_ADDRESS=C LC_TELEPHONE=C -## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C -## +## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C +## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 +## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 +## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C +## [9] LC_ADDRESS=C LC_TELEPHONE=C +## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C +## ## attached base packages: -## [1] stats graphics grDevices utils datasets -## [6] methods base -## +## [1] stats graphics grDevices utils datasets +## [6] methods base +## ## other attached packages: -## [1] systemPipeRdata_1.19.2 BiocStyle_2.19.2 -## +## [1] systemPipeRdata_1.19.2 BiocStyle_2.19.2 +## ## loaded via a namespace (and not attached): -## [1] knitr_1.33 magrittr_2.0.1 -## [3] BiocGenerics_0.37.4 R6_2.5.0 -## [5] rlang_0.4.11 stringr_1.4.0 -## [7] tools_4.1.0 parallel_4.1.0 -## [9] xfun_0.22 jquerylib_0.1.4 -## [11] htmltools_0.5.1.1 remotes_2.3.0 -## [13] yaml_2.2.1 digest_0.6.27 -## [15] bookdown_0.22 formatR_1.9 -## [17] BiocManager_1.30.12 sass_0.3.1 -## [19] codetools_0.2-18 evaluate_0.14 -## [21] rmarkdown_2.7.12 blogdown_1.3 -## [23] stringi_1.5.3 compiler_4.1.0 -## [25] bslib_0.2.4 jsonlite_1.7.2 -</code></pre> -<h1 id="funding">Funding</h1> -<p>This project was supported by funds from the National Institutes of Health (NIH) and the National Science Foundation (NSF).</p> -<h1 id="references">References</h1> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-H_Backman2016-bt" class="csl-entry"> -<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> -</div> -</div>Sp: Rules to create a new Workflow Template/sp/sprdata/newwf/Mon, 01 Jan 0001 00:00:00 +0000/sp/sprdata/newwf/ -<h1 id="how-to-create-a-new-workflow-template">How to create a new Workflow Template</h1> -<p><code>SPRthis</code> package expand <a href="https://github.com/r-lib/usethis">usethis</a> package, providing automation to create <a href="https://github.com/tgirke/systemPipeR">systemPipeR</a> workflows templates.</p> -<h2 id="installation">Installation</h2> -<p>To install <code>SPRthis</code> using from <code>BiocManager</code> the following code:</p> -<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) { -install.packages(&quot;BiocManager&quot;) -BiocManager::install(&quot;dcassol/SPRthis&quot;) -</code></pre> -<h2 id="quick-start-to-using-to-sprthis">Quick start to using to <code>SPRthis</code></h2> -<pre><code class="language-r">## Load the package +## [1] knitr_1.33 magrittr_2.0.1 +## [3] BiocGenerics_0.37.4 R6_2.5.0 +## [5] rlang_0.4.11 stringr_1.4.0 +## [7] tools_4.1.0 parallel_4.1.0 +## [9] xfun_0.22 jquerylib_0.1.4 +## [11] htmltools_0.5.1.1 remotes_2.3.0 +## [13] yaml_2.2.1 digest_0.6.27 +## [15] bookdown_0.22 formatR_1.9 +## [17] BiocManager_1.30.12 sass_0.3.1 +## [19] codetools_0.2-18 evaluate_0.14 +## [21] rmarkdown_2.7.12 blogdown_1.3 +## [23] stringi_1.5.3 compiler_4.1.0 +## [25] bslib_0.2.4 jsonlite_1.7.2 +</code></pre> +<h1 id="funding">Funding</h1> +<p>This project was supported by funds from the National Institutes of Health (NIH) and the National Science Foundation (NSF).</p> +<h1 id="references">References</h1> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-H_Backman2016-bt" class="csl-entry"> +<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> +</div> +</div> + + + + + + Sp: Rules to create a new Workflow Template + /sp/sprdata/newwf/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/sprdata/newwf/ + + + + <h1 id="how-to-create-a-new-workflow-template">How to create a new Workflow Template</h1> +<p><code>SPRthis</code> package expand <a href="https://github.com/r-lib/usethis">usethis</a> package, providing automation to create <a href="https://github.com/tgirke/systemPipeR">systemPipeR</a> workflows templates.</p> +<h2 id="installation">Installation</h2> +<p>To install <code>SPRthis</code> using from <code>BiocManager</code> the following code:</p> +<pre><code class="language-r">if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE)) { + install.packages(&quot;BiocManager&quot;) + BiocManager::install(&quot;dcassol/SPRthis&quot;) +</code></pre> +<h2 id="quick-start-to-using-to-sprthis">Quick start to using to <code>SPRthis</code></h2> +<pre><code class="language-r">## Load the package library(SPRthis) ## create Package sprthis(wfName=&quot;SPRtest&quot;, analysis=&quot;SPRtest&quot;, path=tempdir()) -</code></pre> -<pre><code>## ✓ Setting active project to '/tmp/RtmpunjAF9' -</code></pre> -<pre><code>## ✓ Creating 'R/' -</code></pre> -<pre><code>## ✓ Writing 'DESCRIPTION' -</code></pre> -<pre><code>## Package: SPRtest +</code></pre> +<pre><code>## ✓ Setting active project to '/tmp/RtmpunjAF9' +</code></pre> +<pre><code>## ✓ Creating 'R/' +</code></pre> +<pre><code>## ✓ Writing 'DESCRIPTION' +</code></pre> +<pre><code>## Package: SPRtest ## Title: SPRtest ## Version: 0.9.0 ## Authors@R (parsed): -## * First Last &lt;first.last@example.com&gt; [aut, cre] (YOUR-ORCID-ID) +## * First Last &lt;first.last@example.com&gt; [aut, cre] (YOUR-ORCID-ID) ## Description: This package provides a pre-configured workflow and reporting -## template for SPRtest. +## template for SPRtest. ## License: Artistic-2.0 ## URL: https://github.com/systemPipeR/SPRtest ## Imports: -## systemPipeR (&gt;= 1.25.0) +## systemPipeR (&gt;= 1.25.0) ## Suggests: -## BiocStyle, -## knitr, -## rmarkdown +## BiocStyle, +## knitr, +## rmarkdown ## VignetteBuilder: -## knitr +## knitr ## biocViews: Infrastructure, ... ## Encoding: UTF-8 ## LazyData: true ## Roxygen: list(markdown = TRUE) ## RoxygenNote: 7.1.1 ## SystemRequirements: SPRtest can be used to run external command-line -## software, but the corresponding tool needs to be installed on a -## system. -</code></pre> -<pre><code>## ✓ Writing 'NAMESPACE' -</code></pre> -<pre><code>## ✓ Setting active project to '&lt;no active project&gt;' -</code></pre> -<pre><code>## [1] &quot;/tmp/RtmpunjAF9&quot; -</code></pre> -<pre> -SPRtest/ -├── DESCRIPTION -├── NAMESPACE -├── README.md -├── SPRtest.Rproj +## software, but the corresponding tool needs to be installed on a +## system. +</code></pre> +<pre><code>## ✓ Writing 'NAMESPACE' +</code></pre> +<pre><code>## ✓ Setting active project to '&lt;no active project&gt;' +</code></pre> +<pre><code>## [1] &quot;/tmp/RtmpunjAF9&quot; +</code></pre> +<pre> +SPRtest/ +├── DESCRIPTION +├── NAMESPACE +├── README.md +├── SPRtest.Rproj ├── .gitignore ├── .Rbuildignore -├── .Rproj.user/ +├── .Rproj.user/ ├── R/ -│ ├── functions.R -├── vignettes -│ ├── bibtex.bib -│ ├── SPRtest.Rmd -└── inst -├── rmarkdown -│ └── templates -│ └── SPRtest -│ ├── template.yml -│ └── skeleton -│ ├── batchtools.slurm.tmpl -│ ├── .batchtools.conf.R -│ ├── bibtex.bib -│ ├── NEWS -│ ├── SPRconfig.yml -│ ├── skeleton.Rmd -│ ├── targetsPE.txt -│ ├── data/ -│ ├── param/ -│ └── results/ -</pre> -<h1 id="help-functions-to-create-the-package">Help functions to create the package</h1> -<h2 id="create-the-webiste-for-the-package-with-pkgdown">Create the webiste for the package with <code>pkgdown</code></h2> -<p>Edit the <code>_pkgdown.yml</code> file and run:</p> -<pre><code class="language-r">pkgdown::build_site() -</code></pre> -<h2 id="documentation-with-roxygen2">Documentation with <code>roxygen2</code></h2> -<pre><code class="language-r">roxygen2::roxygenise() -</code></pre> -<h2 id="testing-the-code-with-testthat">Testing the code with <code>testthat</code></h2> -<p>To test the code, you can run</p> -<pre><code class="language-r">devtools::test() -</code></pre> -<h1 id="update-r-markdown-template-on-skeleton">Update R Markdown template on <code>skeleton</code></h1> -<pre><code class="language-r">path &lt;- file.path(&quot;vignettes/SPRtest.Rmd&quot;) +│ ├── functions.R +├── vignettes +│ ├── bibtex.bib +│ ├── SPRtest.Rmd +└── inst + ├── rmarkdown + │ └── templates + │ └── SPRtest + │ ├── template.yml + │ └── skeleton + │ ├── batchtools.slurm.tmpl + │ ├── .batchtools.conf.R + │ ├── bibtex.bib + │ ├── NEWS + │ ├── SPRconfig.yml + │ ├── skeleton.Rmd + │ ├── targetsPE.txt + │ ├── data/ + │ ├── param/ + │ └── results/ +</pre> +<h1 id="help-functions-to-create-the-package">Help functions to create the package</h1> +<h2 id="create-the-webiste-for-the-package-with-pkgdown">Create the webiste for the package with <code>pkgdown</code></h2> +<p>Edit the <code>_pkgdown.yml</code> file and run:</p> +<pre><code class="language-r">pkgdown::build_site() +</code></pre> +<h2 id="documentation-with-roxygen2">Documentation with <code>roxygen2</code></h2> +<pre><code class="language-r">roxygen2::roxygenise() +</code></pre> +<h2 id="testing-the-code-with-testthat">Testing the code with <code>testthat</code></h2> +<p>To test the code, you can run</p> +<pre><code class="language-r">devtools::test() +</code></pre> +<h1 id="update-r-markdown-template-on-skeleton">Update R Markdown template on <code>skeleton</code></h1> +<pre><code class="language-r">path &lt;- file.path(&quot;vignettes/SPRtest.Rmd&quot;) skeleton_update(path) -</code></pre> -<h1 id="package-available-to-genworkenvir-function">Package available to <code>genWorkenvir</code> Function</h1> -<p>After creating the new repository on GitHub <a href="https://github.com/systemPipeR">systemPipeR Organization</a>, -please follow:</p> -<ul> -<li>Rules: -<ul> -<li>The Workflow Template need to be available under <a href="https://github.com/systemPipeR/">systemPipeR Organization</a>;</li> -<li>The repository needs to be <code>public</code>;</li> -<li>About setting: -<ul> -<li><code>Description</code>: keywords in the description are required: &ldquo;Workflow Template&rdquo;;</li> -<li><code>Topics</code>: we expected &ldquo;systempiper&rdquo; and &ldquo;release&rdquo; or &ldquo;development&rdquo; words on Topics section;</li> -</ul> -</li> -<li>Branch name: To make simple, please name the branch as &ldquo;master&rdquo;.</li> -</ul> -</li> -</ul> -<h2 id="check-availability-of-workflow-templates">Check availability of workflow templates</h2> -<p>A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:</p> -<pre><code class="language-r">systemPipeRdata::availableWF(github = TRUE) -</code></pre> -<pre><code>## $systemPipeRdata -## [1] &quot;chipseq&quot; &quot;new&quot; &quot;riboseq&quot; &quot;rnaseq&quot; &quot;varseq&quot; -## +</code></pre> +<h1 id="package-available-to-genworkenvir-function">Package available to <code>genWorkenvir</code> Function</h1> +<p>After creating the new repository on GitHub <a href="https://github.com/systemPipeR">systemPipeR Organization</a>, +please follow:</p> +<ul> +<li>Rules: +<ul> +<li>The Workflow Template need to be available under <a href="https://github.com/systemPipeR/">systemPipeR Organization</a>;</li> +<li>The repository needs to be <code>public</code>;</li> +<li>About setting: +<ul> +<li><code>Description</code>: keywords in the description are required: &ldquo;Workflow Template&rdquo;;</li> +<li><code>Topics</code>: we expected &ldquo;systempiper&rdquo; and &ldquo;release&rdquo; or &ldquo;development&rdquo; words on Topics section;</li> +</ul> +</li> +<li>Branch name: To make simple, please name the branch as &ldquo;master&rdquo;.</li> +</ul> +</li> +</ul> +<h2 id="check-availability-of-workflow-templates">Check availability of workflow templates</h2> +<p>A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:</p> +<pre><code class="language-r">systemPipeRdata::availableWF(github = TRUE) +</code></pre> +<pre><code>## $systemPipeRdata +## [1] &quot;chipseq&quot; &quot;new&quot; &quot;riboseq&quot; &quot;rnaseq&quot; &quot;varseq&quot; +## ## $github -## workflow branches version -## 1 systemPipeR/SPchipseq master release -## 2 systemPipeR/SPriboseq master release -## 3 systemPipeR/SPrnaseq cluster, master, singleMachine release -## 4 systemPipeR/SPvarseq master release -## 5 systemPipeR/SPclipseq master devel -## 6 systemPipeR/SPdenovo master devel -## 7 systemPipeR/SPmetatrans master devel -## 8 systemPipeR/SPmethylseq master devel -## 9 systemPipeR/SPmirnaseq master devel -## html description -## 1 https://github.com/systemPipeR/SPchipseq Workflow Template -## 2 https://github.com/systemPipeR/SPriboseq Workflow Template -## 3 https://github.com/systemPipeR/SPrnaseq Workflow Template -## 4 https://github.com/systemPipeR/SPvarseq Workflow Template -## 5 https://github.com/systemPipeR/SPclipseq Workflow Template -## 6 https://github.com/systemPipeR/SPdenovo Workflow Template +## workflow branches version +## 1 systemPipeR/SPchipseq master release +## 2 systemPipeR/SPriboseq master release +## 3 systemPipeR/SPrnaseq cluster, master, singleMachine release +## 4 systemPipeR/SPvarseq master release +## 5 systemPipeR/SPclipseq master devel +## 6 systemPipeR/SPdenovo master devel +## 7 systemPipeR/SPmetatrans master devel +## 8 systemPipeR/SPmethylseq master devel +## 9 systemPipeR/SPmirnaseq master devel +## html description +## 1 https://github.com/systemPipeR/SPchipseq Workflow Template +## 2 https://github.com/systemPipeR/SPriboseq Workflow Template +## 3 https://github.com/systemPipeR/SPrnaseq Workflow Template +## 4 https://github.com/systemPipeR/SPvarseq Workflow Template +## 5 https://github.com/systemPipeR/SPclipseq Workflow Template +## 6 https://github.com/systemPipeR/SPdenovo Workflow Template ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template -## 9 https://github.com/systemPipeR/SPmirnaseq Workflow Template -</code></pre> -<p>This function returns the list of workflow templates available within the package -and <a href="https://github.com/systemPipeR">systemPipeR Project Organization</a> on GitHub. Each one -listed template can be created as described above.</p> \ No newline at end of file +## 9 https://github.com/systemPipeR/SPmirnaseq Workflow Template +</code></pre> +<p>This function returns the list of workflow templates available within the package +and <a href="https://github.com/systemPipeR">systemPipeR Project Organization</a> on GitHub. Each one +listed template can be created as described above.</p> + + + + + + diff --git a/public/sp/sprdata/newwf/index.html b/public/sp/sprdata/newwf/index.html index a1320337d..ec66b2c12 100644 --- a/public/sp/sprdata/newwf/index.html +++ b/public/sp/sprdata/newwf/index.html @@ -1,67 +1,943 @@ -Rules to create a new Workflow Template | sysPipe + + + + + + + + + + + + + + + + + +Rules to create a new Workflow Template | sysPipe + + + + + + + + + + + + + + +

Rules to create a new Workflow Template

How to create a new Workflow Template

SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.

Installation

To install SPRthis using from BiocManager the following code:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
+if (!requireNamespace("BiocManager", quietly = TRUE)) { install.packages("BiocManager") BiocManager::install("dcassol/SPRthis")  Quick start to using to SPRthis ## Load the package library(SPRthis) ## create Package sprthis(wfName="SPRtest", analysis="SPRtest", path=tempdir())  ## ✓ Setting active project to '/tmp/RtmpunjAF9'  ## ✓ Creating 'R/'  ## ✓ Writing 'DESCRIPTION'  ## Package: SPRtest ## Title: SPRtest ## Version: 0."/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

Rules to create a new Workflow Template

+ + +

How to create a new Workflow Template

+

SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.

+

Installation

+

To install SPRthis using from BiocManager the following code:

+
if (!requireNamespace("BiocManager", quietly = TRUE)) {
   install.packages("BiocManager")
   BiocManager::install("dcassol/SPRthis")
-

Quick start to using to SPRthis

## Load the package
+
+

Quick start to using to SPRthis

+
## Load the package
 library(SPRthis)
 ## create Package
 sprthis(wfName="SPRtest", analysis="SPRtest", path=tempdir())
-
## ✓ Setting active project to '/tmp/RtmpunjAF9'
-
## ✓ Creating 'R/'
-
## ✓ Writing 'DESCRIPTION'
-
## Package: SPRtest
+
+
## ✓ Setting active project to '/tmp/RtmpunjAF9'
+
+
## ✓ Creating 'R/'
+
+
## ✓ Writing 'DESCRIPTION'
+
+
## Package: SPRtest
 ## Title: SPRtest
 ## Version: 0.9.0
 ## Authors@R (parsed):
@@ -86,10 +962,14 @@
 ## SystemRequirements: SPRtest can be used to run external command-line
 ##     software, but the corresponding tool needs to be installed on a
 ##     system.
-
## ✓ Writing 'NAMESPACE'
-
## ✓ Setting active project to '<no active project>'
-
## [1] "/tmp/RtmpunjAF9"
-
+
+
## ✓ Writing 'NAMESPACE'
+
+
## ✓ Setting active project to '<no active project>'
+
+
## [1] "/tmp/RtmpunjAF9"
+
+
 SPRtest/  
 ├── DESCRIPTION 
 ├── NAMESPACE 
@@ -119,15 +999,47 @@
     │                 ├── data/
     │                 ├── param/
     │                 └── results/
-

Help functions to create the package

Create the webiste for the package with pkgdown

Edit the _pkgdown.yml file and run:

pkgdown::build_site() 
-

Documentation with roxygen2

roxygen2::roxygenise()
-

Testing the code with testthat

To test the code, you can run

devtools::test()
-

Update R Markdown template on skeleton

path <- file.path("vignettes/SPRtest.Rmd")
+
+

Help functions to create the package

+

Create the webiste for the package with pkgdown

+

Edit the _pkgdown.yml file and run:

+
pkgdown::build_site() 
+
+

Documentation with roxygen2

+
roxygen2::roxygenise()
+
+

Testing the code with testthat

+

To test the code, you can run

+
devtools::test()
+
+

Update R Markdown template on skeleton

+
path <- file.path("vignettes/SPRtest.Rmd")
 skeleton_update(path)
-

Package available to genWorkenvir Function

After creating the new repository on GitHub systemPipeR Organization, -please follow:

  • Rules:
    • The Workflow Template need to be available under systemPipeR Organization;
    • The repository needs to be public;
    • About setting:
      • Description: keywords in the description are required: “Workflow Template”;
      • Topics: we expected “systempiper” and “release” or “development” words on Topics section;
    • Branch name: To make simple, please name the branch as “master”.

Check availability of workflow templates

A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:

systemPipeRdata::availableWF(github = TRUE)
-
## $systemPipeRdata
+
+

Package available to genWorkenvir Function

+

After creating the new repository on GitHub systemPipeR Organization, +please follow:

+
    +
  • Rules: +
      +
    • The Workflow Template need to be available under systemPipeR Organization;
    • +
    • The repository needs to be public;
    • +
    • About setting: +
        +
      • Description: keywords in the description are required: “Workflow Template”;
      • +
      • Topics: we expected “systempiper” and “release” or “development” words on Topics section;
      • +
      +
    • +
    • Branch name: To make simple, please name the branch as “master”.
    • +
    +
  • +
+

Check availability of workflow templates

+

A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:

+
systemPipeRdata::availableWF(github = TRUE)
+
+
## $systemPipeRdata
 ## [1] "chipseq" "new"     "riboseq" "rnaseq"  "varseq" 
 ## 
 ## $github
@@ -151,11 +1063,107 @@
 ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template
 ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template
 ## 9  https://github.com/systemPipeR/SPmirnaseq Workflow Template
-

This function returns the list of workflow templates available within the package -and systemPipeR Project Organization on GitHub. Each one -listed template can be created as described above.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/sprdata/systempiperdata/index.html b/public/sp/sprdata/systempiperdata/index.html index efc43bbd1..aba913cad 100644 --- a/public/sp/sprdata/systempiperdata/index.html +++ b/public/sp/sprdata/systempiperdata/index.html @@ -1,111 +1,1085 @@ -Workflow templates and sample data | sysPipe + + + + + + + + + + + + + + + + + +Workflow templates and sample data | sysPipe + + + + + + + + + + + + + + +

Workflow templates and sample data

Note: the most recent version of this vignette can be found here.

Note: if you use systemPipeR and systemPipeRdata in published research, please cite:

Backman, T.W.H and Girke, T. (2016). systemPipeR: Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.

Introduction

systemPipeRdata is a helper package +Backman, T.W.H and Girke, T. (2016)."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Workflow templates and sample data

+ + + + + + +

Note: the most recent version of this vignette can be found here.

+

Note: if you use systemPipeR and systemPipeRdata in published research, please cite:

+

Backman, T.W.H and Girke, T. (2016). systemPipeR: Workflow and Report Generation Environment. BMC Bioinformatics, 17: 388. 10.1186/s12859-016-1241-0.

+

Introduction

+

systemPipeRdata is a helper package to generate with a single command workflow templates that are intended to be -used by its parent package systemPipeR (H Backman and Girke 2016). +used by its parent package systemPipeR (H Backman and Girke 2016). The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters -and cloud systems, while generating at the same time publication quality analysis reports.

To test workflows quickly or design new ones from existing templates, users can +and cloud systems, while generating at the same time publication quality analysis reports.

+

To test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data and parameter files required for running a chosen workflow. Pre-configured directory structure of the workflow environment and the sample data -used by systemPipeRdata are described here.

Getting started

Installation

The systemPipeRdata package is available at Bioconductor and can be installed from within R as follows:

if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
+used by systemPipeRdata are described here.

+

Getting started

+

Installation

+

The systemPipeRdata package is available at Bioconductor and can be installed from within R as follows:

+
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
 BiocManager::install("systemPipeRdata")
-

Also, it is possible to install the development version from Bioconductor.

BiocManager::install("systemPipeRdata", version = "devel", build_vignettes = TRUE, 
+
+

Also, it is possible to install the development version from Bioconductor.

+
BiocManager::install("systemPipeRdata", version = "devel", build_vignettes = TRUE, 
     dependencies = TRUE)  # Installs Devel version from Bioconductor
-

Loading package and documentation

library("systemPipeRdata")  # Loads the package
-
library(help = "systemPipeRdata")  # Lists package info
+
+

Loading package and documentation

+
library("systemPipeRdata")  # Loads the package
+
+
library(help = "systemPipeRdata")  # Lists package info
 vignette("systemPipeRdata")  # Opens vignette
-

Starting with pre-configured workflow templates

Load one of the available workflows into your current working directory. +

+

Starting with pre-configured workflow templates

+

Load one of the available workflows into your current working directory. The following does this for the varseq workflow template. The name of the resulting workflow directory can be specified under the mydirname argument. The default NULL uses the name of the chosen workflow. An error is issued if a directory of the same -name and path exists already.

genWorkenvir(workflow = "systemPipeR/SPvarseq", mydirname = "varseq")
+name and path exists already.

+
genWorkenvir(workflow = "systemPipeR/SPvarseq", mydirname = "varseq")
 setwd("varseq")
-

On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.

$ Rscript -e "systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname='varseq')"
-

Workflow templates collection

A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:

availableWF(github = TRUE)
-

This function returns the list of workflow templates available within the package -and systemPipeR Organization on GitHub. Each one -listed template can be created as described above.

The workflow template choose from Github will be installed as an R package, and +

+

On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.

+
$ Rscript -e "systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname='varseq')"
+
+

Workflow templates collection

+

A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:

+
availableWF(github = TRUE)
+
+

This function returns the list of workflow templates available within the package +and systemPipeR Organization on GitHub. Each one +listed template can be created as described above.

+

The workflow template choose from Github will be installed as an R package, and also it creates the environment with all the settings and files to run the demo -analysis.

genWorkenvir(workflow="systemPipeR/SPrnaseq", mydirname="NULL")
+analysis.

+
genWorkenvir(workflow="systemPipeR/SPrnaseq", mydirname="NULL")
 setwd("SPrnaseq")
-

Besides, it is possible to choose different versions of the workflow template, +

+

Besides, it is possible to choose different versions of the workflow template, defined through other branches on the GitHub Repository. By default, the master -branch is selected, however, it is possible to define a different branch with the ref argument.

genWorkenvir(workflow="systemPipeR/SPrnaseq", ref = "singleMachine")
+branch is selected, however, it is possible to define a different branch with the ref argument.

+
genWorkenvir(workflow="systemPipeR/SPrnaseq", ref = "singleMachine")
 setwd("SPrnaseq")
-

Download a specific R Markdown file

Also, it is possible to download a specific workflow script for your analysis. +

+

Download a specific R Markdown file

+

Also, it is possible to download a specific workflow script for your analysis. The URL can be specified under url argument and the R Markdown file name in -the urlname argument. The default NULL copies the current version available in the chose template.

genWorkenvir(workflow="systemPipeR/SPrnaseq", url = "https://raw.githubusercontent.com/systemPipeR/systemPipeRNAseq/cluster/vignettes/systemPipeRNAseq.Rmd", 
+the urlname argument. The default NULL copies the current version available in the chose template.

+
genWorkenvir(workflow="systemPipeR/SPrnaseq", url = "https://raw.githubusercontent.com/systemPipeR/systemPipeRNAseq/cluster/vignettes/systemPipeRNAseq.Rmd", 
              urlname = "rnaseq_V-cluster.Rmd")
 setwd("rnaseq")
-

Dynamic generation of workflow template

It is possible to create a new workflow structure from RStudio -menu File -> New File -> R Markdown -> From Template -> systemPipeR New WorkFlow. -This interactive option creates the same environment as demonstrated above.

-Figure 1: Selecting workflow template within RStudio.

Directory Structure

The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:

  • workflow/ (e.g. rnaseq/)
    • This is the root directory of the R session running the workflow.
    • Run script ( *.Rmd) and sample annotation (targets.txt) files are located here.
    • Note, this directory can have any name (e.g. rnaseq, varseq). Changing its name does not require any modifications in the run script(s).
    • Important subdirectories:
      • param/
        • Stores non-CWL parameter files such as: *.param, *.tmpl and *.run.sh. These files are only required for backwards compatibility to run old workflows using the previous custom command-line interface.
        • param/cwl/: This subdirectory stores all the CWL parameter files. To organize workflows, each can have its own subdirectory, where all CWL param and input.yml files need to be in the same subdirectory.
      • data/
        • FASTQ files
        • FASTA file of reference (e.g. reference genome)
        • Annotation files
        • etc.
      • results/
        • Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files
        • Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.

Note: Directory names are indicated in green. +

+

Dynamic generation of workflow template

+

It is possible to create a new workflow structure from RStudio +menu File -> New File -> R Markdown -> From Template -> systemPipeR New WorkFlow. +This interactive option creates the same environment as demonstrated above.

+

+Figure 1: Selecting workflow template within RStudio.

+

Directory Structure

+

The workflow templates generated by genWorkenvir contain the following preconfigured directory structure:

+
    +
  • workflow/ (e.g. rnaseq/) +
      +
    • This is the root directory of the R session running the workflow.
    • +
    • Run script ( *.Rmd) and sample annotation (targets.txt) files are located here.
    • +
    • Note, this directory can have any name (e.g. rnaseq, varseq). Changing its name does not require any modifications in the run script(s).
    • +
    • Important subdirectories: +
        +
      • param/ +
          +
        • Stores non-CWL parameter files such as: *.param, *.tmpl and *.run.sh. These files are only required for backwards compatibility to run old workflows using the previous custom command-line interface.
        • +
        • param/cwl/: This subdirectory stores all the CWL parameter files. To organize workflows, each can have its own subdirectory, where all CWL param and input.yml files need to be in the same subdirectory.
        • +
        +
      • +
      • data/ +
          +
        • FASTQ files
        • +
        • FASTA file of reference (e.g. reference genome)
        • +
        • Annotation files
        • +
        • etc.
        • +
        +
      • +
      • results/ +
          +
        • Analysis results are usually written to this directory, including: alignment, variant and peak files (BAM, VCF, BED); tabular result files; and image/plot files
        • +
        • Note, the user has the option to organize results files for a given sample and analysis step in a separate subdirectory.
        • +
        +
      • +
      +
    • +
    +
  • +
+

Note: Directory names are indicated in green. Users can change this structure as needed, but need to adjust the code in their workflows -accordingly.

Figure 2: systemPipeR’s preconfigured directory structure.

Run workflows

Next, run from within R the chosen sample workflow by executing the code provided +accordingly.

+
+ +
+

Figure 2: systemPipeR’s preconfigured directory structure.

+

Run workflows

+

Next, run from within R the chosen sample workflow by executing the code provided in the corresponding *.Rmd* template file. -Much more detailed information on running and customizing systemPipeR* -workflows is available in its overview vignette here. -This vignette can also be opened from R with the following command.

library("systemPipeR")  # Loads systemPipeR which needs to be installed via BiocManager::install() from Bioconductor
-
vignette("systemPipeR", package = "systemPipeR")
-

Return paths to sample data

The location of the sample data provided by systemPipeRdata can be returned as a list.

pathList()
-
## $targets
+Much more detailed information on running and customizing systemPipeR*
+workflows is available in its overview vignette here.
+This vignette can also be opened from R with the following command.

+
library("systemPipeR")  # Loads systemPipeR which needs to be installed via BiocManager::install() from Bioconductor
+
+
vignette("systemPipeR", package = "systemPipeR")
+
+

Return paths to sample data

+

The location of the sample data provided by systemPipeRdata can be returned as a list.

+
pathList()
+
+
## $targets
 ## [1] "/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/param/targets.txt"
 ## 
 ## $targetsPE
@@ -140,8 +1114,11 @@
 ## 
 ## $new
 ## [1] "/home/dcassol/src/R-devel/library/systemPipeRdata/extdata/workflows/new/"
-

Version information

sessionInfo()
-
## R Under development (unstable) (2021-02-04 r79940)
+
+

Version information

+
sessionInfo()
+
+
## R Under development (unstable) (2021-02-04 r79940)
 ## Platform: x86_64-pc-linux-gnu (64-bit)
 ## Running under: Ubuntu 20.04.2 LTS
 ## 
@@ -178,9 +1155,112 @@
 ## [21] rmarkdown_2.7.12    blogdown_1.3       
 ## [23] stringi_1.5.3       compiler_4.1.0     
 ## [25] bslib_0.2.4         jsonlite_1.7.2
-

Funding

This project was supported by funds from the National Institutes of Health (NIH) and the National Science Foundation (NSF).

References

H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spt/index.html b/public/sp/spt/index.html index 9ab7424bd..66be345e4 100644 --- a/public/sp/spt/index.html +++ b/public/sp/spt/index.html @@ -1,53 +1,1031 @@ -systemPipeTools | sysPipe
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + +
+
+ + + + + + +
+

systemPipeTools

+ + + +
+ + + + + +
+ + +
+
+ Data Visualizations +
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified 2021-04-26: fix images path; no_render (7cf5004c) +
+
+ +
+ + + +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sp/spt/index.xml b/public/sp/spt/index.xml index 23bced73f..bf9064aa9 100644 --- a/public/sp/spt/index.xml +++ b/public/sp/spt/index.xml @@ -1,64 +1,87 @@ -sysPipe – systemPipeTools/sp/spt/Recent content in systemPipeTools on sysPipeHugo -- gohugo.ioSp: Data Visualizations/sp/spt/systempipetools/Mon, 01 Jan 0001 00:00:00 +0000/sp/spt/systempipetools/ -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> -<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> -<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> -<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> -<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> -<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> -<script src="../../rmarkdown-libs/plotly-binding/plotly.js"></script> -<script src="../../rmarkdown-libs/typedarray/typedarray.min.js"></script> -<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> -<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> -<link href="../../rmarkdown-libs/plotly-htmlwidgets-css/plotly-htmlwidgets.css" rel="stylesheet" /> -<script src="../../rmarkdown-libs/plotly-main/plotly-latest.min.js"></script> -<style type="text/css"> + + + sysPipe – systemPipeTools + /sp/spt/ + Recent content in systemPipeTools on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sp: Data Visualizations + /sp/spt/systempipetools/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sp/spt/systempipetools/ + + + + <script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> +<link href="../../rmarkdown-libs/datatables-css/datatables-crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/datatables-binding/datatables.js"></script> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.min.css" rel="stylesheet" /> +<link href="../../rmarkdown-libs/dt-core/css/jquery.dataTables.extra.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-core/js/jquery.dataTables.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-fixedcolumns/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-fixedcolumns/js/dataTables.fixedColumns.min.js"></script> +<link href="../../rmarkdown-libs/dt-ext-scroller/css/scroller.dataTables.min.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/dt-ext-scroller/js/dataTables.scroller.min.js"></script> +<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> +<script src="../../rmarkdown-libs/htmlwidgets/htmlwidgets.js"></script> +<script src="../../rmarkdown-libs/plotly-binding/plotly.js"></script> +<script src="../../rmarkdown-libs/typedarray/typedarray.min.js"></script> +<script src="../../rmarkdown-libs/jquery/jquery.min.js"></script> +<link href="../../rmarkdown-libs/crosstalk/css/crosstalk.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/crosstalk/js/crosstalk.min.js"></script> +<link href="../../rmarkdown-libs/plotly-htmlwidgets-css/plotly-htmlwidgets.css" rel="stylesheet" /> +<script src="../../rmarkdown-libs/plotly-main/plotly-latest.min.js"></script> +<style type="text/css"> pre code { white-space: pre !important; overflow-x: scroll !important; word-break: keep-all !important; word-wrap: initial !important; } -</style> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -document.querySelector("h1").className = "title"; +</style> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + document.querySelector("h1").className = "title"; }); -</script> -<script type="text/javascript"> -document.addEventListener("DOMContentLoaded", function() { -var links = document.links; -for (var i = 0, linksLength = links.length; i < linksLength; i++) -if (links[i].hostname != window.location.hostname) -links[i].target = '_blank'; +</script> +<script type="text/javascript"> +document.addEventListener("DOMContentLoaded", function() { + var links = document.links; + for (var i = 0, linksLength = links.length; i < linksLength; i++) + if (links[i].hostname != window.location.hostname) + links[i].target = '_blank'; }); -</script> -<h1 id="data-visualization-with-systempiper">Data Visualization with <code>systemPipeR</code></h1> -<p><em>systemPipeTools</em> package extends the widely used <em><a href="https://systempipe.org/">systemPipeR</a></em> (SPR) (H Backman and Girke 2016) +</script> +<h1 id="data-visualization-with-systempiper">Data Visualization with <code>systemPipeR</code></h1> +<p><em>systemPipeTools</em> package extends the widely used <em><a href="https://systempipe.org/">systemPipeR</a></em> (SPR) (H Backman and Girke 2016) workflow environment with enhanced toolkit for data visualization, including utilities to automate the analysis of differentially expressed genes (DEGs). -<em>systemPipeTools</em> provides functions for data transformation and data exploration via +<em>systemPipeTools</em> provides functions for data transformation and data exploration via scatterplots, hierarchical clustering heatMaps, principal component analysis, multidimensional scaling, generalized principal components, t-Distributed Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. -All these utilities can be integrated with the modular design of the <em>systemPipeR</em> +All these utilities can be integrated with the modular design of the <em>systemPipeR</em> environment that allows users to easily substitute any of these features and/or -custom with alternatives.</p> -<h2 id="metadata-and-reads-counting-information">Metadata and Reads Counting Information</h2> -<p>The first step is importing the <code>targets</code> file and raw reads counting table.</p> -<ul> -<li>The <code>targets</code> file defines all FASTQ files and sample comparisons of the analysis workflow.</li> -<li>The raw reads counting table represents all the reads that map to gene (row) for each sample (columns).</li> -</ul> -<pre><code class="language-r">## Targets file +custom with alternatives.</p> +<h2 id="metadata-and-reads-counting-information">Metadata and Reads Counting Information</h2> +<p>The first step is importing the <code>targets</code> file and raw reads counting table.</p> +<ul> +<li>The <code>targets</code> file defines all FASTQ files and sample comparisons of the analysis workflow.</li> +<li>The raw reads counting table represents all the reads that map to gene (row) for each sample (columns).</li> +</ul> +<pre><code class="language-r">## Targets file targetspath &lt;- system.file(&quot;extdata&quot;, &quot;targets.txt&quot;, package = &quot;systemPipeR&quot;) targets &lt;- read.delim(targetspath, comment = &quot;#&quot;) cmp &lt;- systemPipeR::readComp(file = targetspath, format = &quot;matrix&quot;, delim = &quot;-&quot;) @@ -66,224 +89,230 @@ cmp &lt;- systemPipeR::readComp(file = targetspath, format = &quot;matri countMatrixPath &lt;- system.file(&quot;extdata&quot;, &quot;countDFeByg.xls&quot;, package = &quot;systemPipeR&quot;) countMatrix &lt;- read.delim(countMatrixPath, row.names = 1) showDT(countMatrix) -</code></pre> -<div id="htmlwidget-1" style="width:100%;height:auto;" class="datatables html-widget"></div> -<script type="application/json" data-for="htmlwidget-1">{"x":{"filter":"none","extensions":["FixedColumns","Scroller"],"data":[["AT1G01010","AT1G01020","AT1G01030","AT1G01040","AT1G01050","AT1G01060","AT1G01070","AT1G01073","AT1G01080","AT1G01090","AT1G01100","AT1G01110","AT1G01115","AT2G01008","AT2G01021","AT2G01023","AT3G01010","AT3G01015","AT3G01020","AT3G01030","AT3G01040","AT3G01050","AT3G01060","AT3G01070","AT3G01080","AT3G01085","AT3G01090","AT3G01100","AT3G01120","AT3G01130","AT3G01140","AT3G01150","AT3G01160","AT3G01170","AT4G00005","AT4G00020","AT4G00026","AT4G00030","AT4G00040","AT4G00050","AT4G00060","AT4G00070","AT4G00080","AT4G00090","AT4G00100","AT4G00110","AT4G00120","AT4G00124","AT4G00130","AT4G00140","AT5G01010","AT5G01015","AT5G01020","AT5G01030","AT5G01040","AT5G01050","AT5G01060","AT5G01070","AT5G01075","AT5G01080","AT5G01090","AT5G01100","AT5G01110","AT5G01120","AT5G01130","AT5G01140","AT5G01150","AT5G01160","ATCG00020","ATCG00040","ATCG00050","ATCG00070","ATCG00080","ATCG00120","ATCG00130","ATCG00140","ATCG00150","ATCG00160","ATCG00170","ATCG00180","ATCG00190","ATCG00210","ATCG00220","ATCG00270","ATCG00280","ATCG00300","ATCG00330","ATCG00340","ATCG00350","ATCG00360","ATCG00380","ATCG00420","ATCG00430","ATCG00440","ATCG00470","ATCG00480","ATCG00490","ATCG00500","ATCG00510","ATMG00010","ATMG00030","ATMG00040","ATMG00050","ATMG00060","ATMG00070","ATMG00080","ATMG00090","ATMG00110","ATMG00120","ATMG00130","ATMG00140","ATMG00150","ATMG00160","ATMG00170","ATMG00180","ATMG00200"],[57,23,41,180,60,26,0,0,98,331,230,6,0,28,6267,0,0,0,0,0,93,31,235,0,30,0,70,38,709,54,0,37,33,33,0,4,19,69,61,12,48,0,0,21,186,22,0,0,6,8,143,16,87,31,49,4,0,0,1,0,17,162,2,0,0,0,0,28,1917,9,0,5,15,52,34,36,17,7,7,5,37,6,3,105,283,4,52,147,192,1,2,7,21,12,54,180,856,8,10,2,60,11,0,0,8,7,5,6,3,1,0,0,5,3,18,0],[244,93,98,684,127,264,0,0,379,1027,432,10,0,68,3061,14,0,0,0,0,454,121,801,8,29,0,274,132,2358,140,14,126,238,131,0,25,89,106,176,138,359,0,0,59,384,78,0,0,9,6,442,26,227,170,125,7,0,4,28,0,103,1002,26,2,0,0,0,124,1696,28,3,23,50,210,127,46,53,8,39,49,145,5,83,300,723,34,103,412,480,6,21,97,312,44,339,1191,1029,13,1,0,40,56,0,3,18,18,72,27,0,4,7,1,31,15,59,3],[201,69,73,522,102,59,2,0,179,779,516,11,0,61,7559,6,0,0,0,0,364,108,553,6,151,0,315,87,2031,149,4,186,123,161,0,6,60,255,189,20,162,0,0,89,402,75,0,0,32,30,542,11,184,91,179,5,0,0,9,0,41,754,6,0,0,0,0,119,970,10,1,14,13,113,37,60,22,3,14,22,49,1,5,165,293,5,56,222,191,6,8,18,45,12,92,369,793,4,5,0,79,38,0,4,5,20,30,7,0,0,0,0,25,5,44,1],[169,126,58,664,166,56,1,0,456,1343,458,5,0,33,2203,10,0,1,0,0,578,167,674,2,14,0,373,126,2222,131,39,170,329,212,0,66,75,121,147,117,381,0,0,88,432,147,0,0,4,11,646,17,207,219,103,3,0,0,23,0,121,1185,27,2,0,0,0,127,661,19,1,59,53,190,167,42,88,14,94,68,208,16,75,212,641,45,135,530,520,10,24,147,347,34,423,1501,871,10,1,7,35,50,0,3,47,31,120,34,14,1,5,0,72,17,62,4],[365,107,94,585,125,8,6,0,287,647,468,4,0,48,3125,0,0,0,0,0,375,104,226,5,56,0,334,100,1674,242,2,138,133,110,0,16,41,127,158,23,275,0,0,56,403,81,0,0,28,30,606,4,165,97,150,7,0,0,2,0,62,819,11,2,0,0,0,103,2258,12,0,23,34,160,74,44,26,12,22,32,95,10,25,126,403,10,50,313,366,4,10,26,36,24,102,403,977,2,15,2,43,45,0,2,19,16,25,13,0,1,2,3,26,14,24,1],[229,88,156,680,303,26,6,0,538,1831,849,17,0,53,1168,3,0,1,0,0,735,146,366,6,97,0,349,203,2310,254,0,380,126,296,0,49,43,193,282,19,406,0,0,138,966,131,0,0,16,21,1031,8,463,106,427,10,2,0,5,1,89,2267,41,4,0,0,0,238,1232,6,0,24,56,277,66,33,54,11,55,61,186,3,29,250,375,23,58,509,455,1,10,63,112,15,347,984,1161,10,2,3,35,39,0,7,21,19,41,15,1,3,2,1,46,13,58,3],[41,18,9,162,116,5,2,0,102,350,522,3,0,39,12653,0,0,0,0,0,46,43,8,0,15,0,92,28,780,84,14,45,51,51,0,5,56,73,102,63,70,0,0,42,360,42,0,0,3,7,230,15,153,22,2,0,0,0,11,0,23,24,6,0,0,0,0,60,1677,4,0,5,4,37,8,41,2,0,1,11,18,2,4,63,186,2,19,121,116,0,0,7,8,2,19,73,592,0,2,1,89,19,0,2,4,8,11,5,0,1,0,0,8,6,27,2],[38,25,13,163,180,2,4,0,211,524,634,3,0,38,12386,1,0,0,0,0,76,55,59,0,25,0,139,50,1217,116,14,95,80,54,0,11,66,124,114,45,119,3,0,66,440,40,0,0,2,13,334,58,221,27,2,0,0,0,11,0,36,99,8,0,0,0,0,76,1184,6,0,1,7,42,20,18,16,1,6,15,22,2,2,59,190,4,13,152,168,0,3,11,9,1,30,163,681,2,1,0,35,37,0,4,9,4,9,3,0,1,2,0,16,8,26,2],[152,20,8,249,139,0,5,0,79,323,926,5,0,97,9799,0,0,0,0,0,80,52,13,0,72,0,148,74,1176,160,21,67,92,73,0,11,93,157,185,151,122,0,0,78,656,48,0,0,3,20,461,2,260,57,11,0,0,0,8,0,39,188,4,0,0,0,0,83,1201,0,0,1,11,41,7,23,5,0,6,2,15,2,0,56,132,2,23,75,122,0,2,4,10,4,22,93,475,4,0,0,117,31,0,5,1,5,12,7,2,1,3,0,19,9,33,0],[46,5,6,66,37,0,2,0,42,140,183,2,0,23,10386,1,0,0,0,0,23,21,1,0,7,0,48,19,270,27,7,14,20,22,0,1,12,21,48,8,43,0,0,22,113,12,0,0,1,3,109,10,50,29,2,3,0,0,1,0,13,42,0,0,0,0,0,33,1261,4,0,2,3,42,15,26,4,0,4,5,4,6,1,65,138,9,17,106,126,2,4,6,4,0,12,54,749,6,1,0,30,4,0,0,0,2,3,1,0,0,0,0,2,0,7,0],[294,88,36,697,236,0,5,0,150,600,1333,1,0,82,9414,3,0,2,0,0,162,112,14,0,57,0,236,126,1737,341,15,126,178,132,0,23,146,209,317,158,210,0,0,191,1005,46,0,0,12,22,731,0,423,100,7,0,0,0,12,0,68,277,5,0,0,0,0,128,1192,1,0,2,9,52,9,28,8,3,1,7,22,2,3,83,172,4,25,112,112,1,0,11,14,6,29,110,446,2,4,3,101,56,0,5,10,9,20,14,0,1,1,0,36,9,44,2],[405,151,147,1060,679,4,13,0,551,1693,2401,16,0,112,3265,4,0,0,0,0,260,292,41,2,33,0,468,280,2768,376,50,299,278,112,0,36,175,337,471,169,463,2,0,334,1831,107,0,0,12,13,1229,53,903,127,12,3,0,0,32,0,168,146,33,0,0,0,0,266,398,6,0,4,11,75,26,18,18,3,17,11,67,2,3,71,176,7,28,163,186,2,7,18,23,4,52,345,493,0,4,0,43,88,0,8,25,18,39,14,4,11,4,0,54,20,53,2],[117,43,32,338,362,89,9,0,250,800,762,7,0,142,6908,6,0,0,0,0,143,53,103,0,27,0,257,128,1998,110,52,130,65,95,0,19,38,245,362,472,298,0,0,74,703,51,0,0,5,23,449,6,732,62,2,0,0,0,12,0,46,42,2,2,0,0,0,157,1406,8,0,11,6,51,13,9,5,0,5,13,28,2,2,100,126,2,2,128,194,1,3,12,30,2,63,270,445,2,0,0,64,6,0,1,9,18,6,7,0,0,5,1,21,7,25,1],[139,74,29,604,746,203,43,0,612,1662,1805,38,0,230,3676,2,0,0,0,0,131,211,178,4,34,0,390,194,1861,323,81,191,125,93,0,28,132,397,598,499,414,1,0,166,1319,117,0,0,11,29,861,65,1008,100,2,0,0,2,29,0,128,80,35,0,0,0,0,274,473,0,0,3,16,91,32,23,13,0,5,19,51,2,7,65,167,1,26,121,132,1,0,8,23,1,65,346,377,0,0,0,75,49,0,2,20,16,23,25,1,5,7,0,29,10,26,0],[132,33,12,360,194,118,8,0,78,281,761,4,0,85,11154,2,0,0,0,0,79,87,39,2,88,0,176,121,781,184,19,74,59,80,0,11,52,164,203,239,176,0,0,91,600,37,0,0,6,13,599,2,265,70,0,0,0,0,5,0,41,85,0,0,0,0,0,91,1136,0,0,6,11,34,12,38,10,0,2,9,9,2,2,48,135,3,15,88,108,1,0,2,6,3,25,82,429,2,0,0,114,23,0,5,6,4,10,2,0,4,0,0,16,6,17,0],[64,18,9,80,50,24,0,0,26,122,102,0,0,18,3301,0,0,0,0,0,34,25,6,0,13,0,32,24,219,51,13,20,26,19,0,1,13,22,37,12,48,0,0,20,106,10,0,0,1,2,121,1,95,21,2,0,0,0,3,0,14,33,0,0,0,0,0,38,1860,8,0,3,4,40,26,13,0,0,1,4,1,5,0,61,259,1,28,147,176,2,3,21,11,0,17,84,662,2,2,1,23,15,0,2,9,3,1,3,1,1,0,0,5,0,8,0],[230,43,70,203,214,62,9,0,78,391,627,0,0,100,9421,5,0,0,0,0,105,43,52,0,56,0,127,79,734,97,18,70,28,61,0,4,33,92,112,178,140,0,0,93,565,17,0,0,1,5,331,4,283,29,0,0,0,0,9,0,33,155,4,0,0,0,0,118,1336,0,0,8,4,27,5,8,8,6,2,10,7,1,4,52,112,1,10,81,106,1,0,8,19,3,37,140,440,2,2,0,66,10,0,7,7,5,13,7,0,3,6,1,16,0,28,2],[120,31,85,171,181,32,1,0,55,273,476,4,0,46,8486,2,0,0,0,0,55,24,24,0,33,0,76,45,291,98,12,42,39,29,0,4,26,57,69,59,62,0,0,51,362,17,0,0,1,5,207,3,195,28,1,0,0,0,4,0,17,67,3,0,0,0,0,86,1236,3,0,1,5,39,14,31,12,0,2,2,18,5,1,48,172,0,14,118,118,0,7,0,8,1,19,116,529,4,0,0,46,18,0,3,3,4,5,6,0,0,2,2,12,2,10,0]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>M1A<\/th>\n <th>M1B<\/th>\n <th>A1A<\/th>\n <th>A1B<\/th>\n <th>V1A<\/th>\n <th>V1B<\/th>\n <th>M6A<\/th>\n <th>M6B<\/th>\n <th>A6A<\/th>\n <th>A6B<\/th>\n <th>V6A<\/th>\n <th>V6B<\/th>\n <th>M12A<\/th>\n <th>M12B<\/th>\n <th>A12A<\/th>\n <th>A12B<\/th>\n <th>V12A<\/th>\n <th>V12B<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> -<h2 id="data-transformation">Data Transformation</h2> -<p>For gene differential expression, raw counts are required, however for data +</code></pre> +<div id="htmlwidget-1" style="width:100%;height:auto;" class="datatables html-widget"></div> +<script type="application/json" data-for="htmlwidget-1">{"x":{"filter":"none","extensions":["FixedColumns","Scroller"],"data":[["AT1G01010","AT1G01020","AT1G01030","AT1G01040","AT1G01050","AT1G01060","AT1G01070","AT1G01073","AT1G01080","AT1G01090","AT1G01100","AT1G01110","AT1G01115","AT2G01008","AT2G01021","AT2G01023","AT3G01010","AT3G01015","AT3G01020","AT3G01030","AT3G01040","AT3G01050","AT3G01060","AT3G01070","AT3G01080","AT3G01085","AT3G01090","AT3G01100","AT3G01120","AT3G01130","AT3G01140","AT3G01150","AT3G01160","AT3G01170","AT4G00005","AT4G00020","AT4G00026","AT4G00030","AT4G00040","AT4G00050","AT4G00060","AT4G00070","AT4G00080","AT4G00090","AT4G00100","AT4G00110","AT4G00120","AT4G00124","AT4G00130","AT4G00140","AT5G01010","AT5G01015","AT5G01020","AT5G01030","AT5G01040","AT5G01050","AT5G01060","AT5G01070","AT5G01075","AT5G01080","AT5G01090","AT5G01100","AT5G01110","AT5G01120","AT5G01130","AT5G01140","AT5G01150","AT5G01160","ATCG00020","ATCG00040","ATCG00050","ATCG00070","ATCG00080","ATCG00120","ATCG00130","ATCG00140","ATCG00150","ATCG00160","ATCG00170","ATCG00180","ATCG00190","ATCG00210","ATCG00220","ATCG00270","ATCG00280","ATCG00300","ATCG00330","ATCG00340","ATCG00350","ATCG00360","ATCG00380","ATCG00420","ATCG00430","ATCG00440","ATCG00470","ATCG00480","ATCG00490","ATCG00500","ATCG00510","ATMG00010","ATMG00030","ATMG00040","ATMG00050","ATMG00060","ATMG00070","ATMG00080","ATMG00090","ATMG00110","ATMG00120","ATMG00130","ATMG00140","ATMG00150","ATMG00160","ATMG00170","ATMG00180","ATMG00200"],[57,23,41,180,60,26,0,0,98,331,230,6,0,28,6267,0,0,0,0,0,93,31,235,0,30,0,70,38,709,54,0,37,33,33,0,4,19,69,61,12,48,0,0,21,186,22,0,0,6,8,143,16,87,31,49,4,0,0,1,0,17,162,2,0,0,0,0,28,1917,9,0,5,15,52,34,36,17,7,7,5,37,6,3,105,283,4,52,147,192,1,2,7,21,12,54,180,856,8,10,2,60,11,0,0,8,7,5,6,3,1,0,0,5,3,18,0],[244,93,98,684,127,264,0,0,379,1027,432,10,0,68,3061,14,0,0,0,0,454,121,801,8,29,0,274,132,2358,140,14,126,238,131,0,25,89,106,176,138,359,0,0,59,384,78,0,0,9,6,442,26,227,170,125,7,0,4,28,0,103,1002,26,2,0,0,0,124,1696,28,3,23,50,210,127,46,53,8,39,49,145,5,83,300,723,34,103,412,480,6,21,97,312,44,339,1191,1029,13,1,0,40,56,0,3,18,18,72,27,0,4,7,1,31,15,59,3],[201,69,73,522,102,59,2,0,179,779,516,11,0,61,7559,6,0,0,0,0,364,108,553,6,151,0,315,87,2031,149,4,186,123,161,0,6,60,255,189,20,162,0,0,89,402,75,0,0,32,30,542,11,184,91,179,5,0,0,9,0,41,754,6,0,0,0,0,119,970,10,1,14,13,113,37,60,22,3,14,22,49,1,5,165,293,5,56,222,191,6,8,18,45,12,92,369,793,4,5,0,79,38,0,4,5,20,30,7,0,0,0,0,25,5,44,1],[169,126,58,664,166,56,1,0,456,1343,458,5,0,33,2203,10,0,1,0,0,578,167,674,2,14,0,373,126,2222,131,39,170,329,212,0,66,75,121,147,117,381,0,0,88,432,147,0,0,4,11,646,17,207,219,103,3,0,0,23,0,121,1185,27,2,0,0,0,127,661,19,1,59,53,190,167,42,88,14,94,68,208,16,75,212,641,45,135,530,520,10,24,147,347,34,423,1501,871,10,1,7,35,50,0,3,47,31,120,34,14,1,5,0,72,17,62,4],[365,107,94,585,125,8,6,0,287,647,468,4,0,48,3125,0,0,0,0,0,375,104,226,5,56,0,334,100,1674,242,2,138,133,110,0,16,41,127,158,23,275,0,0,56,403,81,0,0,28,30,606,4,165,97,150,7,0,0,2,0,62,819,11,2,0,0,0,103,2258,12,0,23,34,160,74,44,26,12,22,32,95,10,25,126,403,10,50,313,366,4,10,26,36,24,102,403,977,2,15,2,43,45,0,2,19,16,25,13,0,1,2,3,26,14,24,1],[229,88,156,680,303,26,6,0,538,1831,849,17,0,53,1168,3,0,1,0,0,735,146,366,6,97,0,349,203,2310,254,0,380,126,296,0,49,43,193,282,19,406,0,0,138,966,131,0,0,16,21,1031,8,463,106,427,10,2,0,5,1,89,2267,41,4,0,0,0,238,1232,6,0,24,56,277,66,33,54,11,55,61,186,3,29,250,375,23,58,509,455,1,10,63,112,15,347,984,1161,10,2,3,35,39,0,7,21,19,41,15,1,3,2,1,46,13,58,3],[41,18,9,162,116,5,2,0,102,350,522,3,0,39,12653,0,0,0,0,0,46,43,8,0,15,0,92,28,780,84,14,45,51,51,0,5,56,73,102,63,70,0,0,42,360,42,0,0,3,7,230,15,153,22,2,0,0,0,11,0,23,24,6,0,0,0,0,60,1677,4,0,5,4,37,8,41,2,0,1,11,18,2,4,63,186,2,19,121,116,0,0,7,8,2,19,73,592,0,2,1,89,19,0,2,4,8,11,5,0,1,0,0,8,6,27,2],[38,25,13,163,180,2,4,0,211,524,634,3,0,38,12386,1,0,0,0,0,76,55,59,0,25,0,139,50,1217,116,14,95,80,54,0,11,66,124,114,45,119,3,0,66,440,40,0,0,2,13,334,58,221,27,2,0,0,0,11,0,36,99,8,0,0,0,0,76,1184,6,0,1,7,42,20,18,16,1,6,15,22,2,2,59,190,4,13,152,168,0,3,11,9,1,30,163,681,2,1,0,35,37,0,4,9,4,9,3,0,1,2,0,16,8,26,2],[152,20,8,249,139,0,5,0,79,323,926,5,0,97,9799,0,0,0,0,0,80,52,13,0,72,0,148,74,1176,160,21,67,92,73,0,11,93,157,185,151,122,0,0,78,656,48,0,0,3,20,461,2,260,57,11,0,0,0,8,0,39,188,4,0,0,0,0,83,1201,0,0,1,11,41,7,23,5,0,6,2,15,2,0,56,132,2,23,75,122,0,2,4,10,4,22,93,475,4,0,0,117,31,0,5,1,5,12,7,2,1,3,0,19,9,33,0],[46,5,6,66,37,0,2,0,42,140,183,2,0,23,10386,1,0,0,0,0,23,21,1,0,7,0,48,19,270,27,7,14,20,22,0,1,12,21,48,8,43,0,0,22,113,12,0,0,1,3,109,10,50,29,2,3,0,0,1,0,13,42,0,0,0,0,0,33,1261,4,0,2,3,42,15,26,4,0,4,5,4,6,1,65,138,9,17,106,126,2,4,6,4,0,12,54,749,6,1,0,30,4,0,0,0,2,3,1,0,0,0,0,2,0,7,0],[294,88,36,697,236,0,5,0,150,600,1333,1,0,82,9414,3,0,2,0,0,162,112,14,0,57,0,236,126,1737,341,15,126,178,132,0,23,146,209,317,158,210,0,0,191,1005,46,0,0,12,22,731,0,423,100,7,0,0,0,12,0,68,277,5,0,0,0,0,128,1192,1,0,2,9,52,9,28,8,3,1,7,22,2,3,83,172,4,25,112,112,1,0,11,14,6,29,110,446,2,4,3,101,56,0,5,10,9,20,14,0,1,1,0,36,9,44,2],[405,151,147,1060,679,4,13,0,551,1693,2401,16,0,112,3265,4,0,0,0,0,260,292,41,2,33,0,468,280,2768,376,50,299,278,112,0,36,175,337,471,169,463,2,0,334,1831,107,0,0,12,13,1229,53,903,127,12,3,0,0,32,0,168,146,33,0,0,0,0,266,398,6,0,4,11,75,26,18,18,3,17,11,67,2,3,71,176,7,28,163,186,2,7,18,23,4,52,345,493,0,4,0,43,88,0,8,25,18,39,14,4,11,4,0,54,20,53,2],[117,43,32,338,362,89,9,0,250,800,762,7,0,142,6908,6,0,0,0,0,143,53,103,0,27,0,257,128,1998,110,52,130,65,95,0,19,38,245,362,472,298,0,0,74,703,51,0,0,5,23,449,6,732,62,2,0,0,0,12,0,46,42,2,2,0,0,0,157,1406,8,0,11,6,51,13,9,5,0,5,13,28,2,2,100,126,2,2,128,194,1,3,12,30,2,63,270,445,2,0,0,64,6,0,1,9,18,6,7,0,0,5,1,21,7,25,1],[139,74,29,604,746,203,43,0,612,1662,1805,38,0,230,3676,2,0,0,0,0,131,211,178,4,34,0,390,194,1861,323,81,191,125,93,0,28,132,397,598,499,414,1,0,166,1319,117,0,0,11,29,861,65,1008,100,2,0,0,2,29,0,128,80,35,0,0,0,0,274,473,0,0,3,16,91,32,23,13,0,5,19,51,2,7,65,167,1,26,121,132,1,0,8,23,1,65,346,377,0,0,0,75,49,0,2,20,16,23,25,1,5,7,0,29,10,26,0],[132,33,12,360,194,118,8,0,78,281,761,4,0,85,11154,2,0,0,0,0,79,87,39,2,88,0,176,121,781,184,19,74,59,80,0,11,52,164,203,239,176,0,0,91,600,37,0,0,6,13,599,2,265,70,0,0,0,0,5,0,41,85,0,0,0,0,0,91,1136,0,0,6,11,34,12,38,10,0,2,9,9,2,2,48,135,3,15,88,108,1,0,2,6,3,25,82,429,2,0,0,114,23,0,5,6,4,10,2,0,4,0,0,16,6,17,0],[64,18,9,80,50,24,0,0,26,122,102,0,0,18,3301,0,0,0,0,0,34,25,6,0,13,0,32,24,219,51,13,20,26,19,0,1,13,22,37,12,48,0,0,20,106,10,0,0,1,2,121,1,95,21,2,0,0,0,3,0,14,33,0,0,0,0,0,38,1860,8,0,3,4,40,26,13,0,0,1,4,1,5,0,61,259,1,28,147,176,2,3,21,11,0,17,84,662,2,2,1,23,15,0,2,9,3,1,3,1,1,0,0,5,0,8,0],[230,43,70,203,214,62,9,0,78,391,627,0,0,100,9421,5,0,0,0,0,105,43,52,0,56,0,127,79,734,97,18,70,28,61,0,4,33,92,112,178,140,0,0,93,565,17,0,0,1,5,331,4,283,29,0,0,0,0,9,0,33,155,4,0,0,0,0,118,1336,0,0,8,4,27,5,8,8,6,2,10,7,1,4,52,112,1,10,81,106,1,0,8,19,3,37,140,440,2,2,0,66,10,0,7,7,5,13,7,0,3,6,1,16,0,28,2],[120,31,85,171,181,32,1,0,55,273,476,4,0,46,8486,2,0,0,0,0,55,24,24,0,33,0,76,45,291,98,12,42,39,29,0,4,26,57,69,59,62,0,0,51,362,17,0,0,1,5,207,3,195,28,1,0,0,0,4,0,17,67,3,0,0,0,0,86,1236,3,0,1,5,39,14,31,12,0,2,2,18,5,1,48,172,0,14,118,118,0,7,0,8,1,19,116,529,4,0,0,46,18,0,3,3,4,5,6,0,0,2,2,12,2,10,0]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>M1A<\/th>\n <th>M1B<\/th>\n <th>A1A<\/th>\n <th>A1B<\/th>\n <th>V1A<\/th>\n <th>V1B<\/th>\n <th>M6A<\/th>\n <th>M6B<\/th>\n <th>A6A<\/th>\n <th>A6B<\/th>\n <th>V6A<\/th>\n <th>V6B<\/th>\n <th>M12A<\/th>\n <th>M12B<\/th>\n <th>A12A<\/th>\n <th>A12B<\/th>\n <th>V12A<\/th>\n <th>V12B<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"scrollX":true,"fixedColumns":true,"deferRender":true,"scrollY":200,"scroller":true,"columnDefs":[{"className":"dt-right","targets":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script> +<h2 id="data-transformation">Data Transformation</h2> +<p>For gene differential expression, raw counts are required, however for data visualization or clustering, it can be useful to work with transformed count data. -<code>exploreDDS</code> function is convenience wrapper to transform raw read counts using the -<a href="@Love2014-sh"><code>DESeq2</code></a> package transformations methods. The input file +<code>exploreDDS</code> function is convenience wrapper to transform raw read counts using the +<a href="@Love2014-sh"><code>DESeq2</code></a> package transformations methods. The input file has to contain all the genes, not just differentially expressed ones. Supported -methods include variance stabilizing transformation (<code>vst</code>) (Anders and Huber (2010)), and -regularized-logarithm transformation or <code>rlog</code> (Love, Huber, and Anders (2014)).</p> -<pre><code class="language-r">exploredds &lt;- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, -transformationMethod = &quot;rlog&quot;) +methods include variance stabilizing transformation (<code>vst</code>) (Anders and Huber (2010)), and +regularized-logarithm transformation or <code>rlog</code> (Love, Huber, and Anders (2014)).</p> +<pre><code class="language-r">exploredds &lt;- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, + transformationMethod = &quot;rlog&quot;) exploredds -</code></pre> -<pre><code>## class: DESeqTransform -## dim: 116 18 +</code></pre> +<pre><code>## class: DESeqTransform +## dim: 116 18 ## metadata(1): version -## assays(1): '' +## assays(1): '' ## rownames(116): AT1G01010 AT1G01020 ... ATMG00180 ATMG00200 ## rowData names(51): baseMean baseVar ... dispFit rlogIntercept ## colnames(18): M1A M1B ... V12A V12B ## colData names(2): condition sizeFactor -</code></pre> -<p>Users are strongly encouraged to consult the <a href="@Love2014-sh"><code>DESeq2</code></a> vignette for -more detailed information on this topic and how to properly run <code>DESeq2</code> on data -sets with more complex experimental designs.</p> -<h2 id="scatterplot">Scatterplot</h2> -<p>To decide which transformation to choose, we can visualize the transformation effect -comparing two samples or a grid of all samples, as follows:</p> -<pre><code class="language-r">exploreDDSplot(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, samples = c(&quot;M12A&quot;, -&quot;M12A&quot;, &quot;A12A&quot;, &quot;A12A&quot;), scattermatrix = TRUE) -</code></pre> -<pre><code>## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. +</code></pre> +<p>Users are strongly encouraged to consult the <a href="@Love2014-sh"><code>DESeq2</code></a> vignette for +more detailed information on this topic and how to properly run <code>DESeq2</code> on data +sets with more complex experimental designs.</p> +<h2 id="scatterplot">Scatterplot</h2> +<p>To decide which transformation to choose, we can visualize the transformation effect +comparing two samples or a grid of all samples, as follows:</p> +<pre><code class="language-r">exploreDDSplot(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, samples = c(&quot;M12A&quot;, + &quot;M12A&quot;, &quot;A12A&quot;, &quot;A12A&quot;), scattermatrix = TRUE) +</code></pre> +<pre><code>## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/exploreDDSplot-1.png" width="672" /></p> -<p>The scatterplots are created using the log2 transform normalized reads count, +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/exploreDDSplot-1.png" width="672" /></p> +<p>The scatterplots are created using the log2 transform normalized reads count, variance stabilizing transformation (VST) (Anders and Huber (2010)), and -regularized-logarithm transformation or <code>rlog</code> (Love, Huber, and Anders (2014)).</p> -<h2 id="hierarchical-clustering-dendrogram">Hierarchical Clustering Dendrogram</h2> -<p>The following computes the sample-wise correlation coefficients using the <code>stats::cor()</code> +regularized-logarithm transformation or <code>rlog</code> (Love, Huber, and Anders (2014)).</p> +<h2 id="hierarchical-clustering-dendrogram">Hierarchical Clustering Dendrogram</h2> +<p>The following computes the sample-wise correlation coefficients using the <code>stats::cor()</code> function from the transformed expression values. After transformation to a -distance matrix, hierarchical clustering is performed with the <code>stats::hclust</code> -function and the result is plotted as a dendrogram, as follows:</p> -<pre><code class="language-r">hclustplot(exploredds, method = &quot;spearman&quot;) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/hclustplot-1.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="hierarchical-clustering-heatmap">Hierarchical Clustering HeatMap</h2> -<p>This function performs hierarchical clustering on the transformed expression -matrix generated within the <code>DESeq2</code> package. It uses, by default, a <code>Pearson</code> +distance matrix, hierarchical clustering is performed with the <code>stats::hclust</code> +function and the result is plotted as a dendrogram, as follows:</p> +<pre><code class="language-r">hclustplot(exploredds, method = &quot;spearman&quot;) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/hclustplot-1.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="hierarchical-clustering-heatmap">Hierarchical Clustering HeatMap</h2> +<p>This function performs hierarchical clustering on the transformed expression +matrix generated within the <code>DESeq2</code> package. It uses, by default, a <code>Pearson</code> correlation-based distance measure and complete linkage for cluster join. -If <code>samples</code> selected in the <code>clust</code> argument, it will be applied the <code>stats::dist()</code> +If <code>samples</code> selected in the <code>clust</code> argument, it will be applied the <code>stats::dist()</code> function to the transformed count matrix to get sample-to-sample distances. Also, -it is possible to generate the <code>pheatmap</code> or <code>plotly</code> plot format.</p> -<pre><code class="language-r">## Samples plot +it is possible to generate the <code>pheatmap</code> or <code>plotly</code> plot format.</p> +<pre><code class="language-r">## Samples plot heatMaplot(exploredds, clust = &quot;samples&quot;, plotly = TRUE) -</code></pre> -<div id="htmlwidget-2" style="width:672px;height:480px;" class="plotly html-widget"></div> -<script type="application/json" data-for="htmlwidget-2">{"x":{"visdat":{"34341250a552":["function () ","plotlyVisDat"]},"cur_data":"34341250a552","attrs":{"34341250a552":{"x":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"y":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"z":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],"alpha_stroke":1,"sizes":[10,100],"spans":[1,20],"type":"heatmap"}},"layout":{"margin":{"b":40,"l":60,"t":25,"r":10},"xaxis":{"domain":[0,1],"automargin":true,"title":[]},"yaxis":{"domain":[0,1],"automargin":true,"title":[]},"scene":{"zaxis":{"title":[]}},"hovermode":"closest","showlegend":false,"legend":{"yanchor":"top","y":0.5}},"source":"A","config":{"showSendToCloud":false},"data":[{"colorbar":{"title":"","ticklen":2,"len":0.5,"lenmode":"fraction","y":1,"yanchor":"top"},"colorscale":[["0","rgba(68,1,84,1)"],["0.0416666666666667","rgba(70,19,97,1)"],["0.0833333333333333","rgba(72,32,111,1)"],["0.125","rgba(71,45,122,1)"],["0.166666666666667","rgba(68,58,128,1)"],["0.208333333333333","rgba(64,70,135,1)"],["0.25","rgba(60,82,138,1)"],["0.291666666666667","rgba(56,93,140,1)"],["0.333333333333333","rgba(49,104,142,1)"],["0.375","rgba(46,114,142,1)"],["0.416666666666667","rgba(42,123,142,1)"],["0.458333333333333","rgba(38,133,141,1)"],["0.5","rgba(37,144,140,1)"],["0.541666666666667","rgba(33,154,138,1)"],["0.583333333333333","rgba(39,164,133,1)"],["0.625","rgba(47,174,127,1)"],["0.666666666666667","rgba(53,183,121,1)"],["0.708333333333333","rgba(79,191,110,1)"],["0.75","rgba(98,199,98,1)"],["0.791666666666667","rgba(119,207,85,1)"],["0.833333333333333","rgba(147,214,70,1)"],["0.875","rgba(172,220,52,1)"],["0.916666666666667","rgba(199,225,42,1)"],["0.958333333333333","rgba(226,228,40,1)"],["1","rgba(253,231,37,1)"]],"showscale":true,"x":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"y":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"z":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],"type":"heatmap","xaxis":"x","yaxis":"y","frame":null}],"highlight":{"on":"plotly_click","persistent":false,"dynamic":false,"selectize":false,"opacityDim":0.2,"selected":{"opacity":1},"debounce":0},"shinyEvents":["plotly_hover","plotly_click","plotly_selected","plotly_relayout","plotly_brushed","plotly_brushing","plotly_clickannotation","plotly_doubleclick","plotly_deselect","plotly_afterplot","plotly_sunburstclick"],"base_url":"https://plot.ly"},"evals":[],"jsHooks":[]}</script> -<p>If <code>ind</code> selected in the <code>clust</code> argument, it is necessary to provide the list of -differentially expressed genes for the <code>exploredds</code> subset.</p> -<pre><code class="language-r">## Individuals genes identified in DEG analysis DEG analysis with `systemPipeR` -degseqDF &lt;- systemPipeR::run_DESeq2(countDF = countMatrix, targets = targets, cmp = cmp[[1]], -independent = FALSE) +</code></pre> +<div id="htmlwidget-2" style="width:672px;height:480px;" class="plotly html-widget"></div> +<script type="application/json" data-for="htmlwidget-2">{"x":{"visdat":{"34341250a552":["function () ","plotlyVisDat"]},"cur_data":"34341250a552","attrs":{"34341250a552":{"x":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"y":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"z":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],"alpha_stroke":1,"sizes":[10,100],"spans":[1,20],"type":"heatmap"}},"layout":{"margin":{"b":40,"l":60,"t":25,"r":10},"xaxis":{"domain":[0,1],"automargin":true,"title":[]},"yaxis":{"domain":[0,1],"automargin":true,"title":[]},"scene":{"zaxis":{"title":[]}},"hovermode":"closest","showlegend":false,"legend":{"yanchor":"top","y":0.5}},"source":"A","config":{"showSendToCloud":false},"data":[{"colorbar":{"title":"","ticklen":2,"len":0.5,"lenmode":"fraction","y":1,"yanchor":"top"},"colorscale":[["0","rgba(68,1,84,1)"],["0.0416666666666667","rgba(70,19,97,1)"],["0.0833333333333333","rgba(72,32,111,1)"],["0.125","rgba(71,45,122,1)"],["0.166666666666667","rgba(68,58,128,1)"],["0.208333333333333","rgba(64,70,135,1)"],["0.25","rgba(60,82,138,1)"],["0.291666666666667","rgba(56,93,140,1)"],["0.333333333333333","rgba(49,104,142,1)"],["0.375","rgba(46,114,142,1)"],["0.416666666666667","rgba(42,123,142,1)"],["0.458333333333333","rgba(38,133,141,1)"],["0.5","rgba(37,144,140,1)"],["0.541666666666667","rgba(33,154,138,1)"],["0.583333333333333","rgba(39,164,133,1)"],["0.625","rgba(47,174,127,1)"],["0.666666666666667","rgba(53,183,121,1)"],["0.708333333333333","rgba(79,191,110,1)"],["0.75","rgba(98,199,98,1)"],["0.791666666666667","rgba(119,207,85,1)"],["0.833333333333333","rgba(147,214,70,1)"],["0.875","rgba(172,220,52,1)"],["0.916666666666667","rgba(199,225,42,1)"],["0.958333333333333","rgba(226,228,40,1)"],["1","rgba(253,231,37,1)"]],"showscale":true,"x":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"y":["M1A","M1B","A1A","A1B","V1A","V1B","M6A","M6B","A6A","A6B","V6A","V6B","M12A","M12B","A12A","A12B","V12A","V12B"],"z":[[0,7.04650716301563,5.70678310405774,8.20976445672658,5.82667776225818,7.3279781790244,8.39986657356742,8.16733063204217,9.58637200173571,7.68841587215867,10.1640441508758,10.7676019921496,10.0039632569807,11.32498784981,9.8146750121175,7.74473230078491,9.45716343166999,7.95378561107353],[7.04650716301563,0,6.66154862259465,4.25865887783483,6.67960023884926,6.26668680998727,9.91630309634838,9.25451827523275,10.9564120825428,9.93575571094716,11.099388064366,10.6754670535994,9.90683653800534,10.9561298226477,10.7399675586854,9.18116169782986,9.77109863659917,9.40323019102986],[5.70678310405774,6.66154862259465,0,7.98994675562316,4.94593038167375,5.72836463615867,8.11235158724083,7.65256178153187,8.15065142907597,8.76007256265634,8.30988507282082,8.91309701678265,8.66629724080143,9.82426010379448,8.30870129249907,8.54268071001664,8.35323474316893,7.70897398227057],[8.20976445672658,4.25865887783483,7.98994675562316,0,6.99532785790822,6.43469620310431,10.4096764476556,9.51652950962973,11.1939050957909,10.4627147426448,11.1689702900908,10.546647320753,10.5708484745604,11.5547562063225,11.6160197603858,9.88406363111819,10.7020155017471,10.4675703563444],[5.82667776225818,6.67960023884926,4.94593038167375,6.99532785790822,0,4.8575131388009,8.46288752842871,8.0319315058583,8.726172089783,8.73161790330149,8.27286514155669,8.88152783442813,9.62675093908279,10.8109068917939,9.50867890759956,8.56129430593498,9.21166728284744,8.48571139105286],[7.3279781790244,6.26668680998727,5.72836463615867,6.43469620310431,4.8575131388009,0,10.051631844146,8.92833694901717,9.88801350128227,10.1968579735558,9.80606329541741,9.47694677716336,10.2032985748696,10.9502439173503,10.7118343889731,10.2485736407499,9.95124988126944,9.6455696901528],[8.39986657356742,9.91630309634838,8.11235158724083,10.4096764476556,8.46288752842871,10.051631844146,0,4.32289188181976,5.45401419571659,6.66929785847857,5.82333805363524,6.89960979808065,6.60846441830892,7.49378480640748,6.09490379797155,6.92856692552639,6.73658240504653,6.04084631483171],[8.16733063204217,9.25451827523275,7.65256178153187,9.51652950962973,8.0319315058583,8.92833694901717,4.32289188181976,0,5.86548263173596,6.92170483627566,6.43771467140554,5.936553276735,6.66918890392232,7.10201521498403,6.87338305585792,7.70858313971616,6.93977726065822,6.12205683109543],[9.58637200173571,10.9564120825428,8.15065142907597,11.1939050957909,8.726172089783,9.88801350128227,5.45401419571659,5.86548263173596,0,8.10337075683393,4.02970654063498,6.37598537189006,6.96355226928132,7.79890861008178,5.50539366529938,8.64913887544163,6.82883422186719,6.22801929982399],[7.68841587215867,9.93575571094716,8.76007256265634,10.4627147426448,8.73161790330149,10.1968579735558,6.66929785847857,6.92170483627566,8.10337075683393,0,9.22853479532283,10.1030591897721,9.35527845594351,11.0912154866989,8.92785474831708,6.32121021712703,9.14034499886722,7.20502415178336],[10.1640441508758,11.099388064366,8.30988507282082,11.1689702900908,8.27286514155669,9.80606329541741,5.82333805363524,6.43771467140554,4.02970654063498,9.22853479532283,0,5.40796455622463,7.23562402229216,8.05893271349359,5.83000947413891,8.94623155465764,6.52802367477244,6.94139936721835],[10.7676019921496,10.6754670535994,8.91309701678265,10.546647320753,8.88152783442813,9.47694677716336,6.89960979808065,5.936553276735,6.37598537189006,10.1030591897721,5.40796455622463,0,7.14309602773391,6.1610771391521,7.4911181113735,10.0381028337193,7.56298264238769,7.68916986877059],[10.0039632569807,9.90683653800534,8.66629724080143,10.5708484745604,9.62675093908279,10.2032985748696,6.60846441830892,6.66918890392232,6.96355226928132,9.35527845594351,7.23562402229216,7.14309602773391,0,5.69259437645614,5.58694500597765,8.50447659713418,5.53119139458227,6.33933832045536],[11.32498784981,10.9561298226477,9.82426010379448,11.5547562063225,10.8109068917939,10.9502439173503,7.49378480640748,7.10201521498403,7.79890861008178,11.0912154866989,8.05893271349359,6.1610771391521,5.69259437645614,0,6.42494730487994,10.5078546330517,7.19994521380774,7.82561653509729],[9.8146750121175,10.7399675586854,8.30870129249907,11.6160197603858,9.50867890759956,10.7118343889731,6.09490379797155,6.87338305585792,5.50539366529938,8.92785474831708,5.83000947413891,7.4911181113735,5.58694500597765,6.42494730487994,0,8.18110233128943,5.25899641633563,5.72577800197228],[7.74473230078491,9.18116169782986,8.54268071001664,9.88406363111819,8.56129430593498,10.2485736407499,6.92856692552639,7.70858313971616,8.64913887544163,6.32121021712703,8.94623155465764,10.0381028337193,8.50447659713418,10.5078546330517,8.18110233128943,0,7.99272460895717,6.58008064549415],[9.45716343166999,9.77109863659917,8.35323474316893,10.7020155017471,9.21166728284744,9.95124988126944,6.73658240504653,6.93977726065822,6.82883422186719,9.14034499886722,6.52802367477244,7.56298264238769,5.53119139458227,7.19994521380774,5.25899641633563,7.99272460895717,0,5.56397338345294],[7.95378561107353,9.40323019102986,7.70897398227057,10.4675703563444,8.48571139105286,9.6455696901528,6.04084631483171,6.12205683109543,6.22801929982399,7.20502415178336,6.94139936721835,7.68916986877059,6.33933832045536,7.82561653509729,5.72577800197228,6.58008064549415,5.56397338345294,0]],"type":"heatmap","xaxis":"x","yaxis":"y","frame":null}],"highlight":{"on":"plotly_click","persistent":false,"dynamic":false,"selectize":false,"opacityDim":0.2,"selected":{"opacity":1},"debounce":0},"shinyEvents":["plotly_hover","plotly_click","plotly_selected","plotly_relayout","plotly_brushed","plotly_brushing","plotly_clickannotation","plotly_doubleclick","plotly_deselect","plotly_afterplot","plotly_sunburstclick"],"base_url":"https://plot.ly"},"evals":[],"jsHooks":[]}</script> +<p>If <code>ind</code> selected in the <code>clust</code> argument, it is necessary to provide the list of +differentially expressed genes for the <code>exploredds</code> subset.</p> +<pre><code class="language-r">## Individuals genes identified in DEG analysis DEG analysis with `systemPipeR` +degseqDF &lt;- systemPipeR::run_DESeq2(countDF = countMatrix, targets = targets, cmp = cmp[[1]], + independent = FALSE) DEG_list &lt;- systemPipeR::filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10)) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/heatMaplot_DEG-1.png" width="672" /></p> -<pre><code class="language-r">### Plot +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/heatMaplot_DEG-1.png" width="672" /></p> +<pre><code class="language-r">### Plot heatMaplot(exploredds, clust = &quot;ind&quot;, DEGlist = unique(as.character(unlist(DEG_list[[1]])))) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/heatMaplot_DEG-2.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="principal-component-analysis">Principal Component Analysis</h2> -<p>This function plots a Principal Component Analysis (PCA) from transformed expression +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/heatMaplot_DEG-2.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="principal-component-analysis">Principal Component Analysis</h2> +<p>This function plots a Principal Component Analysis (PCA) from transformed expression matrix. This plot shows samples variation based on the expression values and -identifies batch effects.</p> -<pre><code class="language-r">PCAplot(exploredds, plotly = FALSE) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/PCAplot-1.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="multidimensional-scaling-with-mdsplot">Multidimensional scaling with <code>MDSplot</code></h2> -<p>This function computes and plots multidimensional scaling analysis for dimension -reduction of count expression matrix. Internally, it is applied the <code>stats::dist()</code> -function to the transformed count matrix to get sample-to-sample distances.</p> -<pre><code class="language-r">MDSplot(exploredds, plotly = FALSE) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/MDSplot-1.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="dimension-reduction-with-glmplot">Dimension Reduction with <code>GLMplot</code></h2> -<p>This function computes and plots generalized principal components analysis for -dimension reduction of count expression matrix.</p> -<pre><code class="language-r">exploredds_r &lt;- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, -transformationMethod = &quot;raw&quot;) +identifies batch effects.</p> +<pre><code class="language-r">PCAplot(exploredds, plotly = FALSE) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/PCAplot-1.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="multidimensional-scaling-with-mdsplot">Multidimensional scaling with <code>MDSplot</code></h2> +<p>This function computes and plots multidimensional scaling analysis for dimension +reduction of count expression matrix. Internally, it is applied the <code>stats::dist()</code> +function to the transformed count matrix to get sample-to-sample distances.</p> +<pre><code class="language-r">MDSplot(exploredds, plotly = FALSE) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/MDSplot-1.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="dimension-reduction-with-glmplot">Dimension Reduction with <code>GLMplot</code></h2> +<p>This function computes and plots generalized principal components analysis for +dimension reduction of count expression matrix.</p> +<pre><code class="language-r">exploredds_r &lt;- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, + transformationMethod = &quot;raw&quot;) GLMplot(exploredds_r, plotly = FALSE) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/GLMplot-1.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="ma-plot">MA plot</h2> -<p>This function plots log2 fold changes (y-axis) versus the mean of normalized -counts (on the x-axis). Statistically significant features are colored.</p> -<pre><code class="language-r">MAplot(degseqDF, comparison = &quot;M12-A12&quot;, filter = c(Fold = 1, FDR = 20), genes = &quot;ATCG00280&quot;) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/MAplot-1.png" width="672" /></p> -<p>The function provides the utility to save the plot automatically.</p> -<h2 id="t-distributed-stochastic-neighbor-embedding-with-tsneplot">t-Distributed Stochastic Neighbor embedding with <code>tSNEplot</code></h2> -<p>This function computes and plots t-Distributed Stochastic Neighbor embedding (t-SNE) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/GLMplot-1.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="ma-plot">MA plot</h2> +<p>This function plots log2 fold changes (y-axis) versus the mean of normalized +counts (on the x-axis). Statistically significant features are colored.</p> +<pre><code class="language-r">MAplot(degseqDF, comparison = &quot;M12-A12&quot;, filter = c(Fold = 1, FDR = 20), genes = &quot;ATCG00280&quot;) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/MAplot-1.png" width="672" /></p> +<p>The function provides the utility to save the plot automatically.</p> +<h2 id="t-distributed-stochastic-neighbor-embedding-with-tsneplot">t-Distributed Stochastic Neighbor embedding with <code>tSNEplot</code></h2> +<p>This function computes and plots t-Distributed Stochastic Neighbor embedding (t-SNE) analysis for unsupervised nonlinear dimensionality reduction of count expression -matrix. Internally, it is applied the <code>Rtsne::Rtsne()</code> (Krijthe 2015) function, using the exact -t-SNE computing with <code>theta=0.0</code>.</p> -<pre><code class="language-r">tSNEplot(countMatrix, targets, perplexity = 5) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/tSNEplot-1.png" width="672" /></p> -<h2 id="volcano-plot">Volcano plot</h2> -<p>A simple function that shows statistical significance (<code>p-value</code>) versus magnitude -of change (<code>log2 fold change</code>).</p> -<pre><code class="language-r">volcanoplot(degseqDF, comparison = &quot;M12-A12&quot;, filter = c(Fold = 1, FDR = 20), genes = &quot;ATCG00280&quot;) -</code></pre> -<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/volcanoplot-1.png" width="672" /></p> -<h1 id="version-information">Version information</h1> -<pre><code class="language-r">sessionInfo() -</code></pre> -<pre><code>## R Under development (unstable) (2021-02-04 r79940) +matrix. Internally, it is applied the <code>Rtsne::Rtsne()</code> (Krijthe 2015) function, using the exact +t-SNE computing with <code>theta=0.0</code>.</p> +<pre><code class="language-r">tSNEplot(countMatrix, targets, perplexity = 5) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/tSNEplot-1.png" width="672" /></p> +<h2 id="volcano-plot">Volcano plot</h2> +<p>A simple function that shows statistical significance (<code>p-value</code>) versus magnitude +of change (<code>log2 fold change</code>).</p> +<pre><code class="language-r">volcanoplot(degseqDF, comparison = &quot;M12-A12&quot;, filter = c(Fold = 1, FDR = 20), genes = &quot;ATCG00280&quot;) +</code></pre> +<p><img src="../../en/sp/spt/systemPipeTools_files/figure-html/volcanoplot-1.png" width="672" /></p> +<h1 id="version-information">Version information</h1> +<pre><code class="language-r">sessionInfo() +</code></pre> +<pre><code>## R Under development (unstable) (2021-02-04 r79940) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04.2 LTS -## +## ## Matrix products: default -## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 +## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /home/dcassol/src/R-devel/lib/libRlapack.so -## +## ## locale: -## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C -## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 -## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 -## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C -## [9] LC_ADDRESS=C LC_TELEPHONE=C -## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C -## +## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C +## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 +## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 +## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C +## [9] LC_ADDRESS=C LC_TELEPHONE=C +## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C +## ## attached base packages: -## [1] stats4 parallel stats graphics grDevices utils datasets -## [8] methods base -## +## [1] stats4 parallel stats graphics grDevices utils datasets +## [8] methods base +## ## other attached packages: -## [1] systemPipeR_1.25.11 ShortRead_1.49.2 -## [3] GenomicAlignments_1.27.2 SummarizedExperiment_1.21.3 -## [5] Biobase_2.51.0 MatrixGenerics_1.3.1 -## [7] matrixStats_0.58.0 BiocParallel_1.25.5 -## [9] Rsamtools_2.7.2 Biostrings_2.59.2 -## [11] XVector_0.31.1 GenomicRanges_1.43.4 -## [13] GenomeInfoDb_1.27.11 IRanges_2.25.9 -## [15] S4Vectors_0.29.15 BiocGenerics_0.37.2 -## [17] systemPipeTools_0.9.1 BiocStyle_2.19.2 -## +## [1] systemPipeR_1.25.11 ShortRead_1.49.2 +## [3] GenomicAlignments_1.27.2 SummarizedExperiment_1.21.3 +## [5] Biobase_2.51.0 MatrixGenerics_1.3.1 +## [7] matrixStats_0.58.0 BiocParallel_1.25.5 +## [9] Rsamtools_2.7.2 Biostrings_2.59.2 +## [11] XVector_0.31.1 GenomicRanges_1.43.4 +## [13] GenomeInfoDb_1.27.11 IRanges_2.25.9 +## [15] S4Vectors_0.29.15 BiocGenerics_0.37.2 +## [17] systemPipeTools_0.9.1 BiocStyle_2.19.2 +## ## loaded via a namespace (and not attached): -## [1] backports_1.2.1 BiocFileCache_1.99.6 plyr_1.8.6 -## [4] lazyeval_0.2.2 splines_4.1.0 crosstalk_1.1.1 -## [7] ggplot2_3.3.3 digest_0.6.27 htmltools_0.5.1.1 -## [10] fansi_0.4.2 magrittr_2.0.1 checkmate_2.0.0 -## [13] memoise_2.0.0 BSgenome_1.59.2 base64url_1.4 -## [16] limma_3.47.12 annotate_1.69.2 prettyunits_1.1.1 -## [19] jpeg_0.1-8.1 colorspace_2.0-0 blob_1.2.1 -## [22] rappdirs_0.3.3 ggrepel_0.9.1 xfun_0.22 -## [25] dplyr_1.0.5 crayon_1.4.1 RCurl_1.98-1.3 -## [28] jsonlite_1.7.2 genefilter_1.73.1 VariantAnnotation_1.37.1 -## [31] brew_1.0-6 survival_3.2-10 ape_5.4-1 -## [34] glue_1.4.2 gtable_0.3.0 zlibbioc_1.37.0 -## [37] DelayedArray_0.17.10 V8_3.4.0 scales_1.1.1 -## [40] pheatmap_1.0.12 DBI_1.1.1 GGally_2.1.1 -## [43] edgeR_3.33.3 Rcpp_1.0.6 viridisLite_0.4.0 -## [46] xtable_1.8-4 progress_1.2.2 tidytree_0.3.3 -## [49] bit_4.0.4 rsvg_2.1.1 DT_0.18 -## [52] htmlwidgets_1.5.3 httr_1.4.2 RColorBrewer_1.1-2 -## [55] ellipsis_0.3.1 farver_2.1.0 pkgconfig_2.0.3 -## [58] reshape_0.8.8 XML_3.99-0.6 dbplyr_2.1.1 -## [61] sass_0.3.1 locfit_1.5-9.4 utf8_1.2.1 -## [64] labeling_0.4.2 later_1.1.0.1 tidyselect_1.1.0 -## [67] rlang_0.4.10 AnnotationDbi_1.53.1 munsell_0.5.0 -## [70] tools_4.1.0 cachem_1.0.4 generics_0.1.0 -## [73] RSQLite_2.2.7 evaluate_0.14 stringr_1.4.0 -## [76] fastmap_1.1.0 yaml_2.2.1 ggtree_2.5.2 -## [79] knitr_1.32 bit64_4.0.5 purrr_0.3.4 -## [82] KEGGREST_1.31.1 nlme_3.1-152 mime_0.10 -## [85] formatR_1.9 aplot_0.0.6 biomaRt_2.47.7 -## [88] compiler_4.1.0 filelock_1.0.2 plotly_4.9.3 -## [91] curl_4.3 png_0.1-7 treeio_1.15.7 -## [94] tibble_3.1.1 geneplotter_1.69.0 bslib_0.2.4 -## [97] stringi_1.5.3 highr_0.9 blogdown_1.3 -## [100] GenomicFeatures_1.43.8 lattice_0.20-41 Matrix_1.3-2 -## [103] glmpca_0.2.0 vctrs_0.3.7 pillar_1.6.0 -## [106] lifecycle_1.0.0 BiocManager_1.30.12 jquerylib_0.1.3 -## [109] data.table_1.14.0 bitops_1.0-6 httpuv_1.5.5 -## [112] rtracklayer_1.51.5 patchwork_1.1.1 BiocIO_1.1.2 -## [115] R6_2.5.0 latticeExtra_0.6-29 hwriter_1.3.2 -## [118] promises_1.2.0.1 bookdown_0.22 codetools_0.2-18 -## [121] MASS_7.3-53.1 assertthat_0.2.1 rjson_0.2.20 -## [124] DESeq2_1.31.18 withr_2.4.2 batchtools_0.9.15 -## [127] GenomeInfoDbData_1.2.4 hms_1.0.0 grid_4.1.0 -## [130] tidyr_1.1.3 DOT_0.1 rmarkdown_2.7.12 -## [133] rvcheck_0.1.8 Rtsne_0.15 shiny_1.6.0 +## [1] backports_1.2.1 BiocFileCache_1.99.6 plyr_1.8.6 +## [4] lazyeval_0.2.2 splines_4.1.0 crosstalk_1.1.1 +## [7] ggplot2_3.3.3 digest_0.6.27 htmltools_0.5.1.1 +## [10] fansi_0.4.2 magrittr_2.0.1 checkmate_2.0.0 +## [13] memoise_2.0.0 BSgenome_1.59.2 base64url_1.4 +## [16] limma_3.47.12 annotate_1.69.2 prettyunits_1.1.1 +## [19] jpeg_0.1-8.1 colorspace_2.0-0 blob_1.2.1 +## [22] rappdirs_0.3.3 ggrepel_0.9.1 xfun_0.22 +## [25] dplyr_1.0.5 crayon_1.4.1 RCurl_1.98-1.3 +## [28] jsonlite_1.7.2 genefilter_1.73.1 VariantAnnotation_1.37.1 +## [31] brew_1.0-6 survival_3.2-10 ape_5.4-1 +## [34] glue_1.4.2 gtable_0.3.0 zlibbioc_1.37.0 +## [37] DelayedArray_0.17.10 V8_3.4.0 scales_1.1.1 +## [40] pheatmap_1.0.12 DBI_1.1.1 GGally_2.1.1 +## [43] edgeR_3.33.3 Rcpp_1.0.6 viridisLite_0.4.0 +## [46] xtable_1.8-4 progress_1.2.2 tidytree_0.3.3 +## [49] bit_4.0.4 rsvg_2.1.1 DT_0.18 +## [52] htmlwidgets_1.5.3 httr_1.4.2 RColorBrewer_1.1-2 +## [55] ellipsis_0.3.1 farver_2.1.0 pkgconfig_2.0.3 +## [58] reshape_0.8.8 XML_3.99-0.6 dbplyr_2.1.1 +## [61] sass_0.3.1 locfit_1.5-9.4 utf8_1.2.1 +## [64] labeling_0.4.2 later_1.1.0.1 tidyselect_1.1.0 +## [67] rlang_0.4.10 AnnotationDbi_1.53.1 munsell_0.5.0 +## [70] tools_4.1.0 cachem_1.0.4 generics_0.1.0 +## [73] RSQLite_2.2.7 evaluate_0.14 stringr_1.4.0 +## [76] fastmap_1.1.0 yaml_2.2.1 ggtree_2.5.2 +## [79] knitr_1.32 bit64_4.0.5 purrr_0.3.4 +## [82] KEGGREST_1.31.1 nlme_3.1-152 mime_0.10 +## [85] formatR_1.9 aplot_0.0.6 biomaRt_2.47.7 +## [88] compiler_4.1.0 filelock_1.0.2 plotly_4.9.3 +## [91] curl_4.3 png_0.1-7 treeio_1.15.7 +## [94] tibble_3.1.1 geneplotter_1.69.0 bslib_0.2.4 +## [97] stringi_1.5.3 highr_0.9 blogdown_1.3 +## [100] GenomicFeatures_1.43.8 lattice_0.20-41 Matrix_1.3-2 +## [103] glmpca_0.2.0 vctrs_0.3.7 pillar_1.6.0 +## [106] lifecycle_1.0.0 BiocManager_1.30.12 jquerylib_0.1.3 +## [109] data.table_1.14.0 bitops_1.0-6 httpuv_1.5.5 +## [112] rtracklayer_1.51.5 patchwork_1.1.1 BiocIO_1.1.2 +## [115] R6_2.5.0 latticeExtra_0.6-29 hwriter_1.3.2 +## [118] promises_1.2.0.1 bookdown_0.22 codetools_0.2-18 +## [121] MASS_7.3-53.1 assertthat_0.2.1 rjson_0.2.20 +## [124] DESeq2_1.31.18 withr_2.4.2 batchtools_0.9.15 +## [127] GenomeInfoDbData_1.2.4 hms_1.0.0 grid_4.1.0 +## [130] tidyr_1.1.3 DOT_0.1 rmarkdown_2.7.12 +## [133] rvcheck_0.1.8 Rtsne_0.15 shiny_1.6.0 ## [136] restfulr_0.0.13 -</code></pre> -<h1 id="funding">Funding</h1> -<p>This project is funded by NSF award <a href="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1661152">ABI-1661152</a>.</p> -<h1 id="references">References</h1> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-Anders2010-tp" class="csl-entry"> -<p>Anders, Simon, and Wolfgang Huber. 2010. “Differential Expression Analysis for Sequence Count Data.” <em>Genome Biol.</em> 11 (10): R106.</p> -</div> -<div id="ref-H_Backman2016-bt" class="csl-entry"> -<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> -</div> -<div id="ref-Rtsne" class="csl-entry"> -<p>Krijthe, Jesse H. 2015. <em>Rtsne: T-Distributed Stochastic Neighbor Embedding Using Barnes-Hut Implementation</em>. <a href="https://github.com/jkrijthe/Rtsne">https://github.com/jkrijthe/Rtsne</a>.</p> -</div> -<div id="ref-Love2014-sh" class="csl-entry"> -<p>Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for <span class="nocase">RNA-seq</span> Data with DESeq2.” <em>Genome Biol.</em> 15 (12): 550. <a href="https://doi.org/10.1186/s13059-014-0550-8">https://doi.org/10.1186/s13059-014-0550-8</a>.</p> -</div> -</div> \ No newline at end of file +</code></pre> +<h1 id="funding">Funding</h1> +<p>This project is funded by NSF award <a href="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1661152">ABI-1661152</a>.</p> +<h1 id="references">References</h1> +<div id="refs" class="references csl-bib-body hanging-indent"> +<div id="ref-Anders2010-tp" class="csl-entry"> +<p>Anders, Simon, and Wolfgang Huber. 2010. “Differential Expression Analysis for Sequence Count Data.” <em>Genome Biol.</em> 11 (10): R106.</p> +</div> +<div id="ref-H_Backman2016-bt" class="csl-entry"> +<p>H Backman, Tyler W, and Thomas Girke. 2016. “<span class="nocase">systemPipeR: NGS workflow and report generation environment</span>.” <em>BMC Bioinformatics</em> 17 (1): 388. <a href="https://doi.org/10.1186/s12859-016-1241-0">https://doi.org/10.1186/s12859-016-1241-0</a>.</p> +</div> +<div id="ref-Rtsne" class="csl-entry"> +<p>Krijthe, Jesse H. 2015. <em>Rtsne: T-Distributed Stochastic Neighbor Embedding Using Barnes-Hut Implementation</em>. <a href="https://github.com/jkrijthe/Rtsne">https://github.com/jkrijthe/Rtsne</a>.</p> +</div> +<div id="ref-Love2014-sh" class="csl-entry"> +<p>Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for <span class="nocase">RNA-seq</span> Data with DESeq2.” <em>Genome Biol.</em> 15 (12): 550. <a href="https://doi.org/10.1186/s13059-014-0550-8">https://doi.org/10.1186/s13059-014-0550-8</a>.</p> +</div> +</div> + + + + + + diff --git a/public/sp/spt/systempipetools/index.html b/public/sp/spt/systempipetools/index.html index 8d10b8c72..a153639de 100644 --- a/public/sp/spt/systempipetools/index.html +++ b/public/sp/spt/systempipetools/index.html @@ -1,53 +1,959 @@ -Data Visualizations | sysPipe

Data Visualizations

Data Visualization with systemPipeR

systemPipeTools package extends the widely used systemPipeR (SPR) (H Backman and Girke 2016) + + + + + + + + + + + + + + + + + + + +Data Visualizations | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Data Visualizations

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

Data Visualization with systemPipeR

+

systemPipeTools package extends the widely used systemPipeR (SPR) (H Backman and Girke 2016) workflow environment with enhanced toolkit for data visualization, including utilities to automate the analysis of differentially expressed genes (DEGs). systemPipeTools provides functions for data transformation and data exploration via @@ -56,7 +962,14 @@ Stochastic Neighbor embedding (t-SNE), and MA and volcano plots. All these utilities can be integrated with the modular design of the systemPipeR environment that allows users to easily substitute any of these features and/or -custom with alternatives.

Metadata and Reads Counting Information

The first step is importing the targets file and raw reads counting table.

  • The targets file defines all FASTQ files and sample comparisons of the analysis workflow.
  • The raw reads counting table represents all the reads that map to gene (row) for each sample (columns).
## Targets file
+custom with alternatives.

+

Metadata and Reads Counting Information

+

The first step is importing the targets file and raw reads counting table.

+
    +
  • The targets file defines all FASTQ files and sample comparisons of the analysis workflow.
  • +
  • The raw reads counting table represents all the reads that map to gene (row) for each sample (columns).
  • +
+
## Targets file
 targetspath <- system.file("extdata", "targets.txt", package = "systemPipeR")
 targets <- read.delim(targetspath, comment = "#")
 cmp <- systemPipeR::readComp(file = targetspath, format = "matrix", delim = "-")
@@ -64,16 +977,22 @@
 countMatrixPath <- system.file("extdata", "countDFeByg.xls", package = "systemPipeR")
 countMatrix <- read.delim(countMatrixPath, row.names = 1)
 showDT(countMatrix)
-

Data Transformation

For gene differential expression, raw counts are required, however for data +

+
+ +

Data Transformation

+

For gene differential expression, raw counts are required, however for data visualization or clustering, it can be useful to work with transformed count data. exploreDDS function is convenience wrapper to transform raw read counts using the -DESeq2 package transformations methods. The input file +DESeq2 package transformations methods. The input file has to contain all the genes, not just differentially expressed ones. Supported methods include variance stabilizing transformation (vst) (Anders and Huber (2010)), and -regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).

exploredds <- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, 
+regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).

+
exploredds <- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, 
     transformationMethod = "rlog")
 exploredds
-
## class: DESeqTransform 
+
+
## class: DESeqTransform 
 ## dim: 116 18 
 ## metadata(1): version
 ## assays(1): ''
@@ -81,55 +1000,109 @@
 ## rowData names(51): baseMean baseVar ... dispFit rlogIntercept
 ## colnames(18): M1A M1B ... V12A V12B
 ## colData names(2): condition sizeFactor
-

Users are strongly encouraged to consult the DESeq2 vignette for +

+

Users are strongly encouraged to consult the DESeq2 vignette for more detailed information on this topic and how to properly run DESeq2 on data -sets with more complex experimental designs.

Scatterplot

To decide which transformation to choose, we can visualize the transformation effect -comparing two samples or a grid of all samples, as follows:

exploreDDSplot(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, samples = c("M12A", 
+sets with more complex experimental designs.

+

Scatterplot

+

To decide which transformation to choose, we can visualize the transformation effect +comparing two samples or a grid of all samples, as follows:

+
exploreDDSplot(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, samples = c("M12A", 
     "M12A", "A12A", "A12A"), scattermatrix = TRUE)
-
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
+
+
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
 ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
 ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
 ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
-

The scatterplots are created using the log2 transform normalized reads count, +

+

+

The scatterplots are created using the log2 transform normalized reads count, variance stabilizing transformation (VST) (Anders and Huber (2010)), and -regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).

Hierarchical Clustering Dendrogram

The following computes the sample-wise correlation coefficients using the stats::cor() +regularized-logarithm transformation or rlog (Love, Huber, and Anders (2014)).

+

Hierarchical Clustering Dendrogram

+

The following computes the sample-wise correlation coefficients using the stats::cor() function from the transformed expression values. After transformation to a distance matrix, hierarchical clustering is performed with the stats::hclust -function and the result is plotted as a dendrogram, as follows:

hclustplot(exploredds, method = "spearman")
-

The function provides the utility to save the plot automatically.

Hierarchical Clustering HeatMap

This function performs hierarchical clustering on the transformed expression +function and the result is plotted as a dendrogram, as follows:

+
hclustplot(exploredds, method = "spearman")
+
+

+

The function provides the utility to save the plot automatically.

+

Hierarchical Clustering HeatMap

+

This function performs hierarchical clustering on the transformed expression matrix generated within the DESeq2 package. It uses, by default, a Pearson correlation-based distance measure and complete linkage for cluster join. If samples selected in the clust argument, it will be applied the stats::dist() function to the transformed count matrix to get sample-to-sample distances. Also, -it is possible to generate the pheatmap or plotly plot format.

## Samples plot
+it is possible to generate the pheatmap or plotly plot format.

+
## Samples plot
 heatMaplot(exploredds, clust = "samples", plotly = TRUE)
-

If ind selected in the clust argument, it is necessary to provide the list of -differentially expressed genes for the exploredds subset.

## Individuals genes identified in DEG analysis DEG analysis with `systemPipeR`
+
+
+ +

If ind selected in the clust argument, it is necessary to provide the list of +differentially expressed genes for the exploredds subset.

+
## Individuals genes identified in DEG analysis DEG analysis with `systemPipeR`
 degseqDF <- systemPipeR::run_DESeq2(countDF = countMatrix, targets = targets, cmp = cmp[[1]], 
     independent = FALSE)
 DEG_list <- systemPipeR::filterDEGs(degDF = degseqDF, filter = c(Fold = 2, FDR = 10))
-

### Plot
+
+

+
### Plot
 heatMaplot(exploredds, clust = "ind", DEGlist = unique(as.character(unlist(DEG_list[[1]]))))
-

The function provides the utility to save the plot automatically.

Principal Component Analysis

This function plots a Principal Component Analysis (PCA) from transformed expression +

+

+

The function provides the utility to save the plot automatically.

+

Principal Component Analysis

+

This function plots a Principal Component Analysis (PCA) from transformed expression matrix. This plot shows samples variation based on the expression values and -identifies batch effects.

PCAplot(exploredds, plotly = FALSE)
-

The function provides the utility to save the plot automatically.

Multidimensional scaling with MDSplot

This function computes and plots multidimensional scaling analysis for dimension +identifies batch effects.

+
PCAplot(exploredds, plotly = FALSE)
+
+

+

The function provides the utility to save the plot automatically.

+

Multidimensional scaling with MDSplot

+

This function computes and plots multidimensional scaling analysis for dimension reduction of count expression matrix. Internally, it is applied the stats::dist() -function to the transformed count matrix to get sample-to-sample distances.

MDSplot(exploredds, plotly = FALSE)
-

The function provides the utility to save the plot automatically.

Dimension Reduction with GLMplot

This function computes and plots generalized principal components analysis for -dimension reduction of count expression matrix.

exploredds_r <- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, 
+function to the transformed count matrix to get sample-to-sample distances.

+
MDSplot(exploredds, plotly = FALSE)
+
+

+

The function provides the utility to save the plot automatically.

+

Dimension Reduction with GLMplot

+

This function computes and plots generalized principal components analysis for +dimension reduction of count expression matrix.

+
exploredds_r <- exploreDDS(countMatrix, targets, cmp = cmp[[1]], preFilter = NULL, 
     transformationMethod = "raw")
 GLMplot(exploredds_r, plotly = FALSE)
-

The function provides the utility to save the plot automatically.

MA plot

This function plots log2 fold changes (y-axis) versus the mean of normalized -counts (on the x-axis). Statistically significant features are colored.

MAplot(degseqDF, comparison = "M12-A12", filter = c(Fold = 1, FDR = 20), genes = "ATCG00280")
-

The function provides the utility to save the plot automatically.

t-Distributed Stochastic Neighbor embedding with tSNEplot

This function computes and plots t-Distributed Stochastic Neighbor embedding (t-SNE) +

+

+

The function provides the utility to save the plot automatically.

+

MA plot

+

This function plots log2 fold changes (y-axis) versus the mean of normalized +counts (on the x-axis). Statistically significant features are colored.

+
MAplot(degseqDF, comparison = "M12-A12", filter = c(Fold = 1, FDR = 20), genes = "ATCG00280")
+
+

+

The function provides the utility to save the plot automatically.

+

t-Distributed Stochastic Neighbor embedding with tSNEplot

+

This function computes and plots t-Distributed Stochastic Neighbor embedding (t-SNE) analysis for unsupervised nonlinear dimensionality reduction of count expression matrix. Internally, it is applied the Rtsne::Rtsne() (Krijthe 2015) function, using the exact -t-SNE computing with theta=0.0.

tSNEplot(countMatrix, targets, perplexity = 5)
-

Volcano plot

A simple function that shows statistical significance (p-value) versus magnitude -of change (log2 fold change).

volcanoplot(degseqDF, comparison = "M12-A12", filter = c(Fold = 1, FDR = 20), genes = "ATCG00280")
-

Version information

sessionInfo()
-
## R Under development (unstable) (2021-02-04 r79940)
+t-SNE computing with theta=0.0.

+
tSNEplot(countMatrix, targets, perplexity = 5)
+
+

+

Volcano plot

+

A simple function that shows statistical significance (p-value) versus magnitude +of change (log2 fold change).

+
volcanoplot(degseqDF, comparison = "M12-A12", filter = c(Fold = 1, FDR = 20), genes = "ATCG00280")
+
+

+

Version information

+
sessionInfo()
+
+
## R Under development (unstable) (2021-02-04 r79940)
 ## Platform: x86_64-pc-linux-gnu (64-bit)
 ## Running under: Ubuntu 20.04.2 LTS
 ## 
@@ -207,9 +1180,121 @@
 ## [130] tidyr_1.1.3              DOT_0.1                  rmarkdown_2.7.12        
 ## [133] rvcheck_0.1.8            Rtsne_0.15               shiny_1.6.0             
 ## [136] restfulr_0.0.13
-

Funding

This project is funded by NSF award ABI-1661152.

References

Anders, Simon, and Wolfgang Huber. 2010. “Differential Expression Analysis for Sequence Count Data.” Genome Biol. 11 (10): R106.

H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.

Krijthe, Jesse H. 2015. Rtsne: T-Distributed Stochastic Neighbor Embedding Using Barnes-Hut Implementation. https://github.com/jkrijthe/Rtsne.

Love, Michael, Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-seq Data with DESeq2.” Genome Biol. 15 (12): 550. https://doi.org/10.1186/s13059-014-0550-8.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/spr_wf/index.html b/public/spr_wf/index.html index 4573e3ec1..f0c92a341 100644 --- a/public/spr_wf/index.html +++ b/public/spr_wf/index.html @@ -1,47 +1,944 @@ -SPR WorkFlow Collection | sysPipe

SPR WorkFlow Collection

Workflow Templates

systemPipeR project provides pre-configured workflows and reporting templates for a wide range of NGS applications that are listed bellow. The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters -and cloud systems, while generating at the same time publication quality analysis reports.

systemPipeRdata is a helper package + + + + + + + + + + + + + + + + + + + + +SPR WorkFlow Collection | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

SPR WorkFlow Collection

+ + +

Workflow Templates

+

systemPipeR project provides pre-configured workflows and reporting templates for a wide range of NGS applications that are listed bellow. The systemPipeR project provides a suite of R/Bioconductor packages for designing, building and running end-to-end analysis workflows on local machines, HPC clusters +and cloud systems, while generating at the same time publication quality analysis reports.

+

systemPipeRdata is a helper package to generate with a single command workflow templates that are intended to be -used by its parent package systemPipeR (H Backman and Girke 2016).

WorkFlowDescriptionVersionGitHubR-CMD-check
SPchipseqChIP-Seq Workflow TemplateStableR-CMD-check
SPriboseqRIBO-Seq Workflow TemplateStableR-CMD-check
SPrnaseqRNA-Seq Workflow TemplateStableR-CMD-check
SPvarseqVAR-Seq Workflow TemplateStableR-CMD-check
SPmethylseqMethyl-Seq Workflow TemplateExperimentalR-CMD-check
SPdenovoDe novo transcriptome assembly Workflow TemplateExperimentalR-CMD-check
SPclipseqCLIP-Seq Workflow TemplateExperimentalR-CMD-check
SPmetatransMetatranscriptomic Sequencing Workflow TemplateExperimentalR-CMD-check
SPatacseqATAC-Seq Workflow TemplateExperimentalR-CMD-check
SPpolyriboseqPolyribosomal RNA-Seq Workflow TemplateExperimentalR-CMD-check
SPhicHi-C Workflow TemplateExperimentalR-CMD-check
SPmirnaseqMicroRNA-Seq Workflow TemplateExperimentalR-CMD-check
SPblastBLAST Workflow TemplateExperimentalR-CMD-check
SPscrnaseqSingle-Cell RNA-Seq Workflow TemplateExperimentalR-CMD-check

Reference

H Backman, Tyler W, and Thomas Girke. 2016. “systemPipeR: NGS workflow and report generation environment.” BMC Bioinformatics 17 (1): 388. https://doi.org/10.1186/s12859-016-1241-0.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/spr_wf/index.xml b/public/spr_wf/index.xml index d3854fc31..98ce4d495 100644 --- a/public/spr_wf/index.xml +++ b/public/spr_wf/index.xml @@ -1 +1,17 @@ -sysPipe – SPR WorkFlow Collection/spr_wf/Recent content in SPR WorkFlow Collection on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – SPR WorkFlow Collection + /spr_wf/ + Recent content in SPR WorkFlow Collection on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/spr_wf/installwf/index.html b/public/spr_wf/installwf/index.html index 0605843fd..cf334b501 100644 --- a/public/spr_wf/installwf/index.html +++ b/public/spr_wf/installwf/index.html @@ -1,57 +1,731 @@ -How to install systemPipe Workflows | sysPipe

How to install systemPipe Workflows

Starting with pre-configured workflow templates

To test workflows quickly or design new ones from existing templates, users can + + + + + + + + + + + + + + + + + + + +How to install systemPipe Workflows | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

How to install systemPipe Workflows

+ + +

Starting with pre-configured workflow templates

+

To test workflows quickly or design new ones from existing templates, users can generate with a single command workflow instances fully populated with sample data -and parameter files required for running a chosen workflow.

Load one of the available workflows into your current working directory. +and parameter files required for running a chosen workflow.

+

Load one of the available workflows into your current working directory. The following does this for the varseq workflow template. The name of the resulting workflow directory can be specified under the mydirname argument. The default NULL uses the name of the chosen workflow. An error is issued if a directory of the same -name and path exists already.

library("systemPipeRdata") 
+name and path exists already.

+
library("systemPipeRdata") 
 genWorkenvir(workflow="systemPipeR/SPvarseq", mydirname=NULL)
 setwd("varseq")
-

On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.

$ Rscript -e "systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname=NULL)"
-

Check availability of workflow templates

A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:

availableWF(github = TRUE)
-
## $systemPipeRdata
+
+

On Linux and OS X systems the same can be achieved from the command-line of a terminal with the following commands.

+
$ Rscript -e "systemPipeRdata::genWorkenvir(workflow='systemPipeR/SPvarseq', mydirname=NULL)"
+
+

Check availability of workflow templates

+

A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:

+
availableWF(github = TRUE)
+
+
## $systemPipeRdata
 ## [1] "chipseq" "new"     "riboseq" "rnaseq"  "varseq" 
 ## 
 ## $github
@@ -75,18 +749,118 @@
 ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template
 ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template
 ## 9  https://github.com/systemPipeR/SPmirnaseq Workflow Template
-

This function returns the list of workflow templates available within the package -and systemPipeR Project Organization on GitHub. Each one -listed template can be created as described above.

The workflow template choose from Github will be installed as an R package, and -also it creates an environment with all the settings and files to run the demo analysis.

genWorkenvir(workflow="systemPipeR/SPrnaseq", mydirname="NULL")
+
+

This function returns the list of workflow templates available within the package +and systemPipeR Project Organization on GitHub. Each one +listed template can be created as described above.

+

The workflow template choose from Github will be installed as an R package, and +also it creates an environment with all the settings and files to run the demo analysis.

+
genWorkenvir(workflow="systemPipeR/SPrnaseq", mydirname="NULL")
 setwd("systemPipeVARseq")
-

Besides, it is possible to choose different versions of the workflow template, +

+

Besides, it is possible to choose different versions of the workflow template, defined through other branches on the GitHub Repository. By default, the master -branch is selected, however, it is possible to define a different branch with the ref argument.

genWorkenvir(workflow="systemPipeR/SPrnaseq", ref = "singleMachine")
+branch is selected, however, it is possible to define a different branch with the ref argument.

+
genWorkenvir(workflow="systemPipeR/SPrnaseq", ref = "singleMachine")
 setwd("systemPipeRNAseq")
-
+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/spr_wf/newwf/index.html b/public/spr_wf/newwf/index.html index dacb04fc0..d45fdea6b 100644 --- a/public/spr_wf/newwf/index.html +++ b/public/spr_wf/newwf/index.html @@ -1,58 +1,745 @@ -Rules to create a new Workflow Template | sysPipe + + + + + + + + + + + + + + + + + +Rules to create a new Workflow Template | sysPipe + + + + + + + + + + + + + + +

Rules to create a new Workflow Template

How to create a new Workflow Template

SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.

Installation

To install SPRthis using from BiocManager the following code:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
+if (!requireNamespace("BiocManager", quietly = TRUE)) { install.packages("BiocManager") BiocManager::install("dcassol/SPRthis")  Quick start to using to SPRthis ## Load the package library(SPRthis) ## create Package sprthis(wfName="SPRtest", analysis="SPRtest", path=tempdir())  ## ✓ Setting active project to '/tmp/RtmpWTh4tB'  ## ✓ Creating 'R/'  ## ✓ Writing 'DESCRIPTION'  ## Package: SPRtest ## Title: SPRtest ## Version: 0."/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+

Rules to create a new Workflow Template

+ + +

How to create a new Workflow Template

+

SPRthis package expand usethis package, providing automation to create systemPipeR workflows templates.

+

Installation

+

To install SPRthis using from BiocManager the following code:

+
if (!requireNamespace("BiocManager", quietly = TRUE)) {
   install.packages("BiocManager")
   BiocManager::install("dcassol/SPRthis")
-

Quick start to using to SPRthis

## Load the package
+
+

Quick start to using to SPRthis

+
## Load the package
 library(SPRthis)
 ## create Package
 sprthis(wfName="SPRtest", analysis="SPRtest", path=tempdir())
-
## ✓ Setting active project to '/tmp/RtmpWTh4tB'
-
## ✓ Creating 'R/'
-
## ✓ Writing 'DESCRIPTION'
-
## Package: SPRtest
+
+
## ✓ Setting active project to '/tmp/RtmpWTh4tB'
+
+
## ✓ Creating 'R/'
+
+
## ✓ Writing 'DESCRIPTION'
+
+
## Package: SPRtest
 ## Title: SPRtest
 ## Version: 0.9.0
 ## Authors@R (parsed):
@@ -77,10 +764,14 @@
 ## SystemRequirements: SPRtest can be used to run external command-line
 ##     software, but the corresponding tool needs to be installed on a
 ##     system.
-
## ✓ Writing 'NAMESPACE'
-
## ✓ Setting active project to '<no active project>'
-
## [1] "/tmp/RtmpWTh4tB"
-
+
+
## ✓ Writing 'NAMESPACE'
+
+
## ✓ Setting active project to '<no active project>'
+
+
## [1] "/tmp/RtmpWTh4tB"
+
+
 SPRtest/  
 ├── DESCRIPTION 
 ├── NAMESPACE 
@@ -110,13 +801,43 @@
     │                 ├── data/
     │                 ├── param/
     │                 └── results/
-

Help functions to create the package

Create the webiste for the package with pkgdown

Edit the _pkgdown.yml file and run:

pkgdown::build_site() 
-

Documentation with roxygen2

roxygen2::roxygenise()
-

Testing the code with testthat

To test the code, you can run

devtools::test()
-

Package available to genWorkenvir Function

After creating the new repository on GitHub systemPipeR Organization, -please follow:

  • Rules:
    • The Workflow Template need to be available under systemPipeR Organization;
    • The repository needs to be public;
    • About setting:
      • Description: keywords in the description are required: “Workflow Template”;
      • Topics: we expected “systempiper” and “release” or “development” words on Topics section;
    • Branch name: To make simple, please name the branch as “master”.

Check availability of workflow templates

A collection of workflow templates are available, and it is possible to browse the -current availability, as follows:

systemPipeRdata::availableWF(github = TRUE)
-
## $systemPipeRdata
+
+

Help functions to create the package

+

Create the webiste for the package with pkgdown

+

Edit the _pkgdown.yml file and run:

+
pkgdown::build_site() 
+
+

Documentation with roxygen2

+
roxygen2::roxygenise()
+
+

Testing the code with testthat

+

To test the code, you can run

+
devtools::test()
+
+

Package available to genWorkenvir Function

+

After creating the new repository on GitHub systemPipeR Organization, +please follow:

+
    +
  • Rules: +
      +
    • The Workflow Template need to be available under systemPipeR Organization;
    • +
    • The repository needs to be public;
    • +
    • About setting: +
        +
      • Description: keywords in the description are required: “Workflow Template”;
      • +
      • Topics: we expected “systempiper” and “release” or “development” words on Topics section;
      • +
      +
    • +
    • Branch name: To make simple, please name the branch as “master”.
    • +
    +
  • +
+

Check availability of workflow templates

+

A collection of workflow templates are available, and it is possible to browse the +current availability, as follows:

+
systemPipeRdata::availableWF(github = TRUE)
+
+
## $systemPipeRdata
 ## [1] "chipseq" "new"     "riboseq" "rnaseq"  "varseq" 
 ## 
 ## $github
@@ -140,11 +861,107 @@
 ## 7 https://github.com/systemPipeR/SPmetatrans Workflow Template
 ## 8 https://github.com/systemPipeR/SPmethylseq Workflow Template
 ## 9  https://github.com/systemPipeR/SPmirnaseq Workflow Template
-

This function returns the list of workflow templates available within the package -and systemPipeR Project Organization on GitHub. Each one -listed template can be created as described above.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/app_security/index.html b/public/sps/adv_features/app_security/index.html index bbc9170d3..ac0a6d5ca 100644 --- a/public/sps/adv_features/app_security/index.html +++ b/public/sps/adv_features/app_security/index.html @@ -1,105 +1,1254 @@ -App security | sysPipe + + + + + + + + + + + + + + + + + +App security | sysPipe + + + + + + + + + + + + + + +

App security


This secetion discusses how different security concerns are handled in SPS.

suppressPackageStartupMessages(library(systemPipeShiny))
-

SPS mode

SPS has an option of mode. This option controls how the file upload is handled by SPS. + “server”: for security, users do not have access of file system on the server, choose files from users' local computer."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

App security

+ + +
+

This secetion discusses how different security concerns are handled in SPS.

+
suppressPackageStartupMessages(library(systemPipeShiny))
+
+

SPS mode

+

SPS has an option of mode. This option controls how the file upload is handled by SPS. It can be either “server” or “local”, which is asking whether you are running -the app on the “server” or running on your “local” machine.

  • “server”: for security, users do not have access of file system on the server, -choose files from users' local computer.
  • “local”: Assumes the Shiny server and users' local computer is the same machine, -so users can access file Shiny server’s file system.

It is first defined in the global.R file in a SPS project.

options(sps = list(
+the app on the “server” or running on your “local” machine.

+
    +
  • “server”: for security, users do not have access of file system on the server, +choose files from users' local computer.
  • +
  • “local”: Assumes the Shiny server and users' local computer is the same machine, +so users can access file Shiny server’s file system.
  • +
+

It is first defined in the global.R file in a SPS project.

+
options(sps = list(
     mode = "local",
     ...
 ))
-

You can check current setting after the app started for the first time

spsOption("mode")
-
## [1] "local"
-

The most affected function is dynamicFile and its server side function dynamicFileServer.

Server:

+

+

You can check current setting after the app started for the first time

+
spsOption("mode")
+
+
## [1] "local"
+
+

The most affected function is dynamicFile and its server side function dynamicFileServer.

+

Server:

+

After clicking the file selection button in SPS, server mode uses the default shiny file choose, which users can choose from their local computer. You can see -from the picture above, this is a user operating system built-in file chooser.

Local:

-You can see this is different than the “server” mode. “Local” mode is able to +from the picture above, this is a user operating system built-in file chooser.

+

Local:

+

+You can see this is different than the “server” mode. “Local” mode is able to use the file system of the shiny deploy environment file system, and it is no longer -the users' local system.

This may be confusing for the first time. Remember “server” and “local” mean -where you deploy the shiny app, on the server or run on your local computer.

Modechoose file fromfile pointing method
Serveruser local computercopy to temp
Localthe computer where you deploy the appdirect pointer

Pro and cons of modes

It does not matter if which mode you choose if you run the app on your own computer, -because the deploy server and the user computer are the same.

  • However “local” mode will not copy a file to temp after the file chooser, but directly create a pointer.
  • “Server” mode will first upload/copy the file to temp and create a pointer. This +the users' local system.

    +

    This may be confusing for the first time. Remember “server” and “local” mean +where you deploy the shiny app, on the server or run on your local computer.

    + + + + + + + + + + + + + + + + + + + + +
    Modechoose file fromfile pointing method
    Serveruser local computercopy to temp
    Localthe computer where you deploy the appdirect pointer
    +

    Pro and cons of modes

    +

    It does not matter if which mode you choose if you run the app on your own computer, +because the deploy server and the user computer are the same.

    +
      +
    • However “local” mode will not copy a file to temp after the file chooser, but directly create a pointer.
    • +
    • “Server” mode will first upload/copy the file to temp and create a pointer. This will cause resources waste if you are running the app on your own computer. You already have the file on your computer but now it gets copied to temp before Shiny -can use it. This will also waste some time to copy the file, especially for large files.
    • There is a limit for default Shiny upload size which is 24MB in “server” mode.
    • You can choose files as large as you desire on “local” mode.

    The security issue of local mode

    There is a security concern of “local” mode when the app is deployed on a remote +can use it. This will also waste some time to copy the file, especially for large files.

  • +
  • There is a limit for default Shiny upload size which is 24MB in “server” mode.
  • +
  • You can choose files as large as you desire on “local” mode.
  • +
+

The security issue of local mode

+

There is a security concern of “local” mode when the app is deployed on a remote server. “local” mode enables users to choose files from the remote server, so -there is the risk of file leaking and file damaging.

We recommend DO NOT use “local” mode for remote deployment, like https://shinyapps.io. +there is the risk of file leaking and file damaging.

+

We recommend DO NOT use “local” mode for remote deployment, like https://shinyapps.io. You can turn the option warning_toast = TRUE on global and testing the app before -deploy. This option will check for security problems and inform you.

There are cases where you really need users to choose files from the remote +deploy. This option will check for security problems and inform you.

+

There are cases where you really need users to choose files from the remote server, like the Workflow module, where all workflow files are stored on the remote server. Then use a sandbox or container environment to isolate the app, -and also turn on the login page login_screen = TRUE to limit access will be helpful.

Warning toast

Set warning_toast = TRUE option will check for potential security risks and show +and also turn on the login page login_screen = TRUE to limit access will be helpful.

+

Warning toast

+

Set warning_toast = TRUE option will check for potential security risks and show a pop-up message if there is any risk when app starts. This is option is helpful -on pre-deployment testing.

  • check if you have changed the default admin page url “admin”
  • check if you have changed the default admin user “admin”
  • check if you have changed the default user “admin”
  • check if you are on “local” mode

The workflow module

The workflow module enables users to manage, design, and run workflows directly +on pre-deployment testing.

+
    +
  • check if you have changed the default admin page url “admin”
  • +
  • check if you have changed the default admin user “admin”
  • +
  • check if you have changed the default user “admin”
  • +
  • check if you are on “local” mode
  • +
+

+

The workflow module

+

The workflow module enables users to manage, design, and run workflows directly from the app and in the final running workflow session, users are allowed to run arbitrary R code in a Rstudio like console in a child R session. Running any R code means they can modify your remote system, and use system -commands.

For shinyapps.io, it runs in a container and it reset itself +commands.

+

For shinyapps.io, it runs in a container and it reset itself once a while, so security is not a big concern, but apparently, shinyapps.io is not a place you want to deploy heavy data analysis workflows. Most users will deploy the SPS with workflow modules in other cloud computing sites or their own servers. -For these cases, we recommend you:

  1. Turn on the login to give access to limited people.

  2. Isolate the app with sandboxes or containers.

+ + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/config/index.html b/public/sps/adv_features/config/index.html index a305cd5e2..bf5a9dc20 100644 --- a/public/sps/adv_features/config/index.html +++ b/public/sps/adv_features/config/index.html @@ -1,112 +1,1126 @@ -Configuration | sysPipe + + + + + + + + + + + + + + + + + +Configuration | sysPipe + + + + + + + + + + + + + + +

Configuration

SPS has many options you can change. These options will determine how the app -behaves.


Config SPS

Let us start by creating an example SPS project. For demo purpose, we are using the -/tmp folder but one should use a regular location instead of the temp in a real -case.

suppressPackageStartupMessages(library(systemPipeShiny))
+suppressPackageStartupMessages(library(systemPipeShiny)) spsInit(app_path = tempdir(), project_name = "config_demo", overwrite = TRUE, change_wd = FALSE)  ## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps."/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+    
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
+ + + + + + + + + +
+
+ + + + + + +
+

Configuration

+ + +

SPS has many options you can change. These options will determine how the app +behaves.

+
+

Config SPS

+

Let us start by creating an example SPS project. For demo purpose, we are using the +/tmp folder but one should use a regular location instead of the temp in a real +case.

+
suppressPackageStartupMessages(library(systemPipeShiny))
 spsInit(app_path = tempdir(), project_name = "config_demo", overwrite = TRUE, change_wd = FALSE)
-
## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains.
+
+
## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains.
 ## [SPS-INFO] 2021-04-25 19:43:24 Key md5 ee81377a81fdb757fbbbb6af38644756
 ## [SPS-INFO] 2021-04-25 19:43:24 SPS project setup done!
-
## save project path 
+
+
## save project path 
 (sps_dir <- file.path(tempdir(), "config_demo"))
-
## [1] "/tmp/RtmphrNOOX/config_demo"
-

To reproduce code locally, run the following chunk instead.

library(systemPipeShiny)
+
+
## [1] "/tmp/RtmphrNOOX/config_demo"
+
+

To reproduce code locally, run the following chunk instead.

+
library(systemPipeShiny)
 spsInit()
 sps_dir <- normalizePath(".")
-

SPS structure

+
+ +

SPS structure

+
 SPS_xx/  
-├── server.R               | 
-├── global.R               | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit   
-├── ui.R                   |  
-├── deploy.R               | Deploy helper file  
-├── config                 | Important app config files. Do not edit them if you don't know  
-│   ├── sps.db             | SPS database 
-│   ├── sps_options.yaml   | SPS default option list 
-│   └── tabs.csv           | SPS tab registration information 
-├── data                   | App example data files 
+├── server.R               | 
+├── global.R               | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit   
+├── ui.R                   |  
+├── deploy.R               | Deploy helper file  
+├── config                 | Important app config files. Do not edit them if you don't know  
+│   ├── sps.db             | SPS database 
+│   ├── sps_options.yaml   | SPS default option list 
+│   └── tabs.csv           | SPS tab registration information 
+├── data                   | App example data files 
 │   ├── xx.csv             
-├── R                      | All SPS custom tab files and helper R function files 
+├── R                      | All SPS custom tab files and helper R function files 
 │   ├── tab_xx.R            
 ├── README.md              
-├── results                | To store data generated from the app, like the workflow module 
+├── results                | To store data generated from the app, like the workflow module 
 │   └── README.md          
-└── www                    | Internet resources  
-    ├── css                | CSS files  
+└── www                    | Internet resources  
+    ├── css                | CSS files  
     │   └── sps.css         
-    ├── img                | App image resources    
+    ├── img                | App image resources    
     │   └── xx.png         
-    ├── js                 | Javascripts
+    ├── js                 | Javascripts
     │   └── xx.js           
-    ├── loading_themes     | Loading screen files 
+    ├── loading_themes     | Loading screen files 
     │   └── xx.html         
-    └── plot_list          | Image files for plot gallery  
+    └── plot_list          | Image files for plot gallery  
         └── plot_xx.jpg      
-

This is a reminder of what you will get when a SPS project is initiated with spsInit().

  1. For most users, the global.R file is the only file that one needs to make change.
  2. The second important files are the files inside config folder. For normal users, -these files are controlled by SPS functions. No need to make any modification. For advanced users, deep customization is possible.
    • sps_options.yaml stores all default and valid values for SPS, details are -listed below
    • tabs.csv all SPS tab registration information. Read Manage tabs
    • sps.db A SQLite database to store data generated in SPS. Read SPS database -for more information.
  3. R folder stores all custom tab files, your helper functions. This .R or .r files under this +
+

This is a reminder of what you will get when a SPS project is initiated with spsInit().

+
    +
  1. For most users, the global.R file is the only file that one needs to make change.
  2. +
  3. The second important files are the files inside config folder. For normal users, +these files are controlled by SPS functions. No need to make any modification. For advanced users, deep customization is possible. +
      +
    • sps_options.yaml stores all default and valid values for SPS, details are +listed below
    • +
    • tabs.csv all SPS tab registration information. Read Manage tabs
    • +
    • sps.db A SQLite database to store data generated in SPS. Read SPS database +for more information.
    • +
    +
  4. +
  5. R folder stores all custom tab files, your helper functions. This .R or .r files under this folder will be automatically sourced when SPS starts. This is discussed in -Manage tabs.
  6. www folder is where you add the internet resources, like images you want to show in -the app, css style sheets to attach. Read more here.

App options

View/Set all options

App options in SPS are controlled by “SPS options”. These options can change +Manage tabs. +

  • www folder is where you add the internet resources, like images you want to show in +the app, css style sheets to attach. Read more here.
  • + +

    App options

    +

    View/Set all options

    +

    App options in SPS are controlled by “SPS options”. These options can change app appearance, debugging level, server behaviors, etc. The valid options can be found and change on the global.R file. They are similar to Shiny options, but unlike shiny options that are single values, SPS options are passed using the Option(sps = list(...)) @@ -114,121 +1128,128 @@ values('*' means any value is okay) see global.R from the line starting with ## SPS options. We provided some comments below that line to generally describe what each option is and valid values for options. Use function -spsOptDefaults to see the default and other valid options.

    spsOptDefaults(app_path = sps_dir)
    -
    ## title:
    -##     Default: systemPipeShiny 
    -##     Other: * 
    -## title_logo:
    -##     Default: img/sps_small.png 
    -##     Other: * 
    -## mode:
    -##     Default: local 
    -##     Other: server 
    -## login_screen:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## login_theme:
    -##     Default: random 
    -##     Other: * 
    -## use_crayon:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## verbose:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## admin_page:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## admin_url:
    -##     Default: admin 
    -##     Other: * 
    -## warning_toast:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## module_wf:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## module_rnaseq:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## module_ggplot:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_welcome:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_vs_main:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_canvas:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_about:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## note_url:
    -##     Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    -##     Other: * 
    -## traceback:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## is_demo:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## welcome_guide:
    -##     Default: TRUE 
    -##     Other: FALSE 
    +spsOptDefaults to see the default and other valid options.

    +
    spsOptDefaults(app_path = sps_dir)
    +
    +
    ## title:
    +##     Default: systemPipeShiny 
    +##     Other: * 
    +## title_logo:
    +##     Default: img/sps_small.png 
    +##     Other: * 
    +## mode:
    +##     Default: local 
    +##     Other: server 
    +## login_screen:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## login_theme:
    +##     Default: random 
    +##     Other: * 
    +## use_crayon:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## verbose:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## admin_page:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## admin_url:
    +##     Default: admin 
    +##     Other: * 
    +## warning_toast:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## module_wf:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## module_rnaseq:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## module_ggplot:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_welcome:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_vs_main:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_canvas:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_about:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## note_url:
    +##     Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    +##     Other: * 
    +## traceback:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## is_demo:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## welcome_guide:
    +##     Default: TRUE 
    +##     Other: FALSE 
     ## * means any value will be accepted
    -

    After the app has started once, you can use spsOptions() to see all current settings.

    spsOptions(app_path = sps_dir)
    -
    ## Current project option settings: 
    -## title:
    -##     systemPipeShiny 
    -## title_logo:
    -##     img/sps_small.png 
    -## mode:
    -##     local 
    -## login_screen:
    -##     FALSE 
    -## login_theme:
    -##     random 
    -## use_crayon:
    -##     TRUE 
    -## verbose:
    -##     FALSE 
    -## admin_page:
    -##     TRUE 
    -## admin_url:
    -##     admin 
    -## warning_toast:
    -##     FALSE 
    -## module_wf:
    -##     TRUE 
    -## module_rnaseq:
    -##     TRUE 
    -## module_ggplot:
    -##     TRUE 
    -## tab_welcome:
    -##     TRUE 
    -## tab_vs_main:
    -##     TRUE 
    -## tab_canvas:
    -##     TRUE 
    -## tab_about:
    -##     TRUE 
    -## note_url:
    -##     https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    -## traceback:
    -##     FALSE 
    -## is_demo:
    -##     FALSE 
    -## welcome_guide:
    -##     TRUE 
    +
    +

    After the app has started once, you can use spsOptions() to see all current settings.

    +
    spsOptions(app_path = sps_dir)
    +
    +
    ## Current project option settings: 
    +## title:
    +##     systemPipeShiny 
    +## title_logo:
    +##     img/sps_small.png 
    +## mode:
    +##     local 
    +## login_screen:
    +##     FALSE 
    +## login_theme:
    +##     random 
    +## use_crayon:
    +##     TRUE 
    +## verbose:
    +##     FALSE 
    +## admin_page:
    +##     TRUE 
    +## admin_url:
    +##     admin 
    +## warning_toast:
    +##     FALSE 
    +## module_wf:
    +##     TRUE 
    +## module_rnaseq:
    +##     TRUE 
    +## module_ggplot:
    +##     TRUE 
    +## tab_welcome:
    +##     TRUE 
    +## tab_vs_main:
    +##     TRUE 
    +## tab_canvas:
    +##     TRUE 
    +## tab_about:
    +##     TRUE 
    +## note_url:
    +##     https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    +## traceback:
    +##     FALSE 
    +## is_demo:
    +##     FALSE 
    +## welcome_guide:
    +##     TRUE 
     ## ********
     ## Option legend:
    -##     known options        Hidden/custom options* and values+
    +##     known options        Hidden/custom options* and values+
     ## Value legend:
    -##     same as default values        different from defaults+
    -

    A copy of options in global.R:

    options(sps = list(
    +##     same as default values        different from defaults+
    +
    +

    A copy of options in global.R:

    +
    options(sps = list(
         title = "systemPipeShiny",
         title_logo = "img/sps_small.png",
         mode = "local",
    @@ -251,36 +1272,228 @@
         is_demo = FALSE,
         welcome_guide = TRUE
     ))
    -

    Note: Do not worry if you set some invalid values, on app start, `sps()` will check all SPS -options, ignore unknown values and set invalid values back to default. You will see warning -messages on console to tell you specifically what is wrong with your options.

    OptionDescriptionDefaultOther
    moderunning mode“local”“server”
    titleApp title“systemPipeShiny”any string
    title_logoApp logo to display on browser tab“img/sps_small.png”any path
    warning_toastshow security warnings?TRUEFALSE
    login_screenadd login screen?TRUEFALSE
    login_themelogin screen theme“random”see details
    use_crayoncolorful console message?TRUEFALSE
    verbosemore details for SPS functions?FALSETRUE
    admin_pageenable admin page?FALSETRUE
    admin_urladmin_page query url“admin”any string
    warning_toastfor internal test onlyTRUEFALSE
    module_wfload workflow module?TRUEFALSE
    module_rnaseqload RNAseq module?TRUEFALSE
    module_ggplotload quick ggplot module?TRUEFALSE
    tab_welcomeload welcome tab?TRUEFALSE
    tab_vs_mainload custom visualization main tab?TRUEFALSE
    tab_canvasload Canvas tab?TRUEFALSE
    tab_aboutload about tab?TRUEFALSE
    note_urlSPS notification remote URLsee code aboveany URL
    is_demouseful if deploy the app as a demoFALSETRUE
    welcome_guideenable the welcome guideTRUEFALSE
    app_pathhidden, automatically addedN.A.N.A.

    Details

    • mode: see [App security] this option will change how -the upload files are selected.
    • title & title_logo: see [Other customizations]
    • warning_toast: see [App security], -A toast pop-up message to help you check pre-deploy for security problems.
    • login_screen & login_theme & admin_page & admin_url: -see [Accounts, Login and Admin].
    • verbose: Give you more information on debugging. Most SPS core functions +
    +

    Note: Do not worry if you set some invalid values, on app start, `sps()` will check all SPS +options, ignore unknown values and set invalid values back to default. You will see warning +messages on console to tell you specifically what is wrong with your options.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionDefaultOther
    moderunning mode“local”“server”
    titleApp title“systemPipeShiny”any string
    title_logoApp logo to display on browser tab“img/sps_small.png”any path
    warning_toastshow security warnings?TRUEFALSE
    login_screenadd login screen?TRUEFALSE
    login_themelogin screen theme“random”see details
    use_crayoncolorful console message?TRUEFALSE
    verbosemore details for SPS functions?FALSETRUE
    admin_pageenable admin page?FALSETRUE
    admin_urladmin_page query url“admin”any string
    warning_toastfor internal test onlyTRUEFALSE
    module_wfload workflow module?TRUEFALSE
    module_rnaseqload RNAseq module?TRUEFALSE
    module_ggplotload quick ggplot module?TRUEFALSE
    tab_welcomeload welcome tab?TRUEFALSE
    tab_vs_mainload custom visualization main tab?TRUEFALSE
    tab_canvasload Canvas tab?TRUEFALSE
    tab_aboutload about tab?TRUEFALSE
    note_urlSPS notification remote URLsee code aboveany URL
    is_demouseful if deploy the app as a demoFALSETRUE
    welcome_guideenable the welcome guideTRUEFALSE
    app_pathhidden, automatically addedN.A.N.A.
    +

    Details

    +
      +
    • mode: see [App security] this option will change how +the upload files are selected.
    • +
    • title & title_logo: see [Other customizations]
    • +
    • warning_toast: see [App security], +A toast pop-up message to help you check pre-deploy for security problems.
    • +
    • login_screen & login_theme & admin_page & admin_url: +see [Accounts, Login and Admin].
    • +
    • verbose: Give you more information on debugging. Most SPS core functions has this option. If it is on, more debugging information will be printed -on console. See [Debugging]
    • module_xx – tab_xx: see [Toggle tabs] for loading and unloading -tabs.
    • tab_xx: see [Overwrite tabs] for customizing core SPS default tabs.
    • note_url: see [Notification system] for customizing SPS notifications.
    • is_demo: see [Workflow module].
    • welcome_guide: whether to enable the welcome guide on app start, see first image on SPS guide.
    • app_path: a hidden option. This will be added after the app starts. If not specified in -sps(), use current working directory.

    View/Set a single option

    SPS values are globally set, which means you can get/change the these options at +on console. See [Debugging] +

  • module_xx – tab_xx: see [Toggle tabs] for loading and unloading +tabs.
  • +
  • tab_xx: see [Overwrite tabs] for customizing core SPS default tabs.
  • +
  • note_url: see [Notification system] for customizing SPS notifications.
  • +
  • is_demo: see [Workflow module].
  • +
  • welcome_guide: whether to enable the welcome guide on app start, see first image on SPS guide.
  • +
  • app_path: a hidden option. This will be added after the app starts. If not specified in +sps(), use current working directory.
  • + +

    View/Set a single option

    +

    SPS values are globally set, which means you can get/change the these options at inside any R code, R functions and while the app is running (change options after app started -is not recommended).

    To view a single option value, use spsOption(opt = "OPTION_NAME"); to overwrite a single -option, use spsOption(opt = "OPTION_NAME", value = "NEW_VALUE").

    spsOption(opt = "mode")
    -
    ## [1] "local"
    -

    To overwrite the “mode” option:

    spsOption(opt = "mode", "local")
    -

    Check again, the value has changed to “local”:

    spsOption(opt = "mode")
    -
    ## [1] "local"
    -

    If any option does not exist, or the value is “empty” or 0, when getting the value spsOption will return FALSE. -Common “empty” values:

    • NA
    • NULL
    • length(value) == 0
    • "" (empty string)

    Read the help file of ?emptyIsFalse for more information.

    spsOption(opt = "random_opt")
    -
    ## [1] FALSE
    -

    However, these “empty” values can be meaningful in some cases, so use empty_is_false = FALSE -to return the original value instead of FALSE

    spsOption(opt = "random_opt", empty_is_false = FALSE)
    -
    ## NULL
    -

    Add your own options

    SPS is very flexible which allows you to add your own options. To do so, you need -to edit the “config/sps_options.yaml” file under your project root.

    You can use other options as templates to add more. There are two required entries:

    • default: will be used as default when you load SPS package.
    • other: Other valid options. If your user provided a value that is other than +is not recommended).

      +

      To view a single option value, use spsOption(opt = "OPTION_NAME"); to overwrite a single +option, use spsOption(opt = "OPTION_NAME", value = "NEW_VALUE").

      +
      spsOption(opt = "mode")
      +
      +
      ## [1] "local"
      +
      +

      To overwrite the “mode” option:

      +
      spsOption(opt = "mode", "local")
      +
      +

      Check again, the value has changed to “local”:

      +
      spsOption(opt = "mode")
      +
      +
      ## [1] "local"
      +
      +

      If any option does not exist, or the value is “empty” or 0, when getting the value spsOption will return FALSE. +Common “empty” values:

      +
        +
      • NA
      • +
      • NULL
      • +
      • length(value) == 0
      • +
      • "" (empty string)
      • +
      +

      Read the help file of ?emptyIsFalse for more information.

      +
      spsOption(opt = "random_opt")
      +
      +
      ## [1] FALSE
      +
      +

      However, these “empty” values can be meaningful in some cases, so use empty_is_false = FALSE +to return the original value instead of FALSE

      +
      spsOption(opt = "random_opt", empty_is_false = FALSE)
      +
      +
      ## NULL
      +
      +

      Add your own options

      +

      SPS is very flexible which allows you to add your own options. To do so, you need +to edit the “config/sps_options.yaml” file under your project root.

      +

      You can use other options as templates to add more. There are two required entries:

      +
        +
      • default: will be used as default when you load SPS package.
      • +
      • other: Other valid options. If your user provided a value that is other than the default or the other, SPS will show warnings and use default instead. -You can write "*" as the other value. It means any value will be accepted. -SPS will skip to check other valid values for this option.

      Currently, the default value can only be length of 1 but other value can be a -yaml array, which use [] to define: [value1, value2, ...].

      For example, we can add some but opening the file with a text editor, here we do -it programmatically:

      new_options <- 
      +You can write "*" as the other value. It means any value will be accepted.
      +SPS will skip to check other valid values for this option.
    • +
    +

    Currently, the default value can only be length of 1 but other value can be a +yaml array, which use [] to define: [value1, value2, ...].

    +

    For example, we can add some but opening the file with a text editor, here we do +it programmatically:

    +
    new_options <- 
     '
     my_opt1:
         default: true
    @@ -291,80 +1504,179 @@
         other: ["*"]
     '
     write(x = new_options, file = file.path(sps_dir, "config", "sps_options.yaml"), append = TRUE)
    -

    Then we can use spsOptDefaults to check

    spsOptDefaults(app_path = sps_dir)
    -
    ## title:
    -##     Default: systemPipeShiny 
    -##     Other: * 
    -## title_logo:
    -##     Default: img/sps_small.png 
    -##     Other: * 
    -## mode:
    -##     Default: local 
    -##     Other: server 
    -## login_screen:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## login_theme:
    -##     Default: random 
    -##     Other: * 
    -## use_crayon:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## verbose:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## admin_page:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## admin_url:
    -##     Default: admin 
    -##     Other: * 
    -## warning_toast:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## module_wf:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## module_rnaseq:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## module_ggplot:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_welcome:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_vs_main:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_canvas:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## tab_about:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## note_url:
    -##     Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    -##     Other: * 
    -## traceback:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## is_demo:
    -##     Default: FALSE 
    -##     Other: TRUE 
    -## welcome_guide:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## my_opt1:
    -##     Default: TRUE 
    -##     Other: FALSE 
    -## my_opt2:
    -##     Default: a 
    -##     Other: * 
    +
    +

    Then we can use spsOptDefaults to check

    +
    spsOptDefaults(app_path = sps_dir)
    +
    +
    ## title:
    +##     Default: systemPipeShiny 
    +##     Other: * 
    +## title_logo:
    +##     Default: img/sps_small.png 
    +##     Other: * 
    +## mode:
    +##     Default: local 
    +##     Other: server 
    +## login_screen:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## login_theme:
    +##     Default: random 
    +##     Other: * 
    +## use_crayon:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## verbose:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## admin_page:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## admin_url:
    +##     Default: admin 
    +##     Other: * 
    +## warning_toast:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## module_wf:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## module_rnaseq:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## module_ggplot:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_welcome:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_vs_main:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_canvas:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## tab_about:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## note_url:
    +##     Default: https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml 
    +##     Other: * 
    +## traceback:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## is_demo:
    +##     Default: FALSE 
    +##     Other: TRUE 
    +## welcome_guide:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## my_opt1:
    +##     Default: TRUE 
    +##     Other: FALSE 
    +## my_opt2:
    +##     Default: a 
    +##     Other: * 
     ## * means any value will be accepted
    -

    You can see the my_opt1 and my_opt2 have been added to SPS options.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/database/index.html b/public/sps/adv_features/database/index.html index 86d24161f..c75ff341f 100644 --- a/public/sps/adv_features/database/index.html +++ b/public/sps/adv_features/database/index.html @@ -1,75 +1,1088 @@ -SPS database | sysPipe

    SPS database


    SPS database is a small SQLite database which stores some basic app information, + + + + + + + + + + + + + + + + + + + +SPS database | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    SPS database

    + + +
    +

    SPS database is a small SQLite database which stores some basic app information, the project encryption key pair, account information. The database is controlled -by 3 SPS R6 classes:

    • spsDb: basic database management, queries.
    • spsEncryption: Interact with the SHA256 key pair in the database to encrypt -strings, and files. Also methods to view or change the key pair, inherits spsDb
    • spsAcount: use the encyption key pair to manage users and admin accounts in -SPS, inherits spsDb and spsEncryption.

    First to create a SPS project

    suppressPackageStartupMessages(library(systemPipeShiny))
    -
    app_path <- "."
    +by 3 SPS R6 classes:

    +
      +
    • spsDb: basic database management, queries.
    • +
    • spsEncryption: Interact with the SHA256 key pair in the database to encrypt +strings, and files. Also methods to view or change the key pair, inherits spsDb
    • +
    • spsAcount: use the encyption key pair to manage users and admin accounts in +SPS, inherits spsDb and spsEncryption.
    • +
    +

    First to create a SPS project

    +
    suppressPackageStartupMessages(library(systemPipeShiny))
    +
    +
    app_path <- "."
     spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE)
    -
    ## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains.
    +
    +
    ## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 1d1f76c8eecddb382ee2db097d6edbe9
     ## [SPS-INFO] 2021-04-22 15:45:04 SPS project setup done!
    -

    You can see a database created on a SPS project initiation, you should see a message -like this:

    [SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at 
    -

    Then we can use different class methods to interact with the database.

    spsDb class

    Reference manual under SPS Functions.

    Create a class object:

    mydb <- spsDb$new()
    -
    ## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container
    -

    create new db

    If there is no database, we can create one:

    # delete current one first
    +
    +

    You can see a database created on a SPS project initiation, you should see a message +like this:

    +
    [SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at 
    +
    +

    Then we can use different class methods to interact with the database.

    +

    spsDb class

    +

    Reference manual under SPS Functions.

    +

    Create a class object:

    +
    mydb <- spsDb$new()
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container
    +
    +

    create new db

    +

    If there is no database, we can create one:

    +
    # delete current one first
     try(file.remove("config/sps.db"))
     ## [1] TRUE
     # create a new one
    @@ -77,81 +1090,230 @@
     ## [SPS-INFO] 2021-04-22 15:45:04 Creating SPS db...
     ## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 6306a50abcf3c7618566911a793b0405
    -

    If you create a new database, all information in the old database -will be overwritten. All old information will be lost

    Get tables

    # meta info table
    +
    +

    If you create a new database, all information in the old database +will be overwritten. All old information will be lost

    +

    Get tables

    +
    # meta info table
     mydb$queryValue("sps_meta")
    -
    ##            info          value
    +
    +
    ##            info          value
     ## 1 creation_date 20210422154504
    -
    # raw blob table to store keys
    +
    +
    # raw blob table to store keys
     mydb$queryValue("sps_raw")
    -
    ##   info         value
    +
    +
    ##   info         value
     ## 1  key blob[1.36 kB]
    -
    # account table
    +
    +
    # account table
     mydb$queryValue("sps_account")
    -
    ##   account                                                             pass
    +
    +
    ##   account                                                             pass
     ## 1   admin bef2094c429fa5b0ff7a37abc6bf8dd31c29fa2acd783a2303935d2b8664ea21
     ## 2    user 12842a62c410af0f4b4dc866283a90f7b7c42c9d5ca0d0e1c812dca11021b052
     ##    role
     ## 1 admin
     ## 2  user
    -

    Insert new records(rows)

    To add a new row, values of all columns needs to be passed in a SQL string

    mydb$queryInsert("sps_meta", value = "'new1', '1'")
    -
    ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
    -

    Or pass in a vector:

    mydb$queryInsert("sps_meta", value = c("'new2'", "'2'"))
    -
    ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
    -
    # check the new table 
    +
    +

    Insert new records(rows)

    +

    To add a new row, values of all columns needs to be passed in a SQL string

    +
    mydb$queryInsert("sps_meta", value = "'new1', '1'")
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
    +
    +

    Or pass in a vector:

    +
    mydb$queryInsert("sps_meta", value = c("'new2'", "'2'"))
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
    +
    +
    # check the new table 
     mydb$queryValue("sps_meta")
    -
    ##            info          value
    +
    +
    ##            info          value
     ## 1 creation_date 20210422154504
     ## 2          new1              1
     ## 3          new2              2
    -

    change values

    mydb$queryUpdate("sps_meta", value = '234', col = "value", WHERE = "info = 'new1'")
    -
    ## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows
    -
    # check the update
    +
    +

    change values

    +
    mydb$queryUpdate("sps_meta", value = '234', col = "value", WHERE = "info = 'new1'")
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows
    +
    +
    # check the update
     mydb$queryValue("sps_meta")
    -
    ##            info          value
    +
    +
    ##            info          value
     ## 1 creation_date 20210422154504
     ## 2          new1            234
     ## 3          new2              2
    -

    remove values

    mydb$queryDel("sps_meta", WHERE = "value = '234'")
    -
    ## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows
    -
    # check again 
    +
    +

    remove values

    +
    mydb$queryDel("sps_meta", WHERE = "value = '234'")
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows
    +
    +
    # check again 
     mydb$queryValue("sps_meta")
    -
    ##            info          value
    +
    +
    ##            info          value
     ## 1 creation_date 20210422154504
     ## 2          new2              2
    -

    spsEncryption class

    Reference manual under SPS Functions.

    Start by creating a class object

    my_ecpt <- spsEncryption$new()
    +
    +

    spsEncryption class

    +

    Reference manual under SPS Functions.

    +

    Start by creating a class object

    +
    my_ecpt <- spsEncryption$new()
     ## [SPS-INFO] 2021-04-22 15:45:05 Created SPS encryption method container
     ## [SPS-INFO] 2021-04-22 15:45:05 Default SPS-db found and is working
    -

    Get current key

    To see the public and private keys (in {openssil{blk}} format):

    # private
    +
    +

    Get current key

    +

    To see the public and private keys (in {openssil{blk}} format):

    +
    # private
     my_ecpt$keyGet()
    -
    ## [2048-bit rsa private key]
    +
    +
    ## [2048-bit rsa private key]
     ## md5: 6306a50abcf3c7618566911a793b0405
    -
    # public
    +
    +
    # public
     my_ecpt$keyGet()$pubkey
    -
    ## [2048-bit rsa public key]
    +
    +
    ## [2048-bit rsa public key]
     ## md5: 6306a50abcf3c7618566911a793b0405
    -

    Change the encyption key

    Be super careful to change the encryption key. This will -result any file encrypted by the old key pair unlockable and the password of all -current accounts invalid.

    By default it will prevent you to change the key in case you accidentally run this -method

    my_ecpt$keyChange()
    -
    ## [SPS-DANGER] 2021-04-22 15:45:05 
    +
    +

    Change the encyption key

    +

    Be super careful to change the encryption key. This will +result any file encrypted by the old key pair unlockable and the password of all +current accounts invalid.

    +

    By default it will prevent you to change the key in case you accidentally run this +method

    +
    my_ecpt$keyChange()
    +
    +
    ## [SPS-DANGER] 2021-04-22 15:45:05 
     ## change this key will result all accounts' password failed to
     ## authenticate. You have to regenerate all password for all
     ## accounts. All encrypted file using the old key will fail to
     ## decrypt. There is NO way to RECOVER the old key, password
     ## and files. If you wish to continue, recall this function
     ## with `confirm = TRUE`.
    -

    Unless you are super sure with a confirmation

    my_ecpt$keyChange(confirm = TRUE)
    -
    ## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18
    -

    Encrypt files

    # imagine a file has one line "test"
    +
    +

    Unless you are super sure with a confirmation

    +
    my_ecpt$keyChange(confirm = TRUE)
    +
    +
    ## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18
    +
    +

    Encrypt files

    +
    # imagine a file has one line "test"
     writeLines(text = "test", con = "test.txt")
     my_ecpt$encrypt("test.txt", "test.bin", overwrite = TRUE)
    -

    Decrypt files

    my_ecpt$decrypt("test.bin", "test_decpt.txt", overwrite = TRUE)
    -

    Check the decrypted file content

    readLines('test_decpt.txt')
    -
    ## [1] "test"
    -

    spsAcount class

    This class is discussed in details in the Accounts, login and admin.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/debug/index.html b/public/sps/adv_features/debug/index.html index 8d2500fe4..63d979153 100644 --- a/public/sps/adv_features/debug/index.html +++ b/public/sps/adv_features/debug/index.html @@ -1,67 +1,1055 @@ -Debugging | sysPipe + + + + + + + + + + + + + + + + + +Debugging | sysPipe + + + + + + + + + + + + + + +

    Debugging


    There are some options in SPS that will give you more information and help you on -debugging. They are: verbose and traceback. You can config +suppressPackageStartupMessages(library(systemPipeShiny)) app_dir <- tempdir() spsInit(app_path = app_dir, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 17:46:53 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 17:46:53 Create project under /tmp/RtmpUfKCYR/SPS_20210416 ## [SPS-INFO] 2021-04-16 17:46:53 Now copy files ## [SPS-INFO] 2021-04-16 17:46:53 Create SPS database ## [SPS-INFO] 2021-04-16 17:46:53 Created SPS database method container ## [SPS-INFO] 2021-04-16 17:46:53 Creating SPS db."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Debugging

    + + +
    +

    There are some options in SPS that will give you more information and help you on +debugging. They are: verbose and traceback. You can config (enable/disable) themin a SPS project’s global.R file, or use -spsOption("verbose", TRUE) and spsOption("traceback", TRUE) to turn on them.

    Some setup:

    suppressPackageStartupMessages(library(systemPipeShiny))
    +spsOption("verbose", TRUE) and spsOption("traceback", TRUE) to turn on them.

    +

    Some setup:

    +
    suppressPackageStartupMessages(library(systemPipeShiny))
     app_dir <- tempdir()
     spsInit(app_path = app_dir, overwrite = TRUE, change_wd = FALSE, open_files = FALSE)
     ## [SPS-INFO] 2021-04-16 17:46:53 Start to create a new SPS project
    @@ -74,17 +1062,23 @@
     ## [SPS-INFO] 2021-04-16 17:46:53 Key md5 fc8c85a0e87073328864bd542d740801
     ## [SPS-INFO] 2021-04-16 17:46:53 SPS project setup done!
     app_path <- file.path(app_dir, glue::glue("SPS_{format(Sys.time(), '%Y%m%d')}"))
    -

    verbose

    In many SPS functions, there is this argument verbose and usually default is FALSE. -It means do not print extra message, keep it clean. You can set in spsOption("verbose", TRUE) +

    +

    verbose

    +

    In many SPS functions, there is this argument verbose and usually default is FALSE. +It means do not print extra message, keep it clean. You can set in spsOption("verbose", TRUE) or inside global.R file to turn on. These are called global settings, and you -can use a local setting to overwrite it (func(..., verbose = TRUE)).

    Let’s use SPS main function sps for example, without the verbose

    spsOption("verbose", FALSE)
    +can use a local setting to overwrite it (func(..., verbose = TRUE)).

    +

    Let’s use SPS main function sps for example, without the verbose

    +
    spsOption("verbose", FALSE)
     app <- sps(app_path = app_path)
     ## Warning: 
     [SPS-WARNING] 2021-04-16 17:46:53 These plot tabs has no image path:
     ## 'vs_example'
     ## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery.
     ## [SPS-INFO] 2021-04-16 17:46:55 App starts ...
    -

    Turn on the verbose:

    spsOption("verbose", TRUE)
    +
    +

    Turn on the verbose:

    +
    spsOption("verbose", TRUE)
     app <- sps(app_path = app_path)
     ## [SPS-INFO] 2021-04-16 17:46:55 App has 19 default configs, resolving 19 custom configs
     ## [SPS-INFO] 2021-04-16 17:46:55 Now check the tab info in tabs.csv
    @@ -114,10 +1108,14 @@
     ## [SPS-INFO] 2021-04-16 17:46:55 Load custom tabs servers
     ## [SPS-INFO] 2021-04-16 17:46:55 Server functions created
     ## [SPS-INFO] 2021-04-16 17:46:55 App starts ...
    -

    Exception

    There is one exception which is the spsInit. It is used to create a SPS project +

    +

    Exception

    +

    There is one exception which is the spsInit. It is used to create a SPS project for you, so it assumes you do not have a SPS project yet and therefore do not have the chance to reach SPS options. So the verbose global setting will not work here. -You need to turn it on locally with verbose = TRUE.

    Compare messages of this with the initial spsInit creation on top.

    spsInit(verbose = TRUE, app_path = app_path, overwrite = TRUE, change_wd = FALSE, open_files = FALSE)
    +You need to turn it on locally with verbose = TRUE.

    +

    Compare messages of this with the initial spsInit creation on top.

    +
    spsInit(verbose = TRUE, app_path = app_path, overwrite = TRUE, change_wd = FALSE, open_files = FALSE)
     ## [SPS-INFO] 2021-04-16 17:46:55 Start to create a new SPS project
     ## [SPS-INFO] 2021-04-16 17:46:55 Create project under /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416
     ## [SPS-INFO] 2021-04-16 17:46:55 Now copy files
    @@ -145,20 +1143,35 @@
     ## [SPS-DANGER] 2021-04-16 17:46:56 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-16 17:46:56 Key md5 7dca8a45de4d7260f91ddb1a02d0a6bd
     ## [SPS-INFO] 2021-04-16 17:46:56 SPS project setup done!
    -

    traceback

    When error happens, it will be helpful if we can know where it happened. This option +

    +

    traceback

    +

    When error happens, it will be helpful if we can know where it happened. This option will give you additional information of which function it happened, the system call -list and error file and line of code if possible.

    This feature is enabled in two functions sps and shinyCatch.

    • sps: Adding tracebacks if there are some errors sourcing helper functions located -in your SPS project under the R folder.
    • shinyCatch: Traceback errors of expressions inside shinyCatch

    Let’s use shinyCatch to demo.

    Before adding traceback:

    spsOption("traceback", FALSE)
    +list and error file and line of code if possible.

    +

    This feature is enabled in two functions sps and shinyCatch.

    +
      +
    • sps: Adding tracebacks if there are some errors sourcing helper functions located +in your SPS project under the R folder.
    • +
    • shinyCatch: Traceback errors of expressions inside shinyCatch
    • +
    +

    Let’s use shinyCatch to demo.

    +

    Before adding traceback:

    +
    spsOption("traceback", FALSE)
     shinyCatch({
       stop("some error message")
     })
    -
    ## [SPS-ERROR] 2021-04-16 17:46:56 some error message
    -
    ## NULL
    -

    After

    spsOption("traceback", TRUE)
    +
    +
    ## [SPS-ERROR] 2021-04-16 17:46:56 some error message
    +
    +
    ## NULL
    +
    +

    After

    +
    spsOption("traceback", TRUE)
     shinyCatch({
       stop("some error message")
     })
    -
    ## 1. local({
    +
    +
    ## 1. local({
     ##     if (length(a <- commandArgs(TRUE)) != 2) 
     ##         stop("The number of arguments passed to Rscript should be 2.")
     ##     x = readRDS(a[1])
    @@ -240,16 +1253,24 @@
     ## 35. withCallingHandlers(expr, warning = function(w) if (inherits(w, classes)) tryInvokeRestart("muffleWarning")) 
     ## 36. withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())) 
     ## [SPS-ERROR] 2021-04-16 17:46:56 some error message
    -
    ## NULL
    -

    Or use local setting to overwrite the global, even we have spsOption("traceback", TRUE), -but traceback is still muted by trace_back = FALSE.

    spsOption("traceback", TRUE)
    +
    +
    ## NULL
    +
    +

    Or use local setting to overwrite the global, even we have spsOption("traceback", TRUE), +but traceback is still muted by trace_back = FALSE.

    +
    spsOption("traceback", TRUE)
     shinyCatch({
       stop("some error message")
     }, trace_back = FALSE)
    -
    ## [SPS-ERROR] 2021-04-16 17:46:56 some error message
    -
    ## NULL
    -

    Traceback with file and line number

    Let’s write an R file with functions, source it and then call the function from -this file. Try it on your own computer:

    temp_file <- tempfile(fileext = ".R")
    +
    +
    ## [SPS-ERROR] 2021-04-16 17:46:56 some error message
    +
    +
    ## NULL
    +
    +

    Traceback with file and line number

    +

    Let’s write an R file with functions, source it and then call the function from +this file. Try it on your own computer:

    +
    temp_file <- tempfile(fileext = ".R")
     writeLines(
       "myFunc <- function(){
           myFunc2()
    @@ -265,9 +1286,14 @@
     shinyCatch({
       myFunc()
     })
    -

    You can see the error happened in myFunc line No. 2 and then inside this function +

    +

    +

    You can see the error happened in myFunc line No. 2 and then inside this function it calls another function myFunc2 which caused the final error. In myFunc2 -it is also the line No. 2 caused the issue and error is coming from /tmp/... file.

    other Shiny built-in options

    There are some Shiny options can also be helpful on debugging:

    # developer mode, use ?devmode to see details 
    +it is also the line No. 2 caused the issue and error is coming from /tmp/... file.

    +

    other Shiny built-in options

    +

    There are some Shiny options can also be helpful on debugging:

    +
    # developer mode, use ?devmode to see details 
     devmode(TRUE)
     # inspect reactivity in shiny
     options(shiny.reactlog = TRUE)
    @@ -277,10 +1303,106 @@
     options(shiny.error = browser)
     # when a shiny app file saves, reload the app, not working with modular apps like SPS at this moment
     options(shiny.autoreload = TRUE)
    -

    See Shiny option website{blk} -for more details

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/displaytabs/index.html b/public/sps/adv_features/displaytabs/index.html index c5a8b8b01..06e897b3f 100644 --- a/public/sps/adv_features/displaytabs/index.html +++ b/public/sps/adv_features/displaytabs/index.html @@ -1,66 +1,1110 @@ -Toggle tabs | sysPipe + + + + + + + + + + + + + + + + + +Toggle tabs | sysPipe + + + + + + + + + + + + + + +

    Toggle tabs


    Load and unload tabs

    In SPS, all tabs including tabs for modules and other default tabs can be -loaded and unloaded. This is controlled by SPS options

    Under current version, these options are:

    OptionDescriptionDefaultOther
    module_wfload workflow module?TRUEFALSE
    module_rnaseqload RNAseq module?TRUEFALSE
    module_ggplotload quick ggplot module?TRUEFALSE
    tab_welcomeload welcome tab?TRUEFALSE
    tab_vs_mainload custom visualization main tab?TRUEFALSE
    tab_canvasload Canvas tab?TRUEFALSE
    tab_aboutload about tab?TRUEFALSE

    Each of them controls whether to load or unload a tab. By default, all tabs -are loaded, but you can unload them by turn them to FALSE.

    The original UI look like this:

    Default UI

    To unload some tabs, scroll to the option lines in global.R file:

    options(sps = list(
    +   Option Description Default Other     module_wf load workflow module? TRUE FALSE   module_rnaseq load RNAseq module? TRUE FALSE   module_ggplot load quick ggplot module? TRUE FALSE   tab_welcome load welcome tab?"/>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  
    +  
    +    
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Toggle tabs

    + + +
    +

    Load and unload tabs

    +

    In SPS, all tabs including tabs for modules and other default tabs can be +loaded and unloaded. This is controlled by SPS options

    +

    Under current version, these options are:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionDefaultOther
    module_wfload workflow module?TRUEFALSE
    module_rnaseqload RNAseq module?TRUEFALSE
    module_ggplotload quick ggplot module?TRUEFALSE
    tab_welcomeload welcome tab?TRUEFALSE
    tab_vs_mainload custom visualization main tab?TRUEFALSE
    tab_canvasload Canvas tab?TRUEFALSE
    tab_aboutload about tab?TRUEFALSE
    +

    Each of them controls whether to load or unload a tab. By default, all tabs +are loaded, but you can unload them by turn them to FALSE.

    +

    The original UI look like this:

    +
    +

    +Default UI +
    +

    To unload some tabs, scroll to the option lines in global.R file:

    +
    options(sps = list(
         ...
         tab_welcome = TRUE,
         tab_vs_main = TRUE,
    @@ -71,21 +1115,129 @@
         module_ggplot = TRUE,
         ...
     ))
    -

    We unload the “Canvas tab”, “workflow module tab”, “RNASeq module tab” and -“About tab”. When you restart the app, you should see some tabs are gone:

    The original UI look like this:

    Unload some tabs

    Exception for module main page

    You may have noticed, there is no option to unload the module main tab, which is +

    +

    We unload the “Canvas tab”, “workflow module tab”, “RNASeq module tab” and +“About tab”. When you restart the app, you should see some tabs are gone:

    +

    The original UI look like this:

    +
    +

    +Unload some tabs +
    +

    Exception for module main page

    +

    You may have noticed, there is no option to unload the module main tab, which is named “Modules” on the left sidebar. This is because this tab is controlled by its sub-tabs, the module tab options. To unload this tab, all the module tabs have to be unloaded the same time like following. If any module -is loaded, this module main tab cannot be unloaded.

    options(sps = list(
    +is loaded, this module main tab cannot be unloaded.

    +
    options(sps = list(
         ...
         module_wf = FALSE,
         module_rnaseq = FALSE,
         module_ggplot = FALSE,
         ...
     ))
    -

    No module loaded
    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/guide/index.html b/public/sps/adv_features/guide/index.html index ffdff650a..7e095366b 100644 --- a/public/sps/adv_features/guide/index.html +++ b/public/sps/adv_features/guide/index.html @@ -1,70 +1,1076 @@ -SPS Guide | sysPipe + + + + + + + + + + + + + + + + + +SPS Guide | sysPipe + + + + + + + + + + + + + + +

    SPS Guide


    SPS interative guides (tutorials)

    SPS provides some interactive guides for users to familiarize the app. There is a +By clicking the guide dropdown menu, you can open up the list of available guides. By default, we only proivde a main SPS guide."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    SPS Guide

    + + +
    +

    SPS interative guides (tutorials)

    +

    SPS provides some interactive guides for users to familiarize the app. There is a very simple one-step welcome guide that will initialize everytime on app start to indicate -where the guide dropdown is (top-right corner).

    Welcome guide on start


    By clicking the guide dropdown menu, you can open up the list of available guides. -By default, we only proivde a main SPS guide.

    Guide dropdown menu


    If any of the guide is clicked in the dropdown, the corresponding interactive guide -will start.

    Guide started

    You can click “Next”, “Previous” or “Close” to navigate the guide or close the guide.

    Custom guide

    To build and provide your custom guides to your users, there is file guide_content.R +where the guide dropdown is (top-right corner).

    +
    +

    +Welcome guide on start +
    +


    By clicking the guide dropdown menu, you can open up the list of available guides. +By default, we only proivde a main SPS guide.

    +
    +

    +Guide dropdown menu +
    +


    If any of the guide is clicked in the dropdown, the corresponding interactive guide +will start.

    +
    +

    +Guide started +
    +

    You can click “Next”, “Previous” or “Close” to navigate the guide or close the guide.

    +

    Custom guide

    +

    To build and provide your custom guides to your users, there is file guide_content.R created on SPS project initialization under the R folder: /R/guide_content.R. -This is the place to define your own guide.

    This file look like this:

    #################### Define your custom SPS tutorials ##########################
    +This is the place to define your own guide.

    +

    This file look like this:

    +
    #################### Define your custom SPS tutorials ##########################
     # use `shinydashboardPlus::messageItem` to add your tutorials UI to this list
     guide_ui <- list(
         ## An example is provided below
    @@ -88,8 +1094,19 @@
                  position = "right-center")$
             ...
     ))
    -

    There are two parts that you need to define: UI and actual guide content.

    UI

    UI is what users see inside the dropdown menu. Guides UI needs to be stored in a -list and each item should be a shinydashboardPlus::messageItem.

    • inputId must be unique.
    • from is the short description of the guide.
    • icon should be a call of shiny::icon(), the icon of the guide in dropdown menu
    • message: short description of the guide in dropdown menu

    To add multiple guides' UI, for example:

    guide_ui <- list(
    +
    +

    There are two parts that you need to define: UI and actual guide content.

    +

    UI

    +

    UI is what users see inside the dropdown menu. Guides UI needs to be stored in a +list and each item should be a shinydashboardPlus::messageItem.

    +
      +
    • inputId must be unique.
    • +
    • from is the short description of the guide.
    • +
    • icon should be a call of shiny::icon(), the icon of the guide in dropdown menu
    • +
    • message: short description of the guide in dropdown menu
    • +
    +

    To add multiple guides' UI, for example:

    +
    guide_ui <- list(
         ## An example is provided below
         shinydashboardPlus::messageItem(
             inputId = "guide1",
    @@ -101,9 +1118,13 @@
         ),
         ...
     )
    -

    Guide content

    The guide content is defined with the {cicerone{blk}} -package with cicerone::Cicerone R6 class and also in a named list.

    The name of each item in a list must match the name of inputId in guide UI. -For example, we have two guides

    guide_ui <- list(
    +
    +

    Guide content

    +

    The guide content is defined with the {cicerone{blk}} +package with cicerone::Cicerone R6 class and also in a named list.

    +

    The name of each item in a list must match the name of inputId in guide UI. +For example, we have two guides

    +
    guide_ui <- list(
         ## An example is provided below
         shinydashboardPlus::messageItem(
             inputId = "guide1",
    @@ -122,20 +1143,130 @@
         guide2 = cicerone::Cicerone$new(overlay_click_next = TRUE)$
             ...
     ))
    -

    The “guide1” of inputId in the guide_ui must match “guide1” in guide_content list.

    The “guide2” of inputId in the guide_ui must match “guide2” in guide_content list.

    Define guide content

    How to define the guide content will not be expanded here, read details in the {cicerone{blk}} package manual. -Here are some key points:

    • The cicerone::Cicerone is R6 class, and it is obejct oriented, so +
    +

    The “guide1” of inputId in the guide_ui must match “guide1” in guide_content list.

    +

    The “guide2” of inputId in the guide_ui must match “guide2” in guide_content list.

    +

    Define guide content

    +

    How to define the guide content will not be expanded here, read details in the {cicerone{blk}} package manual. +Here are some key points:

    +
      +
    • The cicerone::Cicerone is R6 class, and it is obejct oriented, so you need to use cicerone::Cicerone$new() method to create a new object before you -can add any guide step.
    • R6 methods calling can be chained together, like how to define steps:
      guide_content <- try(list(
      +can add any guide step.
    • +
    • R6 methods calling can be chained together, like how to define steps: +
      guide_content <- try(list(
           guide1 = cicerone::Cicerone$new()$ # chain object creation with step defining
               step(...)$                     # chain step1 to step2
               step(...)$                     # step2 to step3
               step(...)$                     # step3 to step4
               step(...)                      # DO NOT use `$` for the last step
       ))
      -

    If you follow the manual of {cicerone} to define steps, the guide will look like this -when users click it.

    Cicerone steps
    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/index.html b/public/sps/adv_features/index.html index 09e32f875..d1eb32060 100644 --- a/public/sps/adv_features/index.html +++ b/public/sps/adv_features/index.html @@ -1,62 +1,1259 @@ -Advanced features | sysPipe

    Advanced features


    The basic usage of SPS with these default modules/tabs has been discussed in previous + + + + + + + + + + + + + + + + + + + + +Advanced features | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + +
    +
    + + + + + + +
    +

    Advanced features

    + + +
    +

    The basic usage of SPS with these default modules/tabs has been discussed in previous sections. SPS provides much more than this. To fully use SPS’s framework functionalities, -in this section, we will discuss how you can customize SPS and add new features.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/index.xml b/public/sps/adv_features/index.xml index c62995556..aab995d71 100644 --- a/public/sps/adv_features/index.xml +++ b/public/sps/adv_features/index.xml @@ -1,551 +1,588 @@ -sysPipe – Advanced features/sps/adv_features/Recent content in Advanced features on sysPipeHugo -- gohugo.ioSps: Configuration/sps/adv_features/config/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/config/ -<p>SPS has many options you can change. These options will determine how the app -behaves.</p> -<hr> -<h2 id="config-sps">Config SPS</h2> -<p>Let us start by creating an example SPS project. For demo purpose, we are using the -<code>/tmp</code> folder but one should use a regular location instead of the temp in a real -case.</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) + + + sysPipe – Advanced features + /sps/adv_features/ + Recent content in Advanced features on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sps: Configuration + /sps/adv_features/config/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/config/ + + + + <p>SPS has many options you can change. These options will determine how the app +behaves.</p> +<hr> +<h2 id="config-sps">Config SPS</h2> +<p>Let us start by creating an example SPS project. For demo purpose, we are using the +<code>/tmp</code> folder but one should use a regular location instead of the temp in a real +case.</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) spsInit(app_path = tempdir(), project_name = &quot;config_demo&quot;, overwrite = TRUE, change_wd = FALSE) -</code></pre> -<pre><code>## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. +</code></pre> +<pre><code>## [SPS-DANGER] 2021-04-25 19:43:24 Done, Db created at '/tmp/RtmphrNOOX/config_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-25 19:43:24 Key md5 ee81377a81fdb757fbbbb6af38644756 ## [SPS-INFO] 2021-04-25 19:43:24 SPS project setup done! -</code></pre> -<pre><code class="language-r">## save project path +</code></pre> +<pre><code class="language-r">## save project path (sps_dir &lt;- file.path(tempdir(), &quot;config_demo&quot;)) -</code></pre> -<pre><code>## [1] &quot;/tmp/RtmphrNOOX/config_demo&quot; -</code></pre> -<p>To reproduce code locally, run the following chunk instead.</p> -<pre><code class="language-r">library(systemPipeShiny) +</code></pre> +<pre><code>## [1] &quot;/tmp/RtmphrNOOX/config_demo&quot; +</code></pre> +<p>To reproduce code locally, run the following chunk instead.</p> +<pre><code class="language-r">library(systemPipeShiny) spsInit() sps_dir &lt;- normalizePath(&quot;.&quot;) -</code></pre> -<STYLE type='text/css' scoped> +</code></pre> +<STYLE type='text/css' scoped> PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em}; -</STYLE> -<h2 id="sps-structure">SPS structure</h2> -<pre> -SPS_xx/ -├── server.R <span class="text-success">|</span> -├── global.R <span class="text-success">| Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit</span> -├── ui.R <span class="text-success">|</span> -├── deploy.R <span class="text-info">| Deploy helper file</span> -├── config <span class="text-success">| Important app config files. Do not edit them if you don't know</span> -│ ├── sps.db <span class="text-gray">| SPS database</span> -│ ├── sps_options.yaml <span class="text-gray">| SPS default option list</span> -│ └── tabs.csv <span class="text-gray">| SPS tab registration information</span> -├── data <span class="text-primary">| App example data files</span> -│ ├── xx.csv -├── R <span class="text-primary">| All SPS custom tab files and helper R function files</span> -│ ├── tab_xx.R -├── README.md -├── results <span class="text-gray">| To store data generated from the app, like the workflow module</span> -│ └── README.md -└── www <span class="text-primary">| Internet resources</span> -├── css <span class="text-info">| CSS files</span> -│ └── sps.css -├── img <span class="text-info">| App image resources</span> -│ └── xx.png -├── js <span class="text-info">| Javascripts</span> -│ └── xx.js -├── loading_themes <span class="text-info">| Loading screen files</span> -│ └── xx.html -└── plot_list <span class="text-info">| Image files for plot gallery</span> -└── plot_xx.jpg -</pre> -<p>This is a reminder of what you will get when a SPS project is initiated with <code>spsInit()</code>.</p> -<ol> -<li>For most users, the <code>global.R</code> file is the only file that one needs to make change.</li> -<li>The second important files are the files inside <code>config</code> folder. For normal users, +</STYLE> +<h2 id="sps-structure">SPS structure</h2> +<pre> +SPS_xx/ +├── server.R <span class="text-success">|</span> +├── global.R <span class="text-success">| Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit</span> +├── ui.R <span class="text-success">|</span> +├── deploy.R <span class="text-info">| Deploy helper file</span> +├── config <span class="text-success">| Important app config files. Do not edit them if you don't know</span> +│ ├── sps.db <span class="text-gray">| SPS database</span> +│ ├── sps_options.yaml <span class="text-gray">| SPS default option list</span> +│ └── tabs.csv <span class="text-gray">| SPS tab registration information</span> +├── data <span class="text-primary">| App example data files</span> +│ ├── xx.csv +├── R <span class="text-primary">| All SPS custom tab files and helper R function files</span> +│ ├── tab_xx.R +├── README.md +├── results <span class="text-gray">| To store data generated from the app, like the workflow module</span> +│ └── README.md +└── www <span class="text-primary">| Internet resources</span> + ├── css <span class="text-info">| CSS files</span> + │ └── sps.css + ├── img <span class="text-info">| App image resources</span> + │ └── xx.png + ├── js <span class="text-info">| Javascripts</span> + │ └── xx.js + ├── loading_themes <span class="text-info">| Loading screen files</span> + │ └── xx.html + └── plot_list <span class="text-info">| Image files for plot gallery</span> + └── plot_xx.jpg +</pre> +<p>This is a reminder of what you will get when a SPS project is initiated with <code>spsInit()</code>.</p> +<ol> +<li>For most users, the <code>global.R</code> file is the only file that one needs to make change.</li> +<li>The second important files are the files inside <code>config</code> folder. For normal users, these files are controlled by SPS functions. No need to make any modification. For advanced users, deep customization is possible. -<ul> -<li><code>sps_options.yaml</code> stores all default and valid values for SPS, details are -listed <a href="#app-options">below</a></li> -<li><code>tabs.csv</code> all SPS tab registration information. Read <a href="../tabs">Manage tabs</a></li> -<li><code>sps.db</code> A SQLite database to store data generated in SPS. Read <a href="../database">SPS database</a> -for more information.</li> -</ul> -</li> -<li><code>R</code> folder stores all custom tab files, your helper functions. This <code>.R</code> or <code>.r</code> files under this -folder <strong>will be automatically sourced</strong> when SPS starts. This is discussed in -<a href="../tabs">Manage tabs</a>.</li> -<li><code>www</code> folder is where you add the internet resources, like images you want to show in -the app, <code>css</code> style sheets to attach. Read more <a href="https://stevenmortimer.com/tips-for-making-professional-shiny-apps-with-r/#create-a-www-folder">here</a>.</li> -</ol> -<h2 id="app-options">App options</h2> -<h3 id="viewset-all-options">View/Set all options</h3> -<p>App options in SPS are controlled by &ldquo;SPS options&rdquo;. These options can change -app appearance, debugging level, server behaviors, <em>etc</em>. The valid options can -be found and change on the <code>global.R</code> file. They are similar to <em>Shiny</em> options, -but unlike <em>shiny</em> options that are single values, SPS options are passed using the <code>Option(sps = list(...))</code> -function in <code>global.R</code> as a group. To view all options and their default, valid -values('*' means any value is okay) see <code>global.R</code> from -the line starting with <em>## SPS options</em>. We provided some comments below that line to +<ul> +<li><code>sps_options.yaml</code> stores all default and valid values for SPS, details are +listed <a href="#app-options">below</a></li> +<li><code>tabs.csv</code> all SPS tab registration information. Read <a href="../tabs">Manage tabs</a></li> +<li><code>sps.db</code> A SQLite database to store data generated in SPS. Read <a href="../database">SPS database</a> +for more information.</li> +</ul> +</li> +<li><code>R</code> folder stores all custom tab files, your helper functions. This <code>.R</code> or <code>.r</code> files under this +folder <strong>will be automatically sourced</strong> when SPS starts. This is discussed in +<a href="../tabs">Manage tabs</a>.</li> +<li><code>www</code> folder is where you add the internet resources, like images you want to show in +the app, <code>css</code> style sheets to attach. Read more <a href="https://stevenmortimer.com/tips-for-making-professional-shiny-apps-with-r/#create-a-www-folder">here</a>.</li> +</ol> +<h2 id="app-options">App options</h2> +<h3 id="viewset-all-options">View/Set all options</h3> +<p>App options in SPS are controlled by &ldquo;SPS options&rdquo;. These options can change +app appearance, debugging level, server behaviors, <em>etc</em>. The valid options can +be found and change on the <code>global.R</code> file. They are similar to <em>Shiny</em> options, +but unlike <em>shiny</em> options that are single values, SPS options are passed using the <code>Option(sps = list(...))</code> +function in <code>global.R</code> as a group. To view all options and their default, valid +values('*' means any value is okay) see <code>global.R</code> from +the line starting with <em>## SPS options</em>. We provided some comments below that line to generally describe what each option is and valid values for options. Use function -<code>spsOptDefaults</code> to see the default and other valid options.</p> -<pre><code class="language-r">spsOptDefaults(app_path = sps_dir) -</code></pre> -<PRE class="fansi fansi-output"><CODE>## <span style='color: #0000BB;font-weight: bold;'>title</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>systemPipeShiny -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>img/sps_small.png -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>local -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>server -## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>random -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>admin -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +<code>spsOptDefaults</code> to see the default and other valid options.</p> +<pre><code class="language-r">spsOptDefaults(app_path = sps_dir) +</code></pre> +<PRE class="fansi fansi-output"><CODE>## <span style='color: #0000BB;font-weight: bold;'>title</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>systemPipeShiny +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>img/sps_small.png +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>local +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>server +## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>random +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>admin +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE ## * means any value will be accepted -</span></CODE></PRE> -<p>After the app has started once, you can use <code>spsOptions()</code> to see all current settings.</p> -<pre><code class="language-r">spsOptions(app_path = sps_dir) -</code></pre> -<PRE class="fansi fansi-output"><CODE>## <span style='color: #00BB00;font-weight: bold;'>Current project option settings:</span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>title</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>systemPipeShiny </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>img/sps_small.png </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>local </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>random </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>admin </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> -## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +</span></CODE></PRE> +<p>After the app has started once, you can use <code>spsOptions()</code> to see all current settings.</p> +<pre><code class="language-r">spsOptions(app_path = sps_dir) +</code></pre> +<PRE class="fansi fansi-output"><CODE>## <span style='color: #00BB00;font-weight: bold;'>Current project option settings:</span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>title</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>systemPipeShiny </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>img/sps_small.png </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>local </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>random </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>admin </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>FALSE </span><span> +## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'>TRUE </span><span> ## ******** ## Option legend: -## </span><span style='color: #0000BB;font-weight: bold;'> known options </span><span style='color: #BBBB00;font-weight: bold;'> Hidden/custom options* and values+ -## </span><span>Value legend: -## </span><span style='color: #00BB00;font-weight: bold;'> same as default values </span><span> different from defaults+ -</span></CODE></PRE> -<p>A copy of options in <code>global.R</code>:</p> -<pre><code class="language-r">options(sps = list( -title = &quot;systemPipeShiny&quot;, -title_logo = &quot;img/sps_small.png&quot;, -mode = &quot;local&quot;, -warning_toast = FALSE, -login_screen = FALSE, -login_theme = &quot;random&quot;, -use_crayon = TRUE, -verbose = FALSE, -admin_page = TRUE, -admin_url = &quot;admin&quot;, -note_url = 'https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml', -tab_welcome = TRUE, -tab_vs_main = TRUE, -tab_canvas = TRUE, -tab_about = TRUE, -module_wf = TRUE, -module_rnaseq = TRUE, -module_ggplot = TRUE, -traceback = FALSE, -is_demo = FALSE, -welcome_guide = TRUE +## </span><span style='color: #0000BB;font-weight: bold;'> known options </span><span style='color: #BBBB00;font-weight: bold;'> Hidden/custom options* and values+ +## </span><span>Value legend: +## </span><span style='color: #00BB00;font-weight: bold;'> same as default values </span><span> different from defaults+ +</span></CODE></PRE> +<p>A copy of options in <code>global.R</code>:</p> +<pre><code class="language-r">options(sps = list( + title = &quot;systemPipeShiny&quot;, + title_logo = &quot;img/sps_small.png&quot;, + mode = &quot;local&quot;, + warning_toast = FALSE, + login_screen = FALSE, + login_theme = &quot;random&quot;, + use_crayon = TRUE, + verbose = FALSE, + admin_page = TRUE, + admin_url = &quot;admin&quot;, + note_url = 'https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml', + tab_welcome = TRUE, + tab_vs_main = TRUE, + tab_canvas = TRUE, + tab_about = TRUE, + module_wf = TRUE, + module_rnaseq = TRUE, + module_ggplot = TRUE, + traceback = FALSE, + is_demo = FALSE, + welcome_guide = TRUE )) -</code></pre> -<p style="color:var(--danger)">Note: Do not worry if you set some invalid values, on app start, `sps()` will check all SPS -options, ignore unknown values and set invalid values back to default. You will see warning -messages on console to tell you specifically what is wrong with your options.</p> -<table> -<thead> -<tr> -<th>Option</th> -<th>Description</th> -<th>Default</th> -<th>Other</th> -</tr> -</thead> -<tbody> -<tr> -<td>mode</td> -<td>running mode</td> -<td>&ldquo;local&rdquo;</td> -<td>&ldquo;server&rdquo;</td> -</tr> -<tr> -<td>title</td> -<td>App title</td> -<td>&ldquo;systemPipeShiny&rdquo;</td> -<td>any string</td> -</tr> -<tr> -<td>title_logo</td> -<td>App logo to display on browser tab</td> -<td>&ldquo;img/sps_small.png&rdquo;</td> -<td>any path</td> -</tr> -<tr> -<td>warning_toast</td> -<td>show security warnings?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>login_screen</td> -<td>add login screen?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>login_theme</td> -<td>login screen theme</td> -<td>&ldquo;random&rdquo;</td> -<td>see details</td> -</tr> -<tr> -<td>use_crayon</td> -<td>colorful console message?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>verbose</td> -<td>more details for SPS functions?</td> -<td>FALSE</td> -<td>TRUE</td> -</tr> -<tr> -<td>admin_page</td> -<td>enable admin page?</td> -<td>FALSE</td> -<td>TRUE</td> -</tr> -<tr> -<td>admin_url</td> -<td>admin_page query url</td> -<td>&ldquo;admin&rdquo;</td> -<td>any string</td> -</tr> -<tr> -<td>warning_toast</td> -<td>for internal test only</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>module_wf</td> -<td>load workflow module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>module_rnaseq</td> -<td>load RNAseq module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>module_ggplot</td> -<td>load quick ggplot module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_welcome</td> -<td>load welcome tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_vs_main</td> -<td>load custom visualization main tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_canvas</td> -<td>load Canvas tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_about</td> -<td>load about tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>note_url</td> -<td>SPS notification remote URL</td> -<td>see code above</td> -<td>any URL</td> -</tr> -<tr> -<td>is_demo</td> -<td>useful if deploy the app as a demo</td> -<td>FALSE</td> -<td>TRUE</td> -</tr> -<tr> -<td>welcome_guide</td> -<td>enable the welcome guide</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>app_path</td> -<td>hidden, automatically added</td> -<td>N.A.</td> -<td>N.A.</td> -</tr> -</tbody> -</table> -<h3 id="details">Details</h3> -<ul> -<li><strong>mode</strong>: see [<a href="../app_security">App security</a>] this option will change how -the upload files are selected.</li> -<li><strong>title &amp; title_logo</strong>: see [<a href="../other_customizations">Other customizations</a>]</li> -<li><strong>warning_toast</strong>: see [<a href="../app_security">App security</a>], -A toast pop-up message to help you check pre-deploy for security problems.</li> -<li><strong>login_screen &amp; login_theme &amp; admin_page &amp; admin_url</strong>: -see [<a href="../login">Accounts, Login and Admin</a>].</li> -<li><strong>verbose</strong>: Give you more information on debugging. Most SPS core functions +</code></pre> +<p style="color:var(--danger)">Note: Do not worry if you set some invalid values, on app start, `sps()` will check all SPS +options, ignore unknown values and set invalid values back to default. You will see warning +messages on console to tell you specifically what is wrong with your options.</p> +<table> +<thead> +<tr> +<th>Option</th> +<th>Description</th> +<th>Default</th> +<th>Other</th> +</tr> +</thead> +<tbody> +<tr> +<td>mode</td> +<td>running mode</td> +<td>&ldquo;local&rdquo;</td> +<td>&ldquo;server&rdquo;</td> +</tr> +<tr> +<td>title</td> +<td>App title</td> +<td>&ldquo;systemPipeShiny&rdquo;</td> +<td>any string</td> +</tr> +<tr> +<td>title_logo</td> +<td>App logo to display on browser tab</td> +<td>&ldquo;img/sps_small.png&rdquo;</td> +<td>any path</td> +</tr> +<tr> +<td>warning_toast</td> +<td>show security warnings?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>login_screen</td> +<td>add login screen?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>login_theme</td> +<td>login screen theme</td> +<td>&ldquo;random&rdquo;</td> +<td>see details</td> +</tr> +<tr> +<td>use_crayon</td> +<td>colorful console message?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>verbose</td> +<td>more details for SPS functions?</td> +<td>FALSE</td> +<td>TRUE</td> +</tr> +<tr> +<td>admin_page</td> +<td>enable admin page?</td> +<td>FALSE</td> +<td>TRUE</td> +</tr> +<tr> +<td>admin_url</td> +<td>admin_page query url</td> +<td>&ldquo;admin&rdquo;</td> +<td>any string</td> +</tr> +<tr> +<td>warning_toast</td> +<td>for internal test only</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>module_wf</td> +<td>load workflow module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>module_rnaseq</td> +<td>load RNAseq module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>module_ggplot</td> +<td>load quick ggplot module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_welcome</td> +<td>load welcome tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_vs_main</td> +<td>load custom visualization main tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_canvas</td> +<td>load Canvas tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_about</td> +<td>load about tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>note_url</td> +<td>SPS notification remote URL</td> +<td>see code above</td> +<td>any URL</td> +</tr> +<tr> +<td>is_demo</td> +<td>useful if deploy the app as a demo</td> +<td>FALSE</td> +<td>TRUE</td> +</tr> +<tr> +<td>welcome_guide</td> +<td>enable the welcome guide</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>app_path</td> +<td>hidden, automatically added</td> +<td>N.A.</td> +<td>N.A.</td> +</tr> +</tbody> +</table> +<h3 id="details">Details</h3> +<ul> +<li><strong>mode</strong>: see [<a href="../app_security">App security</a>] this option will change how +the upload files are selected.</li> +<li><strong>title &amp; title_logo</strong>: see [<a href="../other_customizations">Other customizations</a>]</li> +<li><strong>warning_toast</strong>: see [<a href="../app_security">App security</a>], +A toast pop-up message to help you check pre-deploy for security problems.</li> +<li><strong>login_screen &amp; login_theme &amp; admin_page &amp; admin_url</strong>: +see [<a href="../login">Accounts, Login and Admin</a>].</li> +<li><strong>verbose</strong>: Give you more information on debugging. Most SPS core functions has this option. If it is on, more debugging information will be printed -on console. See [<a href="../debug">Debugging</a>]</li> -<li><strong>module_xx &ndash; tab_xx</strong>: see [<a href="../displaytabs">Toggle tabs</a>] for loading and unloading -tabs.</li> -<li><strong>tab_xx</strong>: see [<a href="../overwritetabs">Overwrite tabs</a>] for customizing core SPS default tabs.</li> -<li><strong>note_url</strong>: see [<a href="../notification">Notification system</a>] for customizing SPS notifications.</li> -<li><strong>is_demo</strong>: see [<a href="../../sps/modules/workflow/#is_demo-option">Workflow module</a>].</li> -<li><strong>welcome_guide</strong>: whether to enable the welcome guide on app start, see first image on <a href="../guide">SPS guide</a>.</li> -<li><strong>app_path</strong>: a hidden option. This will be added after the app starts. If not specified in -<code>sps()</code>, use current working directory.</li> -</ul> -<h3 id="viewset-a-single-option">View/Set a single option</h3> -<p>SPS values are globally set, which means you can get/change the these options at +on console. See [<a href="../debug">Debugging</a>]</li> +<li><strong>module_xx &ndash; tab_xx</strong>: see [<a href="../displaytabs">Toggle tabs</a>] for loading and unloading +tabs.</li> +<li><strong>tab_xx</strong>: see [<a href="../overwritetabs">Overwrite tabs</a>] for customizing core SPS default tabs.</li> +<li><strong>note_url</strong>: see [<a href="../notification">Notification system</a>] for customizing SPS notifications.</li> +<li><strong>is_demo</strong>: see [<a href="../../sps/modules/workflow/#is_demo-option">Workflow module</a>].</li> +<li><strong>welcome_guide</strong>: whether to enable the welcome guide on app start, see first image on <a href="../guide">SPS guide</a>.</li> +<li><strong>app_path</strong>: a hidden option. This will be added after the app starts. If not specified in +<code>sps()</code>, use current working directory.</li> +</ul> +<h3 id="viewset-a-single-option">View/Set a single option</h3> +<p>SPS values are globally set, which means you can get/change the these options at inside any R code, R functions and while the app is running (change options after app started -is not recommended).</p> -<p>To view a single option value, use <code>spsOption(opt = &quot;OPTION_NAME&quot;)</code>; to overwrite a single -option, use <code>spsOption(opt = &quot;OPTION_NAME&quot;, value = &quot;NEW_VALUE&quot;)</code>.</p> -<pre><code class="language-r">spsOption(opt = &quot;mode&quot;) -</code></pre> -<pre><code>## [1] &quot;local&quot; -</code></pre> -<p>To overwrite the &ldquo;mode&rdquo; option:</p> -<pre><code class="language-r">spsOption(opt = &quot;mode&quot;, &quot;local&quot;) -</code></pre> -<p>Check again, the value has changed to &ldquo;local&rdquo;:</p> -<pre><code class="language-r">spsOption(opt = &quot;mode&quot;) -</code></pre> -<pre><code>## [1] &quot;local&quot; -</code></pre> -<p>If any option does not exist, or the value is &ldquo;empty&rdquo; or <code>0</code>, when getting the value <code>spsOption</code> will return <code>FALSE</code>. -Common &ldquo;empty&rdquo; values:</p> -<ul> -<li><code>NA</code></li> -<li><code>NULL</code></li> -<li><code>length(value) == 0</code></li> -<li><code>&quot;&quot;</code> (empty string)</li> -</ul> -<p>Read the help file of <code>?emptyIsFalse</code> for more information.</p> -<pre><code class="language-r">spsOption(opt = &quot;random_opt&quot;) -</code></pre> -<pre><code>## [1] FALSE -</code></pre> -<p>However, these &ldquo;empty&rdquo; values can be meaningful in some cases, so use <code>empty_is_false = FALSE</code> -to return the original value instead of <code>FALSE</code></p> -<pre><code class="language-r">spsOption(opt = &quot;random_opt&quot;, empty_is_false = FALSE) -</code></pre> -<pre><code>## NULL -</code></pre> -<h2 id="add-your-own-options">Add your own options</h2> -<p>SPS is very flexible which allows you to add your own options. To do so, you need -to edit the &ldquo;<code>config/sps_options.yaml</code>&rdquo; file under your project root.</p> -<p>You can use other options as templates to add more. There are two required entries:</p> -<ul> -<li><code>default</code>: will be used as default when you load SPS package.</li> -<li><code>other</code>: Other valid options. If your user provided a value that is other than -the <code>default</code> or the <code>other</code>, SPS will show warnings and use default instead. -You can write <code>&quot;*&quot;</code> as the <code>other</code> value. It means any value will be accepted. -SPS will skip to check <code>other</code> valid values for this option.</li> -</ul> -<p>Currently, the <code>default</code> value can only be length of 1 but <code>other</code> value can be a -yaml array, which use <code>[]</code> to define: <code>[value1, value2, ...]</code>.</p> -<p>For example, we can add some but opening the file with a text editor, here we do -it programmatically:</p> -<pre><code class="language-r">new_options &lt;- -' +is not recommended).</p> +<p>To view a single option value, use <code>spsOption(opt = &quot;OPTION_NAME&quot;)</code>; to overwrite a single +option, use <code>spsOption(opt = &quot;OPTION_NAME&quot;, value = &quot;NEW_VALUE&quot;)</code>.</p> +<pre><code class="language-r">spsOption(opt = &quot;mode&quot;) +</code></pre> +<pre><code>## [1] &quot;local&quot; +</code></pre> +<p>To overwrite the &ldquo;mode&rdquo; option:</p> +<pre><code class="language-r">spsOption(opt = &quot;mode&quot;, &quot;local&quot;) +</code></pre> +<p>Check again, the value has changed to &ldquo;local&rdquo;:</p> +<pre><code class="language-r">spsOption(opt = &quot;mode&quot;) +</code></pre> +<pre><code>## [1] &quot;local&quot; +</code></pre> +<p>If any option does not exist, or the value is &ldquo;empty&rdquo; or <code>0</code>, when getting the value <code>spsOption</code> will return <code>FALSE</code>. +Common &ldquo;empty&rdquo; values:</p> +<ul> +<li><code>NA</code></li> +<li><code>NULL</code></li> +<li><code>length(value) == 0</code></li> +<li><code>&quot;&quot;</code> (empty string)</li> +</ul> +<p>Read the help file of <code>?emptyIsFalse</code> for more information.</p> +<pre><code class="language-r">spsOption(opt = &quot;random_opt&quot;) +</code></pre> +<pre><code>## [1] FALSE +</code></pre> +<p>However, these &ldquo;empty&rdquo; values can be meaningful in some cases, so use <code>empty_is_false = FALSE</code> +to return the original value instead of <code>FALSE</code></p> +<pre><code class="language-r">spsOption(opt = &quot;random_opt&quot;, empty_is_false = FALSE) +</code></pre> +<pre><code>## NULL +</code></pre> +<h2 id="add-your-own-options">Add your own options</h2> +<p>SPS is very flexible which allows you to add your own options. To do so, you need +to edit the &ldquo;<code>config/sps_options.yaml</code>&rdquo; file under your project root.</p> +<p>You can use other options as templates to add more. There are two required entries:</p> +<ul> +<li><code>default</code>: will be used as default when you load SPS package.</li> +<li><code>other</code>: Other valid options. If your user provided a value that is other than +the <code>default</code> or the <code>other</code>, SPS will show warnings and use default instead. +You can write <code>&quot;*&quot;</code> as the <code>other</code> value. It means any value will be accepted. +SPS will skip to check <code>other</code> valid values for this option.</li> +</ul> +<p>Currently, the <code>default</code> value can only be length of 1 but <code>other</code> value can be a +yaml array, which use <code>[]</code> to define: <code>[value1, value2, ...]</code>.</p> +<p>For example, we can add some but opening the file with a text editor, here we do +it programmatically:</p> +<pre><code class="language-r">new_options &lt;- +' my_opt1: -default: true -other: [false] + default: true + other: [false] + my_opt2: -default: &quot;a&quot; -other: [&quot;*&quot;] -' + default: &quot;a&quot; + other: [&quot;*&quot;] +' write(x = new_options, file = file.path(sps_dir, &quot;config&quot;, &quot;sps_options.yaml&quot;), append = TRUE) -</code></pre> -<p>Then we can use <code>spsOptDefaults</code> to check</p> -<pre><code class="language-r">spsOptDefaults(app_path = sps_dir) -</code></pre> -<PRE class="fansi fansi-output"><CODE>## <span style='color: #0000BB;font-weight: bold;'>title</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>systemPipeShiny -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>img/sps_small.png -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>local -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>server -## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>random -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>admin -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* -## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE -## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>my_opt1</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE -## </span><span style='color: #0000BB;font-weight: bold;'>my_opt2</span><span>: -## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>a -## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +</code></pre> +<p>Then we can use <code>spsOptDefaults</code> to check</p> +<pre><code class="language-r">spsOptDefaults(app_path = sps_dir) +</code></pre> +<PRE class="fansi fansi-output"><CODE>## <span style='color: #0000BB;font-weight: bold;'>title</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>systemPipeShiny +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>title_logo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>img/sps_small.png +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>mode</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>local +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>server +## </span><span style='color: #0000BB;font-weight: bold;'>login_screen</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>login_theme</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>random +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>use_crayon</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>verbose</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>admin_page</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>admin_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>admin +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>warning_toast</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>module_wf</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>module_rnaseq</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>module_ggplot</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_welcome</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_vs_main</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_canvas</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>tab_about</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>note_url</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* +## </span><span style='color: #0000BB;font-weight: bold;'>traceback</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>is_demo</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>FALSE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>TRUE +## </span><span style='color: #0000BB;font-weight: bold;'>welcome_guide</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>my_opt1</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>TRUE +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>FALSE +## </span><span style='color: #0000BB;font-weight: bold;'>my_opt2</span><span>: +## </span><span style='color: #00BB00;font-weight: bold;'> Default: </span><span>a +## </span><span style='color: #00BB00;font-weight: bold;'> Other: </span><span>* ## * means any value will be accepted -</span></CODE></PRE> -<p>You can see the <code>my_opt1</code> and <code>my_opt2</code> have been added to SPS options.</p>Sps: Manage tabs/sps/adv_features/tabs/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/tabs/ -<hr> -<h2 id="sps-tabs">SPS tabs</h2> -<p>In SPS, <strong>tab</strong> is the basic component of a functionality unit. For example, all the <a href="../../sps/modules/">Modules</a> -in SPS are complex tabs with many small sub-tabs, the <a href="../../sps/canvas/">Canvas</a> is another independent tab providing -image editing features and an <em>user custom tab</em> is also a SPS tab.</p> -<p>From the developer&rsquo;s view, all SPS tabs are <a href="https://shiny.rstudio.com/articles/modules.html">Shiny Modules{blk}</a>.</p> -<p>To understand how SPS tabs work, we will demonstrate with a SPS project. For demo purpose, we are using the -<code>/tmp</code> folder but one should use a regular location instead of the temp in a real -case.</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +</span></CODE></PRE> +<p>You can see the <code>my_opt1</code> and <code>my_opt2</code> have been added to SPS options.</p> + + + + + + Sps: Manage tabs + /sps/adv_features/tabs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/tabs/ + + + + <hr> +<h2 id="sps-tabs">SPS tabs</h2> +<p>In SPS, <strong>tab</strong> is the basic component of a functionality unit. For example, all the <a href="../../sps/modules/">Modules</a> +in SPS are complex tabs with many small sub-tabs, the <a href="../../sps/canvas/">Canvas</a> is another independent tab providing +image editing features and an <em>user custom tab</em> is also a SPS tab.</p> +<p>From the developer&rsquo;s view, all SPS tabs are <a href="https://shiny.rstudio.com/articles/modules.html">Shiny Modules{blk}</a>.</p> +<p>To understand how SPS tabs work, we will demonstrate with a SPS project. For demo purpose, we are using the +<code>/tmp</code> folder but one should use a regular location instead of the temp in a real +case.</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) spsInit(app_path = tempdir(), project_name = &quot;tab_demo&quot;, overwrite = TRUE, change_wd = FALSE) ## [SPS-INFO] 2021-04-19 23:16:52 Start to create a new SPS project ## [SPS-INFO] 2021-04-19 23:16:52 Create project under /tmp/RtmpjAYUc0/tab_demo @@ -553,1062 +590,1171 @@ spsInit(app_path = tempdir(), project_name = &quot;tab_demo&quot;, overw ## [SPS-INFO] 2021-04-19 23:16:52 Create SPS database ## [SPS-INFO] 2021-04-19 23:16:52 Created SPS database method container ## [SPS-INFO] 2021-04-19 23:16:52 Creating SPS db... -## [SPS-DANGER] 2021-04-19 23:16:52 Done, Db created at '/tmp/RtmpjAYUc0/tab_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. +## [SPS-DANGER] 2021-04-19 23:16:52 Done, Db created at '/tmp/RtmpjAYUc0/tab_demo/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-19 23:16:52 Key md5 ecdf3312953a6bcdaea49e6d85954b80 ## [SPS-INFO] 2021-04-19 23:16:52 SPS project setup done! -## save project path +## save project path (sps_dir &lt;- file.path(tempdir(), &quot;tab_demo&quot;)) ## [1] &quot;/tmp/RtmpjAYUc0/tab_demo&quot; -</code></pre> -<p>To reproduce code locally, run the following chunk instead.</p> -<pre><code class="language-r">library(systemPipeShiny) +</code></pre> +<p>To reproduce code locally, run the following chunk instead.</p> +<pre><code class="language-r">library(systemPipeShiny) spsInit() sps_dir &lt;- normalizePath(&quot;.&quot;) -</code></pre> -<h2 id="tab-registration">Tab registration</h2> -<p>In SPS, all tabs are controlled by the <em>config/tabs.csv</em> file. To see what kind of -tabs you have with current project. use the <code>spsTabInfo</code> function. It returns a tibble -of current tab information.</p> -<pre><code class="language-r">spsTabInfo(app_path = sps_dir) -</code></pre> -<pre><code>## # A tibble: 11 x 8 -## tab_id display_label type type_sub image displayed tab_file_name plugin -## &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; -## 1 core_ab… About this App core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 2 core_ca… Canvas core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 3 core_we… Home core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 4 core_ri… Internal use on… core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 5 core_top Top push bars core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 6 module_… Module Main Page core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 7 wf Workflow module modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 8 vs_rnas… RNAseq module modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 9 vs_esq Quick ggplot mo… modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 10 vs_main custom tabs mai… core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; -## 11 vs_exam… My custom plott… vs &quot;plot&quot; &quot;&quot; 1 tab_vs_examp… &quot;&quot; -</code></pre> -<ul> -<li><strong>tab_id</strong>: A unique string ID</li> -<li><strong>display_label</strong>: for type is &ldquo;core&rdquo; or &ldquo;module&rdquo;, this is only some description, but for you own custom tabs, -this value will be used as a display tab name on left sidebar on SPS UI.</li> -<li><strong>type</strong>: tab category, &ldquo;core&rdquo;, &ldquo;module&rdquo; and &ldquo;vs&rdquo; (visualization).</li> -<li><strong>type_sub</strong>: more specific category, current only &ldquo;plot&rdquo; (plotting)</li> -<li><strong>image</strong>: If this is an user custom tab, providing an image path will display the image in +</code></pre> +<h2 id="tab-registration">Tab registration</h2> +<p>In SPS, all tabs are controlled by the <em>config/tabs.csv</em> file. To see what kind of +tabs you have with current project. use the <code>spsTabInfo</code> function. It returns a tibble +of current tab information.</p> +<pre><code class="language-r">spsTabInfo(app_path = sps_dir) +</code></pre> +<pre><code>## # A tibble: 11 x 8 +## tab_id display_label type type_sub image displayed tab_file_name plugin +## &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; +## 1 core_ab… About this App core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 2 core_ca… Canvas core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 3 core_we… Home core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 4 core_ri… Internal use on… core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 5 core_top Top push bars core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 6 module_… Module Main Page core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 7 wf Workflow module modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 8 vs_rnas… RNAseq module modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 9 vs_esq Quick ggplot mo… modu… &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 10 vs_main custom tabs mai… core &quot;&quot; &quot;&quot; 1 No file for … &quot;core&quot; +## 11 vs_exam… My custom plott… vs &quot;plot&quot; &quot;&quot; 1 tab_vs_examp… &quot;&quot; +</code></pre> +<ul> +<li><strong>tab_id</strong>: A unique string ID</li> +<li><strong>display_label</strong>: for type is &ldquo;core&rdquo; or &ldquo;module&rdquo;, this is only some description, but for you own custom tabs, +this value will be used as a display tab name on left sidebar on SPS UI.</li> +<li><strong>type</strong>: tab category, &ldquo;core&rdquo;, &ldquo;module&rdquo; and &ldquo;vs&rdquo; (visualization).</li> +<li><strong>type_sub</strong>: more specific category, current only &ldquo;plot&rdquo; (plotting)</li> +<li><strong>image</strong>: If this is an user custom tab, providing an image path will display the image in visualization main tab gallery. If it not provided, a warning will be given on app -starts and an &ldquo;No image&rdquo; image will be used like the following:</li> -</ul> -<p><img src="../vs_main.png" alt="vs_main"></p> -<ul> -<li><strong>displayed</strong>: Internal use only</li> -<li><strong>tab_file_name</strong>: where the tab file is relative to the <code>R</code> folder.</li> -<li><strong>plugin</strong>: Internal use only</li> -</ul> -<h2 id="add-a-new-custom-tab">Add a new custom tab</h2> -<p>SPS provides templates to help developers to create a small SPS tab that</p> -<ol> -<li>The main purpose is to generate some plots</li> -<li>can be loaded into SPS framework easily</li> -<li>can interact with other SPS tabs (components), like the Canvas tab.</li> -</ol> -<p>When you initiate a SPS project, an example custom tab is created for you already. -You can find the tab file inside the <code>R</code> folder of the project root. When you start +starts and an &ldquo;No image&rdquo; image will be used like the following:</li> +</ul> +<p><img src="../vs_main.png" alt="vs_main"></p> +<ul> +<li><strong>displayed</strong>: Internal use only</li> +<li><strong>tab_file_name</strong>: where the tab file is relative to the <code>R</code> folder.</li> +<li><strong>plugin</strong>: Internal use only</li> +</ul> +<h2 id="add-a-new-custom-tab">Add a new custom tab</h2> +<p>SPS provides templates to help developers to create a small SPS tab that</p> +<ol> +<li>The main purpose is to generate some plots</li> +<li>can be loaded into SPS framework easily</li> +<li>can interact with other SPS tabs (components), like the Canvas tab.</li> +</ol> +<p>When you initiate a SPS project, an example custom tab is created for you already. +You can find the tab file inside the <code>R</code> folder of the project root. When you start the app for the first time, you can easily find it from the left sidebar, or -click on the &ldquo;Custom tabs&rdquo; to go to custom tab main tab.</p> -<center> -<p><img src="../new_tab_before.png" alt=""></p> -<caption>Example custom tab</caption> -</center> -<h3 id="simple-template">Simple template</h3> -<p>Under current SPS version, users are able to add custom tabs with the <code>spsNewTab</code> function. -This function:</p> -<ol> -<li>creates the tab file.</li> -<li>provides a nice template.</li> -<li>Helps you to register tab information to <code>tabs.csv</code></li> -</ol> -<pre><code class="language-r">spsNewTab(tab_id = &quot;vs_new&quot;, tab_displayname = &quot;New tab demo&quot;, app_path = sps_dir) +click on the &ldquo;Custom tabs&rdquo; to go to custom tab main tab.</p> +<center> +<p><img src="../new_tab_before.png" alt=""></p> +<caption>Example custom tab</caption> +</center> +<h3 id="simple-template">Simple template</h3> +<p>Under current SPS version, users are able to add custom tabs with the <code>spsNewTab</code> function. +This function:</p> +<ol> +<li>creates the tab file.</li> +<li>provides a nice template.</li> +<li>Helps you to register tab information to <code>tabs.csv</code></li> +</ol> +<pre><code class="language-r">spsNewTab(tab_id = &quot;vs_new&quot;, tab_displayname = &quot;New tab demo&quot;, app_path = sps_dir) ## [SPS-INFO] 2021-04-19 23:16:52 Write to file /tmp/RtmpjAYUc0/tab_demo/R/tab_vs_new.R ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created! ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c(&quot;vs_new&quot;)` -</code></pre> -<p>If you are running the code locally, and are using Rstudio, the tab file will be opened -automatically for you.</p> -<p>In your <code>global.R</code>, add the new tab to confirm you want to load it, and then restart -you app. Scroll down to the bottom, you should see:</p> -<pre><code class="language-r"># add &quot;vs_new&quot; in `tabs` +</code></pre> +<p>If you are running the code locally, and are using Rstudio, the tab file will be opened +automatically for you.</p> +<p>In your <code>global.R</code>, add the new tab to confirm you want to load it, and then restart +you app. Scroll down to the bottom, you should see:</p> +<pre><code class="language-r"># add &quot;vs_new&quot; in `tabs` sps_app &lt;- sps( -tabs = c(&quot;vs_example&quot;, &quot;vs_new&quot;), -server_expr = { -msg(&quot;Custom expression runs -- Hello World&quot;, &quot;GREETING&quot;, &quot;green&quot;) -} -) -</code></pre> -<center> -<p><img src="../new_tab_after.png" alt=""></p> -<caption>Load new custom tabs</caption> -</center> -<p>By default, it uses the simple template, which contains the <code>spsEzUI</code> and <code>spsEzServer</code> functions. -We have provided commented instructions on how to fill each argument.</p> -<h4 id="ui">UI</h4> -<pre><code class="language-r">spsEzUI( -desc = &quot;xxx&quot;, -tab_title = &quot;xxx&quot;, -plot_title = &quot;xxx&quot;, -plot_control = shiny::tagList( -xxx + tabs = c(&quot;vs_example&quot;, &quot;vs_new&quot;), + server_expr = { + msg(&quot;Custom expression runs -- Hello World&quot;, &quot;GREETING&quot;, &quot;green&quot;) + } ) +</code></pre> +<center> +<p><img src="../new_tab_after.png" alt=""></p> +<caption>Load new custom tabs</caption> +</center> +<p>By default, it uses the simple template, which contains the <code>spsEzUI</code> and <code>spsEzServer</code> functions. +We have provided commented instructions on how to fill each argument.</p> +<h4 id="ui">UI</h4> +<pre><code class="language-r">spsEzUI( + desc = &quot;xxx&quot;, + tab_title = &quot;xxx&quot;, + plot_title = &quot;xxx&quot;, + plot_control = shiny::tagList( + xxx + ) ) -</code></pre> -<p>The only augment new users need to take some time to learn is adding <code>plot_control</code>. +</code></pre> +<p>The only augment new users need to take some time to learn is adding <code>plot_control</code>. Developers need to add some Shiny UI components to let users control how the plotting is done with interactive options. Basic use can be learned in 5 minutes on -<a href="https://shiny.rstudio.com/articles/basics.html">Shiny website{blk}</a> and <a href="https://mastering-shiny.org/basic-ui.html">Shiny book{blk}</a></p> -<h4 id="server">Server</h4> -<pre><code class="language-r">spsEzServer( -plot_code = { -# data passed from data loading is a reactiveValues object, data stored in `mydata$data` -plot_data &lt;- mydata$data -# some validations, make sure users give you the right data format -spsValidate({ -stopifnot(inherits(plot_data, &quot;data.frame&quot;)) # require a dataframe -stopifnot(nrow(plot_data) &gt; 1) # has least one row -if (!all(c(&quot;Sepal.Length&quot;, &quot;Sepal.Width&quot;) %in% colnames(plot_data)))# has two required columns -stop(&quot;Require column 'Sepal.Length' and 'Sepal.Width'&quot;) -TRUE # give it a TRUE if all checks passed. -}, -verbose = FALSE # only show messages when fail -) -# actual plot code -ggplot2::ggplot(plot_data) + -ggplot2::geom_point(ggplot2::aes(x = Sepal.Length, y = Sepal.Width)) + -# grab user defined title from plot control by `input$+control_ID`, -# no need to add `ns()` on server end. -ggplot2::ggtitle(input$plot_title) -}, -other_server_code = {} +<a href="https://shiny.rstudio.com/articles/basics.html">Shiny website{blk}</a> and <a href="https://mastering-shiny.org/basic-ui.html">Shiny book{blk}</a></p> +<h4 id="server">Server</h4> +<pre><code class="language-r">spsEzServer( + plot_code = { + # data passed from data loading is a reactiveValues object, data stored in `mydata$data` + plot_data &lt;- mydata$data + # some validations, make sure users give you the right data format + spsValidate({ + stopifnot(inherits(plot_data, &quot;data.frame&quot;)) # require a dataframe + stopifnot(nrow(plot_data) &gt; 1) # has least one row + if (!all(c(&quot;Sepal.Length&quot;, &quot;Sepal.Width&quot;) %in% colnames(plot_data)))# has two required columns + stop(&quot;Require column 'Sepal.Length' and 'Sepal.Width'&quot;) + + TRUE # give it a TRUE if all checks passed. + }, + verbose = FALSE # only show messages when fail + ) + # actual plot code + ggplot2::ggplot(plot_data) + + ggplot2::geom_point(ggplot2::aes(x = Sepal.Length, y = Sepal.Width)) + + # grab user defined title from plot control by `input$+control_ID`, + # no need to add `ns()` on server end. + ggplot2::ggtitle(input$plot_title) + }, + other_server_code = {} ) -</code></pre> -<p>For the server code, users only need to focus on the plotting code. The only very important thing +</code></pre> +<p>For the server code, users only need to focus on the plotting code. The only very important thing developers need to remember is that the plotting data been passed to this function -is stored in a <a href="https://shiny.rstudio.com/reference/shiny/0.11/reactiveValues.html">reactiveValues{blk}</a> -object and it is called <code>mydata$data</code>. Usually we assign it to a new value so it can -be used easily downstream, like <code>plot_data &lt;- mydata$data</code>.</p> -<p>Some validation is recommended before reaching the plotting code. You would never know what -kind of dataset users upload. It is always good to check if users' uploads meet the -requirements. In SPS you can use the <code>spsValidate</code> function or use Shiny&rsquo;s default <a href="https://shiny.rstudio.com/reference/shiny/0.14/validate.html">validate{blk}</a> -function (<code>spsValidate</code> is discussed in <a href="../../sps/dev/spscomps/server/">developer tools</a>).</p> -<h3 id="full-template">Full template</h3> -<p>For some developers who already has experience with Shiny, and would like to make more +is stored in a <a href="https://shiny.rstudio.com/reference/shiny/0.11/reactiveValues.html">reactiveValues{blk}</a> +object and it is called <code>mydata$data</code>. Usually we assign it to a new value so it can +be used easily downstream, like <code>plot_data &lt;- mydata$data</code>.</p> +<p>Some validation is recommended before reaching the plotting code. You would never know what +kind of dataset users upload. It is always good to check if users' uploads meet the +requirements. In SPS you can use the <code>spsValidate</code> function or use Shiny&rsquo;s default <a href="https://shiny.rstudio.com/reference/shiny/0.14/validate.html">validate{blk}</a> +function (<code>spsValidate</code> is discussed in <a href="../../sps/dev/spscomps/server/">developer tools</a>).</p> +<h3 id="full-template">Full template</h3> +<p>For some developers who already has experience with Shiny, and would like to make more complex customization, using the full template enables you to change every detail on -the new tab. Simply add the <code>template = &quot;full&quot;</code> argument.</p> -<pre><code class="language-r">spsNewTab( -tab_id = &quot;vs_new_full&quot;, -tab_displayname = &quot;New tab demo&quot;, -template = &quot;full&quot;, -app_path = sps_dir) +the new tab. Simply add the <code>template = &quot;full&quot;</code> argument.</p> +<pre><code class="language-r">spsNewTab( + tab_id = &quot;vs_new_full&quot;, + tab_displayname = &quot;New tab demo&quot;, + template = &quot;full&quot;, + app_path = sps_dir) ## [SPS-INFO] 2021-04-19 23:16:52 Write to file /tmp/RtmpjAYUc0/tab_demo/R/tab_vs_new_full.R ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created! ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c(&quot;vs_new_full&quot;)` -</code></pre> -<p>You can see the full template is a lot longer than the simple template:</p> -<pre><code class="language-r">simple_len &lt;- R.utils::countLines(file.path(sps_dir, &quot;R&quot;, &quot;tab_vs_new.R&quot;)) +</code></pre> +<p>You can see the full template is a lot longer than the simple template:</p> +<pre><code class="language-r">simple_len &lt;- R.utils::countLines(file.path(sps_dir, &quot;R&quot;, &quot;tab_vs_new.R&quot;)) full_len &lt;- R.utils::countLines(file.path(sps_dir, &quot;R&quot;, &quot;tab_vs_new_full.R&quot;)) spsinfo(glue::glue(&quot;Simple template has {simple_len} lines&quot;), TRUE) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-19 23:16:52 Simple template has 66 lines -</code></pre> -<pre><code class="language-r">spsinfo(glue::glue(&quot;Full template has {full_len} lines&quot;), TRUE) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-19 23:16:52 Full template has 281 lines -</code></pre> -<h2 id="tab-registeration">Tab registeration</h2> -<p>In your <em>global.R</em>, scroll down to the bottom, you should see:</p> -<pre><code class="language-r">sps_app &lt;- sps( -tabs = c(&quot;vs_example&quot;), -server_expr = { -msg(&quot;Custom expression runs -- Hello World&quot;, &quot;GREETING&quot;, &quot;green&quot;) -} +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-19 23:16:52 Simple template has 66 lines +</code></pre> +<pre><code class="language-r">spsinfo(glue::glue(&quot;Full template has {full_len} lines&quot;), TRUE) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-19 23:16:52 Full template has 281 lines +</code></pre> +<h2 id="tab-registeration">Tab registeration</h2> +<p>In your <em>global.R</em>, scroll down to the bottom, you should see:</p> +<pre><code class="language-r">sps_app &lt;- sps( + tabs = c(&quot;vs_example&quot;), + server_expr = { + msg(&quot;Custom expression runs -- Hello World&quot;, &quot;GREETING&quot;, &quot;green&quot;) + } ) -</code></pre> -<p>This is the SPS main function. You can load/unload custom tabs by providing tab IDs in <code>tabs</code> argument, like -<code>c(&quot;tab1&quot;, &quot;tab2)</code>. Open <code>config/tabs.csv</code> or use <code>spsTabInfo()</code> to see what tabs IDs can be load and other -tab information. Essential framework tabs (<em>core</em>) and built-in modules (<em>modules</em>) are loaded automatically. However, you can choose to <a href="../displaytabs">unload core and modules tabs</a>, -and <a href="../overwritetabs">overwrite core tabs</a> by changing some <a href="../config">SPS options</a>.</p> -<h2 id="tab-naming">Tab naming</h2> -<p>Once a tab ID is provided in the <code>sps</code> function <code>tabs</code> argument, when the function -runs, it is looking for tab information inside this <code>tabs.csv</code>, like the display name +</code></pre> +<p>This is the SPS main function. You can load/unload custom tabs by providing tab IDs in <code>tabs</code> argument, like +<code>c(&quot;tab1&quot;, &quot;tab2)</code>. Open <code>config/tabs.csv</code> or use <code>spsTabInfo()</code> to see what tabs IDs can be load and other +tab information. Essential framework tabs (<em>core</em>) and built-in modules (<em>modules</em>) are loaded automatically. However, you can choose to <a href="../displaytabs">unload core and modules tabs</a>, +and <a href="../overwritetabs">overwrite core tabs</a> by changing some <a href="../config">SPS options</a>.</p> +<h2 id="tab-naming">Tab naming</h2> +<p>Once a tab ID is provided in the <code>sps</code> function <code>tabs</code> argument, when the function +runs, it is looking for tab information inside this <code>tabs.csv</code>, like the display name and tab image. Then it will search for the UI and server function in the enviornment. -It is expecting a UI function named <code>tab_id</code> + <code>UI</code> -&gt; <code>tab_idUI</code> and the server -<code>tab_id</code> + <code>Server</code> -&gt; <code>tab_idServer</code>. If you did not use the <code>spsNewTab</code> function -to generate the new tab, make sure you name your tab UI and server in this pattern.</p>Sps: Overwrite tabs/sps/adv_features/overwritetabs/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/overwritetabs/ -<hr> -<p>As a framework, default SPS tabs like the <strong>welcome tab</strong>, the <strong>module main tab</strong>, -the <strong>visualization main tab</strong>, the <strong>Canvas tab</strong> and the <strong>About tab</strong> can be user-defined.</p> -<center> -<p><img src="../default_ui.png" alt=""></p> -<caption>Default UI and tabs you can overwrite</caption> -</center> -<h2 id="overwrite-sps-default-tabs">Overwrite SPS default tabs</h2> -<p>To start create a SPS project:</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) -</code></pre> -<pre><code class="language-r">app_path &lt;- &quot;.&quot; +It is expecting a UI function named <code>tab_id</code> + <code>UI</code> -&gt; <code>tab_idUI</code> and the server +<code>tab_id</code> + <code>Server</code> -&gt; <code>tab_idServer</code>. If you did not use the <code>spsNewTab</code> function +to generate the new tab, make sure you name your tab UI and server in this pattern.</p> + + + + + + Sps: Overwrite tabs + /sps/adv_features/overwritetabs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/overwritetabs/ + + + + <hr> +<p>As a framework, default SPS tabs like the <strong>welcome tab</strong>, the <strong>module main tab</strong>, +the <strong>visualization main tab</strong>, the <strong>Canvas tab</strong> and the <strong>About tab</strong> can be user-defined.</p> +<center> +<p><img src="../default_ui.png" alt=""></p> +<caption>Default UI and tabs you can overwrite</caption> +</center> +<h2 id="overwrite-sps-default-tabs">Overwrite SPS default tabs</h2> +<p>To start create a SPS project:</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +</code></pre> +<pre><code class="language-r">app_path &lt;- &quot;.&quot; spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) -</code></pre> -<pre><code>## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps.db'. DO NOT share this file with others or upload to open access domains. +</code></pre> +<pre><code>## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:11 Key md5 6886f6bf17229ffb646102abad92fa31 ## [SPS-INFO] 2021-04-22 15:45:11 SPS project setup done! -</code></pre> -<p>use the function <code>spsCoreTabReplace</code> to create a template of which tab you would +</code></pre> +<p>use the function <code>spsCoreTabReplace</code> to create a template of which tab you would like to overwrite. Here we use the &ldquo;Welcome&rdquo; tab as example to demo how to write -your own welcome tab.</p> -<pre><code class="language-r">spsCoreTabReplace(replace_tab = &quot;welcome&quot;) -</code></pre> -<pre><code>## [SUCCESS] 2021-04-22 15:45:11 File /tmp/Rtmp2YLDmY/overwrite/R/tab_core_welcome.R created -</code></pre> -<p>If you are using Rstudio the template will be opened for you like following:</p> -<pre><code class="language-r">########################## Overwrite the welcome tab ########################### +your own welcome tab.</p> +<pre><code class="language-r">spsCoreTabReplace(replace_tab = &quot;welcome&quot;) +</code></pre> +<pre><code>## [SUCCESS] 2021-04-22 15:45:11 File /tmp/Rtmp2YLDmY/overwrite/R/tab_core_welcome.R created +</code></pre> +<p>If you are using Rstudio the template will be opened for you like following:</p> +<pre><code class="language-r">########################## Overwrite the welcome tab ########################### ## UI core_welcomeUI &lt;- function(id){ -ns &lt;- NS(id) -tagList( -# add your UI code below -) + ns &lt;- NS(id) + tagList( + # add your UI code below + ) } + ## server core_welcomeServer &lt;- function(id, shared){ -module &lt;- function(input, output, session, shared){ -ns &lt;- session$ns -# add your server code below + module &lt;- function(input, output, session, shared){ + ns &lt;- session$ns + # add your server code below + } + moduleServer(id, module) } -moduleServer(id, module) +</code></pre> +<p>Then you can write your own UI and server for this tab, for example, we can add +some UI to the tab:</p> +<pre><code class="language-r">core_welcomeUI &lt;- function(id){ + ns &lt;- NS(id) + tagList( + # add your UI code below + h2(&quot;This is my welcome page&quot;), + h4(&quot;some UI&quot;), + sliderInput(ns(&quot;num&quot;), &quot;Select a number&quot;, 0, 10, 5) + ) } -</code></pre> -<p>Then you can write your own UI and server for this tab, for example, we can add -some UI to the tab:</p> -<pre><code class="language-r">core_welcomeUI &lt;- function(id){ -ns &lt;- NS(id) -tagList( -# add your UI code below -h2(&quot;This is my welcome page&quot;), -h4(&quot;some UI&quot;), -sliderInput(ns(&quot;num&quot;), &quot;Select a number&quot;, 0, 10, 5) -) -} -</code></pre> -<p>When you restart the app, you should see your custom Welcome tab:</p> -<center> -<p><img src="../overwrite_tab.png" alt=""></p> -<caption>Custom Welcome tab UI</caption> -</center>Sps: Toggle tabs/sps/adv_features/displaytabs/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/displaytabs/ -<hr> -<h2 id="load-and-unload-tabs">Load and unload tabs</h2> -<p>In SPS, all tabs including tabs for modules and other default tabs can be -loaded and unloaded. This is controlled by <a href="../config#app-options">SPS options</a></p> -<p>Under current version, these options are:</p> -<table> -<thead> -<tr> -<th>Option</th> -<th>Description</th> -<th>Default</th> -<th>Other</th> -</tr> -</thead> -<tbody> -<tr> -<td>module_wf</td> -<td>load workflow module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>module_rnaseq</td> -<td>load RNAseq module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>module_ggplot</td> -<td>load quick ggplot module?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_welcome</td> -<td>load welcome tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_vs_main</td> -<td>load custom visualization main tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_canvas</td> -<td>load Canvas tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -<tr> -<td>tab_about</td> -<td>load about tab?</td> -<td>TRUE</td> -<td>FALSE</td> -</tr> -</tbody> -</table> -<p>Each of them controls whether to load or unload a tab. By default, all tabs -are loaded, but you can unload them by turn them to <code>FALSE</code>.</p> -<p>The original UI look like this:</p> -<center> -<p><img src="../sps_default_ui.png" alt=""></p> -<caption>Default UI</caption> -</center> -<p>To unload some tabs, scroll to the option lines in <strong><code>global.R</code></strong> file:</p> -<pre><code class="language-r">options(sps = list( -... -tab_welcome = TRUE, -tab_vs_main = TRUE, -tab_canvas = FALSE, -tab_about = FALSE, -module_wf = FALSE, -module_rnaseq = FALSE, -module_ggplot = TRUE, -... +</code></pre> +<p>When you restart the app, you should see your custom Welcome tab:</p> +<center> +<p><img src="../overwrite_tab.png" alt=""></p> +<caption>Custom Welcome tab UI</caption> +</center> + + + + + + Sps: Toggle tabs + /sps/adv_features/displaytabs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/displaytabs/ + + + + <hr> +<h2 id="load-and-unload-tabs">Load and unload tabs</h2> +<p>In SPS, all tabs including tabs for modules and other default tabs can be +loaded and unloaded. This is controlled by <a href="../config#app-options">SPS options</a></p> +<p>Under current version, these options are:</p> +<table> +<thead> +<tr> +<th>Option</th> +<th>Description</th> +<th>Default</th> +<th>Other</th> +</tr> +</thead> +<tbody> +<tr> +<td>module_wf</td> +<td>load workflow module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>module_rnaseq</td> +<td>load RNAseq module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>module_ggplot</td> +<td>load quick ggplot module?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_welcome</td> +<td>load welcome tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_vs_main</td> +<td>load custom visualization main tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_canvas</td> +<td>load Canvas tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +<tr> +<td>tab_about</td> +<td>load about tab?</td> +<td>TRUE</td> +<td>FALSE</td> +</tr> +</tbody> +</table> +<p>Each of them controls whether to load or unload a tab. By default, all tabs +are loaded, but you can unload them by turn them to <code>FALSE</code>.</p> +<p>The original UI look like this:</p> +<center> +<p><img src="../sps_default_ui.png" alt=""></p> +<caption>Default UI</caption> +</center> +<p>To unload some tabs, scroll to the option lines in <strong><code>global.R</code></strong> file:</p> +<pre><code class="language-r">options(sps = list( + ... + tab_welcome = TRUE, + tab_vs_main = TRUE, + tab_canvas = FALSE, + tab_about = FALSE, + module_wf = FALSE, + module_rnaseq = FALSE, + module_ggplot = TRUE, + ... )) -</code></pre> -<p>We unload the &ldquo;Canvas tab&rdquo;, &ldquo;workflow module tab&rdquo;, &ldquo;RNASeq module tab&rdquo; and -&ldquo;About tab&rdquo;. When you restart the app, you should see some tabs are gone:</p> -<p>The original UI look like this:</p> -<center> -<p><img src="../sps_unload_tabs.png" alt=""></p> -<caption>Unload some tabs</caption> -</center> -<h3 id="exception-for-module-main-page">Exception for module main page</h3> -<p>You may have noticed, there is no option to unload the <em>module main tab</em>, which is -named &ldquo;<i class="fa fa-layer-group"></i>Modules&rdquo; on the left sidebar. This is +</code></pre> +<p>We unload the &ldquo;Canvas tab&rdquo;, &ldquo;workflow module tab&rdquo;, &ldquo;RNASeq module tab&rdquo; and +&ldquo;About tab&rdquo;. When you restart the app, you should see some tabs are gone:</p> +<p>The original UI look like this:</p> +<center> +<p><img src="../sps_unload_tabs.png" alt=""></p> +<caption>Unload some tabs</caption> +</center> +<h3 id="exception-for-module-main-page">Exception for module main page</h3> +<p>You may have noticed, there is no option to unload the <em>module main tab</em>, which is +named &ldquo;<i class="fa fa-layer-group"></i>Modules&rdquo; on the left sidebar. This is because this tab is controlled by its sub-tabs, the module tab options. To unload this tab, all the module tabs have to be unloaded the same time like following. If any module -is loaded, this module main tab cannot be unloaded.</p> -<pre><code class="language-r">options(sps = list( -... -module_wf = FALSE, -module_rnaseq = FALSE, -module_ggplot = FALSE, -... +is loaded, this module main tab cannot be unloaded.</p> +<pre><code class="language-r">options(sps = list( + ... + module_wf = FALSE, + module_rnaseq = FALSE, + module_ggplot = FALSE, + ... )) -</code></pre> -<center> -<p><img src="../sps_no_module.png" alt=""></p> -<caption>No module loaded</caption> -</center>Sps: Notification system/sps/adv_features/notification/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/notification/ -<hr> -<h2 id="sps-notification-system">SPS notification system</h2> -<p>In SPS, there is a notification dropdown where developers can broadcast new messages -to users. The dropdown is located on the top-right corner.</p> -<center> -<p><img src="../note_main.png" alt=""></p> -<caption>Notification Dropdown</caption> -</center> -<p><br>When a notification item is clicked, details of the notification will be displayed -in a modal.</p> -<center> -<p><img src="../note_view.png" alt=""></p> -<caption>Notification Detail Moadal</caption> -</center> -<h2 id="official-notification">Official notification</h2> -<p>If you only use the original SPS, we will send out new notifications every time +</code></pre> +<center> +<p><img src="../sps_no_module.png" alt=""></p> +<caption>No module loaded</caption> +</center> + + + + + + Sps: Notification system + /sps/adv_features/notification/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/notification/ + + + + <hr> +<h2 id="sps-notification-system">SPS notification system</h2> +<p>In SPS, there is a notification dropdown where developers can broadcast new messages +to users. The dropdown is located on the top-right corner.</p> +<center> +<p><img src="../note_main.png" alt=""></p> +<caption>Notification Dropdown</caption> +</center> +<p><br>When a notification item is clicked, details of the notification will be displayed +in a modal.</p> +<center> +<p><img src="../note_view.png" alt=""></p> +<caption>Notification Detail Moadal</caption> +</center> +<h2 id="official-notification">Official notification</h2> +<p>If you only use the original SPS, we will send out new notifications every time we update the package or other important things that we want to inform you. You should see the icon of the dropdown becomes. -<i class="fa fa-exclamation-triangle"></i> + the message number. If there is no -message or you have clicked the dropdown, it will become <i class="fa fa-check"></i> + 0.</p> -<h2 id="custom-notification">Custom notification</h2> -<p>If you do not want to receive the official notification or want to write your -own note to your users, first let us understand how it works.</p> -<h3 id="mechanism">Mechanism</h3> -<p>Every time when you run the <code>sps()</code> main function, it will look for a remote URL -that stores the notification information in <strong><a href="https://yaml.org/">yaml{blk}</a></strong> format. +<i class="fa fa-exclamation-triangle"></i> + the message number. If there is no +message or you have clicked the dropdown, it will become <i class="fa fa-check"></i> + 0.</p> +<h2 id="custom-notification">Custom notification</h2> +<p>If you do not want to receive the official notification or want to write your +own note to your users, first let us understand how it works.</p> +<h3 id="mechanism">Mechanism</h3> +<p>Every time when you run the <code>sps()</code> main function, it will look for a remote URL +that stores the notification information in <strong><a href="https://yaml.org/">yaml{blk}</a></strong> format. If this file can be successfully parsed, you will see the notification dropdown menu -on SPS UI, otherwise no dropdown displayed.</p> -<p>To define your own notification URL, you need to change the option <code>note_url</code> in -the <code>global.R</code> file. Read more about changing <a href="../config#app-options">SPS options</a>. +on SPS UI, otherwise no dropdown displayed.</p> +<p>To define your own notification URL, you need to change the option <code>note_url</code> in +the <code>global.R</code> file. Read more about changing <a href="../config#app-options">SPS options</a>. The default value is a file on Github, which also can be used as your template to write custom -notification messages:</p> -<p><a href="https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml">https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml{blk}</a></p> -<h3 id="notification-template">Notification template</h3> -<p>If you download the link above, you should see something like this:</p> -<pre><code class="language-yaml">############ Create remote messages to notify users in the app ################# +notification messages:</p> +<p><a href="https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml">https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml{blk}</a></p> +<h3 id="notification-template">Notification template</h3> +<p>If you download the link above, you should see something like this:</p> +<pre><code class="language-yaml">############ Create remote messages to notify users in the app ################# ## When app starts, it will first try to load this file from online. ## You should place this file somewhere publically reachable online, like Github. ## This file should not be included in your app deployment. ## Add the url of this file to the SPS option `note_url` in &quot;global.R&quot; file -# type: one of 'package' or 'general', required + +# type: one of 'package' or 'general', required # expire: note will be displayed before the date, required, YYYY-MM-DD format # title: string, required # icon: any font-awesome icon name, default is the &quot;info-circle&quot; # status: one of primary, success, info, warning, danger, default is &quot;primary&quot; -# pkg_name: string, required if type == 'package', such as &quot;systemPipeShiny&quot; -# version: string, required if type == 'package', such as &quot;1.0.0&quot; +# pkg_name: string, required if type == 'package', such as &quot;systemPipeShiny&quot; +# version: string, required if type == 'package', such as &quot;1.0.0&quot; # message: string, optional, the text body of the notification. Be careful with indentations. - note: -type: general -pkg_name: -version: -title: Notification broadcasting -expire: 2099-01-01 -icon: -status: -message: | -## SPS notifications -What you are looking at is the SPS notification broadcasting system. It -display messages to your users by reading a remote `yaml` file stored -online. SPS will fetch the content of this file and translate it to different -notes you can see here. So you do not need to re-deploy the app every time -there is a new notification. -1. You can customize your own notifications by -using [this file as template](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml). -2. After the modification, place this file in public accessible location, like -Github, do not inlcude this file in app deployment. -3. During app deployment, indicate the URL of this file in `global.R` -file, `note_url:` option. -</code></pre> -<h3 id="template-details">Template details</h3> -<p>Most entries are easy-to-understand. Here are some key points.</p> -<h4 id="indentation">Indentation</h4> -<p>Indentation is <strong>very important</strong> in a yaml file. In the template, we use <strong>4 spaces</strong> -as 1 level of indentation.</p> -<h4 id="notification-start-and-end">Notification start and end</h4> -<p>Always start with a <code>- note:</code> to define a notification item. After you finish typing -the message body, leave at least one line blank before starting another notification.</p> -<h4 id="type"><code>type</code></h4> -<p><strong>general</strong>: Use this type to create a general notification. It will ignore <code>pkg_name</code> -and <code>version</code> information.</p> -<p><strong>package</strong>: A notification that is related to a package updates. This type of note will first -check if the user has installed the package (single one) with a version that is + type: general + pkg_name: + version: + title: Notification broadcasting + expire: 2099-01-01 + icon: + status: + message: | + ## SPS notifications + What you are looking at is the SPS notification broadcasting system. It + display messages to your users by reading a remote `yaml` file stored + online. SPS will fetch the content of this file and translate it to different + notes you can see here. So you do not need to re-deploy the app every time + there is a new notification. + 1. You can customize your own notifications by + using [this file as template](https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml). + 2. After the modification, place this file in public accessible location, like + Github, do not inlcude this file in app deployment. + 3. During app deployment, indicate the URL of this file in `global.R` + file, `note_url:` option. +</code></pre> +<h3 id="template-details">Template details</h3> +<p>Most entries are easy-to-understand. Here are some key points.</p> +<h4 id="indentation">Indentation</h4> +<p>Indentation is <strong>very important</strong> in a yaml file. In the template, we use <strong>4 spaces</strong> +as 1 level of indentation.</p> +<h4 id="notification-start-and-end">Notification start and end</h4> +<p>Always start with a <code>- note:</code> to define a notification item. After you finish typing +the message body, leave at least one line blank before starting another notification.</p> +<h4 id="type"><code>type</code></h4> +<p><strong>general</strong>: Use this type to create a general notification. It will ignore <code>pkg_name</code> +and <code>version</code> information.</p> +<p><strong>package</strong>: A notification that is related to a package updates. This type of note will first +check if the user has installed the package (single one) with a version that is higher than the specified version number in -<code>pkg_name</code> and <code>version</code> entries. If so, the notification will <strong>not be displayed</strong>. -If not the user will see the notification before expiration date.</p> -<h4 id="expire"><code>expire</code></h4> -<p>The <code>expire</code> decides how long to show users the notification. If current date has -passed the date in <code>expire</code>, the notification will not be displayed.</p> -<h4 id="message-body">Message body</h4> -<p>Use <code>|</code> to start a new line and put the markdown format text body -in the next indentation level.</p>Sps: SPS Guide/sps/adv_features/guide/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/guide/ -<hr> -<h2 id="sps-interative-guides-tutorials">SPS interative guides (tutorials)</h2> -<p>SPS provides some interactive guides for users to familiarize the app. There is a +<code>pkg_name</code> and <code>version</code> entries. If so, the notification will <strong>not be displayed</strong>. +If not the user will see the notification before expiration date.</p> +<h4 id="expire"><code>expire</code></h4> +<p>The <code>expire</code> decides how long to show users the notification. If current date has +passed the date in <code>expire</code>, the notification will not be displayed.</p> +<h4 id="message-body">Message body</h4> +<p>Use <code>|</code> to start a new line and put the markdown format text body +in the next indentation level.</p> + + + + + + Sps: SPS Guide + /sps/adv_features/guide/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/guide/ + + + + <hr> +<h2 id="sps-interative-guides-tutorials">SPS interative guides (tutorials)</h2> +<p>SPS provides some interactive guides for users to familiarize the app. There is a very simple one-step welcome guide that will initialize everytime on app start to indicate -where the guide dropdown is (top-right corner).</p> -<center> -<p><img src="../guide_init.png" alt=""></p> -<caption>Welcome guide on start</caption> -</center> -<p><br>By clicking the guide dropdown menu, you can open up the list of available guides. -By default, we only proivde a main SPS guide.</p> -<center> -<p><img src="../guide_main.png" alt=""></p> -<caption>Guide dropdown menu</caption> -</center> -<p><br>If any of the guide is clicked in the dropdown, the corresponding interactive guide -will start.</p> -<center> -<p><img src="../guide_started.png" alt=""></p> -<caption>Guide started</caption> -</center> -<p>You can click &ldquo;Next&rdquo;, &ldquo;Previous&rdquo; or &ldquo;Close&rdquo; to navigate the guide or close the guide.</p> -<h2 id="custom-guide">Custom guide</h2> -<p>To build and provide your custom guides to your users, there is file <code>guide_content.R</code> -created on SPS project initialization under the <code>R</code> folder: <code>/R/guide_content.R</code>. -This is the place to define your own guide.</p> -<p>This file look like this:</p> -<pre><code class="language-r">#################### Define your custom SPS tutorials ########################## +where the guide dropdown is (top-right corner).</p> +<center> +<p><img src="../guide_init.png" alt=""></p> +<caption>Welcome guide on start</caption> +</center> +<p><br>By clicking the guide dropdown menu, you can open up the list of available guides. +By default, we only proivde a main SPS guide.</p> +<center> +<p><img src="../guide_main.png" alt=""></p> +<caption>Guide dropdown menu</caption> +</center> +<p><br>If any of the guide is clicked in the dropdown, the corresponding interactive guide +will start.</p> +<center> +<p><img src="../guide_started.png" alt=""></p> +<caption>Guide started</caption> +</center> +<p>You can click &ldquo;Next&rdquo;, &ldquo;Previous&rdquo; or &ldquo;Close&rdquo; to navigate the guide or close the guide.</p> +<h2 id="custom-guide">Custom guide</h2> +<p>To build and provide your custom guides to your users, there is file <code>guide_content.R</code> +created on SPS project initialization under the <code>R</code> folder: <code>/R/guide_content.R</code>. +This is the place to define your own guide.</p> +<p>This file look like this:</p> +<pre><code class="language-r">#################### Define your custom SPS tutorials ########################## # use `shinydashboardPlus::messageItem` to add your tutorials UI to this list guide_ui &lt;- list( -## An example is provided below -shinydashboardPlus::messageItem( -inputId = &quot;guide_main&quot;, -from = &quot;Main Guide&quot;, -icon = icon('home'), -message = &quot;Brief introduction&quot; -) + ## An example is provided below + shinydashboardPlus::messageItem( + inputId = &quot;guide_main&quot;, + from = &quot;Main Guide&quot;, + icon = icon('home'), + message = &quot;Brief introduction&quot; + ) ) + # use `cicerone::Cicerone$new()` to add your tutorials content to this list # See help `?cicerone::Cicerone` -# A named list, each item's name must match the `inputId` in UI to trigger it in app. +# A named list, each item's name must match the `inputId` in UI to trigger it in app. guide_content &lt;- try(list( -## An example is provided below, replace or add your own to the list -guide_main = cicerone::Cicerone$new(overlay_click_next = TRUE)$ -step(el = &quot;sidebarItemExpanded&quot;, -title = &quot;SPS tabs&quot;, -description = &quot;Browse SPS functionalities as tabs from the left&quot;, -position = &quot;right-center&quot;)$ -... + ## An example is provided below, replace or add your own to the list + guide_main = cicerone::Cicerone$new(overlay_click_next = TRUE)$ + step(el = &quot;sidebarItemExpanded&quot;, + title = &quot;SPS tabs&quot;, + description = &quot;Browse SPS functionalities as tabs from the left&quot;, + position = &quot;right-center&quot;)$ + ... )) -</code></pre> -<p>There are two parts that you need to define: UI and actual guide content.</p> -<h3 id="ui">UI</h3> -<p>UI is what users see inside the dropdown menu. Guides UI needs to be stored in a -<code>list</code> and each item should be a <code>shinydashboardPlus::messageItem</code>.</p> -<ul> -<li><code>inputId</code> must be unique.</li> -<li><code>from</code> is the short description of the guide.</li> -<li><code>icon</code> should be a call of <code>shiny::icon()</code>, the icon of the guide in dropdown menu</li> -<li><code>message</code>: short description of the guide in dropdown menu</li> -</ul> -<p>To add multiple guides' UI, for example:</p> -<pre><code class="language-r">guide_ui &lt;- list( -## An example is provided below -shinydashboardPlus::messageItem( -inputId = &quot;guide1&quot;, -... -), -shinydashboardPlus::messageItem( -inputId = &quot;guide2&quot;, -... -), -... +</code></pre> +<p>There are two parts that you need to define: UI and actual guide content.</p> +<h3 id="ui">UI</h3> +<p>UI is what users see inside the dropdown menu. Guides UI needs to be stored in a +<code>list</code> and each item should be a <code>shinydashboardPlus::messageItem</code>.</p> +<ul> +<li><code>inputId</code> must be unique.</li> +<li><code>from</code> is the short description of the guide.</li> +<li><code>icon</code> should be a call of <code>shiny::icon()</code>, the icon of the guide in dropdown menu</li> +<li><code>message</code>: short description of the guide in dropdown menu</li> +</ul> +<p>To add multiple guides' UI, for example:</p> +<pre><code class="language-r">guide_ui &lt;- list( + ## An example is provided below + shinydashboardPlus::messageItem( + inputId = &quot;guide1&quot;, + ... + ), + shinydashboardPlus::messageItem( + inputId = &quot;guide2&quot;, + ... + ), + ... ) -</code></pre> -<h3 id="guide-content">Guide content</h3> -<p>The guide content is defined with the {<a href="https://github.com/JohnCoene/cicerone">cicerone{blk}</a>} -package with <code>cicerone::Cicerone</code> R6 class and also in a <strong>named</strong> list.</p> -<p>The name of each item in a list must match the name of <code>inputId</code> in guide UI. -For example, we have two guides</p> -<pre><code class="language-r">guide_ui &lt;- list( -## An example is provided below -shinydashboardPlus::messageItem( -inputId = &quot;guide1&quot;, -... -), -shinydashboardPlus::messageItem( -inputId = &quot;guide2&quot;, -... -), -... +</code></pre> +<h3 id="guide-content">Guide content</h3> +<p>The guide content is defined with the {<a href="https://github.com/JohnCoene/cicerone">cicerone{blk}</a>} +package with <code>cicerone::Cicerone</code> R6 class and also in a <strong>named</strong> list.</p> +<p>The name of each item in a list must match the name of <code>inputId</code> in guide UI. +For example, we have two guides</p> +<pre><code class="language-r">guide_ui &lt;- list( + ## An example is provided below + shinydashboardPlus::messageItem( + inputId = &quot;guide1&quot;, + ... + ), + shinydashboardPlus::messageItem( + inputId = &quot;guide2&quot;, + ... + ), + ... ) + guide_content &lt;- try(list( -guide1 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ -..., -guide2 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ -... + guide1 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ + ..., + guide2 = cicerone::Cicerone$new(overlay_click_next = TRUE)$ + ... )) -</code></pre> -<p>The &ldquo;guide1&rdquo; of <code>inputId</code> in the <code>guide_ui</code> must match &ldquo;guide1&rdquo; in <code>guide_content</code> list.</p> -<p>The &ldquo;guide2&rdquo; of <code>inputId</code> in the <code>guide_ui</code> must match &ldquo;guide2&rdquo; in <code>guide_content</code> list.</p> -<h4 id="define-guide-content">Define guide content</h4> -<p>How to define the guide content will not be expanded here, read details in the {<a href="https://github.com/JohnCoene/cicerone">cicerone{blk}</a>} package manual. -Here are some key points:</p> -<ul> -<li>The <code>cicerone::Cicerone</code> is R6 class, and it is obejct oriented, so -you need to use <code>cicerone::Cicerone$new()</code> method to create a new object before you -can add any guide step.</li> -<li>R6 methods calling can be chained together, like how to define steps: -<pre><code class="language-r">guide_content &lt;- try(list( -guide1 = cicerone::Cicerone$new()$ # chain object creation with step defining -step(...)$ # chain step1 to step2 -step(...)$ # step2 to step3 -step(...)$ # step3 to step4 -step(...) # DO NOT use `$` for the last step +</code></pre> +<p>The &ldquo;guide1&rdquo; of <code>inputId</code> in the <code>guide_ui</code> must match &ldquo;guide1&rdquo; in <code>guide_content</code> list.</p> +<p>The &ldquo;guide2&rdquo; of <code>inputId</code> in the <code>guide_ui</code> must match &ldquo;guide2&rdquo; in <code>guide_content</code> list.</p> +<h4 id="define-guide-content">Define guide content</h4> +<p>How to define the guide content will not be expanded here, read details in the {<a href="https://github.com/JohnCoene/cicerone">cicerone{blk}</a>} package manual. +Here are some key points:</p> +<ul> +<li>The <code>cicerone::Cicerone</code> is R6 class, and it is obejct oriented, so +you need to use <code>cicerone::Cicerone$new()</code> method to create a new object before you +can add any guide step.</li> +<li>R6 methods calling can be chained together, like how to define steps: +<pre><code class="language-r">guide_content &lt;- try(list( + guide1 = cicerone::Cicerone$new()$ # chain object creation with step defining + step(...)$ # chain step1 to step2 + step(...)$ # step2 to step3 + step(...)$ # step3 to step4 + step(...) # DO NOT use `$` for the last step )) -</code></pre> -</li> -</ul> -<p>If you follow the manual of {cicerone} to define steps, the guide will look like this -when users click it.</p> -<center> -<p><img src="../cicerone.gif" alt=""></p> -<caption>Cicerone steps</caption> -</center>Sps: App security/sps/adv_features/app_security/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/app_security/ -<hr> -<p>This secetion discusses how different security concerns are handled in SPS.</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) -</code></pre> -<h2 id="sps-mode">SPS mode</h2> -<p>SPS has an option of <code>mode</code>. This option controls how the <strong>file upload</strong> is handled by SPS. +</code></pre> +</li> +</ul> +<p>If you follow the manual of {cicerone} to define steps, the guide will look like this +when users click it.</p> +<center> +<p><img src="../cicerone.gif" alt=""></p> +<caption>Cicerone steps</caption> +</center> + + + + + + Sps: App security + /sps/adv_features/app_security/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/app_security/ + + + + <hr> +<p>This secetion discusses how different security concerns are handled in SPS.</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +</code></pre> +<h2 id="sps-mode">SPS mode</h2> +<p>SPS has an option of <code>mode</code>. This option controls how the <strong>file upload</strong> is handled by SPS. It can be either &ldquo;server&rdquo; or &ldquo;local&rdquo;, which is asking whether you are running -the app on the &ldquo;server&rdquo; or running on your &ldquo;local&rdquo; machine.</p> -<ul> -<li>&ldquo;server&rdquo;: for security, users <strong>do not</strong> have access of file system on the server, -choose files from users' local computer.</li> -<li>&ldquo;local&rdquo;: Assumes the Shiny server and users' local computer is the same machine, -so users <strong>can access</strong> file Shiny server&rsquo;s file system.</li> -</ul> -<p>It is first defined in the <code>global.R</code> file in a SPS project.</p> -<pre><code class="language-r">options(sps = list( -mode = &quot;local&quot;, -... +the app on the &ldquo;server&rdquo; or running on your &ldquo;local&rdquo; machine.</p> +<ul> +<li>&ldquo;server&rdquo;: for security, users <strong>do not</strong> have access of file system on the server, +choose files from users' local computer.</li> +<li>&ldquo;local&rdquo;: Assumes the Shiny server and users' local computer is the same machine, +so users <strong>can access</strong> file Shiny server&rsquo;s file system.</li> +</ul> +<p>It is first defined in the <code>global.R</code> file in a SPS project.</p> +<pre><code class="language-r">options(sps = list( + mode = &quot;local&quot;, + ... )) -</code></pre> -<p>You can check current setting after the app started for the first time</p> -<pre><code class="language-r">spsOption(&quot;mode&quot;) -</code></pre> -<pre><code>## [1] &quot;local&quot; -</code></pre> -<p>The most affected function is <code>dynamicFile</code> and its server side function <code>dynamicFileServer</code>.</p> -<p>Server:</p> -<p><img src="../server.png" alt=""> -After clicking the file selection button in SPS, <code>server</code> mode uses the default +</code></pre> +<p>You can check current setting after the app started for the first time</p> +<pre><code class="language-r">spsOption(&quot;mode&quot;) +</code></pre> +<pre><code>## [1] &quot;local&quot; +</code></pre> +<p>The most affected function is <code>dynamicFile</code> and its server side function <code>dynamicFileServer</code>.</p> +<p>Server:</p> +<p><img src="../server.png" alt=""> +After clicking the file selection button in SPS, <code>server</code> mode uses the default shiny file choose, which users can choose from their local computer. You can see -from the picture above, this is a user operating system built-in file chooser.</p> -<p>Local:</p> -<p><img src="../local.png" alt=""> -You can see this is different than the &ldquo;server&rdquo; mode. &ldquo;Local&rdquo; mode is able to +from the picture above, this is a user operating system built-in file chooser.</p> +<p>Local:</p> +<p><img src="../local.png" alt=""> +You can see this is different than the &ldquo;server&rdquo; mode. &ldquo;Local&rdquo; mode is able to use the file system of the shiny deploy environment file system, and it is no longer -the users' local system.</p> -<p>This may be confusing for the first time. Remember &ldquo;server&rdquo; and &ldquo;local&rdquo; mean -<strong>where</strong> you deploy the shiny app, on the <em>server</em> or run on your <em>local</em> computer.</p> -<table> -<thead> -<tr> -<th>Mode</th> -<th>choose file from</th> -<th>file pointing method</th> -</tr> -</thead> -<tbody> -<tr> -<td>Server</td> -<td>user local computer</td> -<td>copy to temp</td> -</tr> -<tr> -<td>Local</td> -<td>the computer where you deploy the app</td> -<td>direct pointer</td> -</tr> -</tbody> -</table> -<h3 id="pro-and-cons-of-modes">Pro and cons of modes</h3> -<p>It <strong>does not</strong> matter if which mode you choose if you run the app <strong>on your own computer</strong>, -because the deploy server and the user computer are the same.</p> -<ul> -<li>However &ldquo;local&rdquo; mode will not copy a file to temp after the file chooser, but directly create a pointer.</li> -<li>&ldquo;Server&rdquo; mode will first upload/copy the file to temp and create a pointer. This +the users' local system.</p> +<p>This may be confusing for the first time. Remember &ldquo;server&rdquo; and &ldquo;local&rdquo; mean +<strong>where</strong> you deploy the shiny app, on the <em>server</em> or run on your <em>local</em> computer.</p> +<table> +<thead> +<tr> +<th>Mode</th> +<th>choose file from</th> +<th>file pointing method</th> +</tr> +</thead> +<tbody> +<tr> +<td>Server</td> +<td>user local computer</td> +<td>copy to temp</td> +</tr> +<tr> +<td>Local</td> +<td>the computer where you deploy the app</td> +<td>direct pointer</td> +</tr> +</tbody> +</table> +<h3 id="pro-and-cons-of-modes">Pro and cons of modes</h3> +<p>It <strong>does not</strong> matter if which mode you choose if you run the app <strong>on your own computer</strong>, +because the deploy server and the user computer are the same.</p> +<ul> +<li>However &ldquo;local&rdquo; mode will not copy a file to temp after the file chooser, but directly create a pointer.</li> +<li>&ldquo;Server&rdquo; mode will first upload/copy the file to temp and create a pointer. This will cause resources waste if you are running the app on your own computer. You already have the file on your computer but now it gets copied to temp before Shiny -can use it. This will also waste some time to copy the file, especially for large files.</li> -<li>There is a <strong>limit</strong> for default Shiny upload size which is 24MB in &ldquo;server&rdquo; mode.</li> -<li>You can choose files as large as you desire on &ldquo;local&rdquo; mode.</li> -</ul> -<h3 id="the-security-issue-of-local-mode">The security issue of local mode</h3> -<p>There is a security concern of &ldquo;local&rdquo; mode when the app is deployed on a remote +can use it. This will also waste some time to copy the file, especially for large files.</li> +<li>There is a <strong>limit</strong> for default Shiny upload size which is 24MB in &ldquo;server&rdquo; mode.</li> +<li>You can choose files as large as you desire on &ldquo;local&rdquo; mode.</li> +</ul> +<h3 id="the-security-issue-of-local-mode">The security issue of local mode</h3> +<p>There is a security concern of &ldquo;local&rdquo; mode when the app is deployed on a remote server. &ldquo;local&rdquo; mode enables users to choose files from the remote server, so -there is the risk of file leaking and file damaging.</p> -<p>We recommend <strong>DO NOT</strong> use &ldquo;local&rdquo; mode for remote deployment, like <a href="https://shinyapps.io">https://shinyapps.io</a>. -You can turn the option <code>warning_toast = TRUE</code> on global and testing the app before -deploy. This option will check for security problems and inform you.</p> -<p>There are cases where you really need users to choose files from the remote +there is the risk of file leaking and file damaging.</p> +<p>We recommend <strong>DO NOT</strong> use &ldquo;local&rdquo; mode for remote deployment, like <a href="https://shinyapps.io">https://shinyapps.io</a>. +You can turn the option <code>warning_toast = TRUE</code> on global and testing the app before +deploy. This option will check for security problems and inform you.</p> +<p>There are cases where you really need users to choose files from the remote server, like the Workflow module, where all workflow files are stored on the -remote server. Then <strong>use a sandbox or container environment</strong> to isolate the app, -and also <strong>turn on the login page</strong> <code>login_screen = TRUE</code> to limit access will be helpful.</p> -<h2 id="warning-toast">Warning toast</h2> -<p>Set <code>warning_toast = TRUE</code> option will check for potential security risks and show +remote server. Then <strong>use a sandbox or container environment</strong> to isolate the app, +and also <strong>turn on the login page</strong> <code>login_screen = TRUE</code> to limit access will be helpful.</p> +<h2 id="warning-toast">Warning toast</h2> +<p>Set <code>warning_toast = TRUE</code> option will check for potential security risks and show a pop-up message if there is any risk when app starts. This is option is helpful -on pre-deployment testing.</p> -<ul> -<li>check if you have changed the default admin page url &ldquo;admin&rdquo;</li> -<li>check if you have changed the default admin user &ldquo;admin&rdquo;</li> -<li>check if you have changed the default user &ldquo;admin&rdquo;</li> -<li>check if you are on &ldquo;local&rdquo; mode</li> -</ul> -<p><img src="../warning_toast.png" alt=""></p> -<h2 id="the-workflow-module">The workflow module</h2> -<p>The workflow module enables users to manage, design, and run workflows directly +on pre-deployment testing.</p> +<ul> +<li>check if you have changed the default admin page url &ldquo;admin&rdquo;</li> +<li>check if you have changed the default admin user &ldquo;admin&rdquo;</li> +<li>check if you have changed the default user &ldquo;admin&rdquo;</li> +<li>check if you are on &ldquo;local&rdquo; mode</li> +</ul> +<p><img src="../warning_toast.png" alt=""></p> +<h2 id="the-workflow-module">The workflow module</h2> +<p>The workflow module enables users to manage, design, and run workflows directly from the app and in the final running workflow session, users are allowed to run arbitrary R code in a Rstudio like console in a child R session. -Running any R code means they can modify your remote system, and use <code>system</code> -commands.</p> -<p>For <a href="https://shinyapps.io">shinyapps.io</a>, it runs in a container and it reset itself +Running any R code means they can modify your remote system, and use <code>system</code> +commands.</p> +<p>For <a href="https://shinyapps.io">shinyapps.io</a>, it runs in a container and it reset itself once a while, so security is not a big concern, but apparently, shinyapps.io is not a place you want to deploy heavy data analysis workflows. Most users will deploy the SPS with workflow modules in other cloud computing sites or their own servers. -For these cases, we recommend you:</p> -<ol> -<li> -<p class="text-danger">Turn on the login to give access to limited people.</p> -</li> -<li> -<p class="text-danger">Isolate the app with sandboxes or containers.</p> -</li> -</ol>Sps: SPS database/sps/adv_features/database/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/database/ -<hr> -<p>SPS database is a small SQLite database which stores some basic app information, +For these cases, we recommend you:</p> +<ol> +<li> +<p class="text-danger">Turn on the login to give access to limited people.</p> +</li> +<li> +<p class="text-danger">Isolate the app with sandboxes or containers.</p> +</li> +</ol> + + + + + + Sps: SPS database + /sps/adv_features/database/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/database/ + + + + <hr> +<p>SPS database is a small SQLite database which stores some basic app information, the project encryption key pair, account information. The database is controlled -by 3 SPS R6 classes:</p> -<ul> -<li><strong>spsDb</strong>: basic database management, queries.</li> -<li><strong>spsEncryption</strong>: Interact with the SHA256 key pair in the database to encrypt -strings, and files. Also methods to view or change the key pair, inherits <code>spsDb</code></li> -<li><strong>spsAcount</strong>: use the encyption key pair to manage users and admin accounts in -SPS, inherits <code>spsDb</code> and <code>spsEncryption</code>.</li> -</ul> -<p>First to create a SPS project</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) -</code></pre> -<pre><code class="language-r">app_path &lt;- &quot;.&quot; +by 3 SPS R6 classes:</p> +<ul> +<li><strong>spsDb</strong>: basic database management, queries.</li> +<li><strong>spsEncryption</strong>: Interact with the SHA256 key pair in the database to encrypt +strings, and files. Also methods to view or change the key pair, inherits <code>spsDb</code></li> +<li><strong>spsAcount</strong>: use the encyption key pair to manage users and admin accounts in +SPS, inherits <code>spsDb</code> and <code>spsEncryption</code>.</li> +</ul> +<p>First to create a SPS project</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +</code></pre> +<pre><code class="language-r">app_path &lt;- &quot;.&quot; spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) -</code></pre> -<pre><code>## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains. +</code></pre> +<pre><code>## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 1d1f76c8eecddb382ee2db097d6edbe9 ## [SPS-INFO] 2021-04-22 15:45:04 SPS project setup done! -</code></pre> -<p>You can see a database created on a SPS project initiation, you should see a message -like this:</p> -<pre><code>[SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at -</code></pre> -<p>Then we can use different class methods to interact with the database.</p> -<h2 id="spsdb-class"><code>spsDb</code> class</h2> -<p>Reference manual under <a href="../../sps/funcs/sps/reference/spsDb.html">SPS Functions</a>.</p> -<p>Create a class object:</p> -<pre><code class="language-r">mydb &lt;- spsDb$new() -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container -</code></pre> -<h3 id="create-new-db">create new db</h3> -<p>If there is no database, we can create one:</p> -<pre><code class="language-r"># delete current one first +</code></pre> +<p>You can see a database created on a SPS project initiation, you should see a message +like this:</p> +<pre><code>[SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at +</code></pre> +<p>Then we can use different class methods to interact with the database.</p> +<h2 id="spsdb-class"><code>spsDb</code> class</h2> +<p>Reference manual under <a href="../../sps/funcs/sps/reference/spsDb.html">SPS Functions</a>.</p> +<p>Create a class object:</p> +<pre><code class="language-r">mydb &lt;- spsDb$new() +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container +</code></pre> +<h3 id="create-new-db">create new db</h3> +<p>If there is no database, we can create one:</p> +<pre><code class="language-r"># delete current one first try(file.remove(&quot;config/sps.db&quot;)) ## [1] TRUE # create a new one mydb$createDb() ## [SPS-INFO] 2021-04-22 15:45:04 Creating SPS db... -## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. +## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-22 15:45:04 Key md5 6306a50abcf3c7618566911a793b0405 -</code></pre> -<p class="text-danger">If you create a new database, all information in the old database -will be overwritten. All old information will be lost</p> -<h3 id="get-tables">Get tables</h3> -<pre><code class="language-r"># meta info table +</code></pre> +<p class="text-danger">If you create a new database, all information in the old database +will be overwritten. All old information will be lost</p> +<h3 id="get-tables">Get tables</h3> +<pre><code class="language-r"># meta info table mydb$queryValue(&quot;sps_meta&quot;) -</code></pre> -<pre><code>## info value +</code></pre> +<pre><code>## info value ## 1 creation_date 20210422154504 -</code></pre> -<pre><code class="language-r"># raw blob table to store keys +</code></pre> +<pre><code class="language-r"># raw blob table to store keys mydb$queryValue(&quot;sps_raw&quot;) -</code></pre> -<pre><code>## info value -## 1 key blob[1.36 kB] -</code></pre> -<pre><code class="language-r"># account table +</code></pre> +<pre><code>## info value +## 1 key blob[1.36 kB] +</code></pre> +<pre><code class="language-r"># account table mydb$queryValue(&quot;sps_account&quot;) -</code></pre> -<pre><code>## account pass -## 1 admin bef2094c429fa5b0ff7a37abc6bf8dd31c29fa2acd783a2303935d2b8664ea21 -## 2 user 12842a62c410af0f4b4dc866283a90f7b7c42c9d5ca0d0e1c812dca11021b052 -## role +</code></pre> +<pre><code>## account pass +## 1 admin bef2094c429fa5b0ff7a37abc6bf8dd31c29fa2acd783a2303935d2b8664ea21 +## 2 user 12842a62c410af0f4b4dc866283a90f7b7c42c9d5ca0d0e1c812dca11021b052 +## role ## 1 admin -## 2 user -</code></pre> -<h3 id="insert-new-recordsrows">Insert new records(rows)</h3> -<p>To add a new row, values of all columns needs to be passed in a SQL string</p> -<pre><code class="language-r">mydb$queryInsert(&quot;sps_meta&quot;, value = &quot;'new1', '1'&quot;) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows -</code></pre> -<p>Or pass in a vector:</p> -<pre><code class="language-r">mydb$queryInsert(&quot;sps_meta&quot;, value = c(&quot;'new2'&quot;, &quot;'2'&quot;)) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows -</code></pre> -<pre><code class="language-r"># check the new table +## 2 user +</code></pre> +<h3 id="insert-new-recordsrows">Insert new records(rows)</h3> +<p>To add a new row, values of all columns needs to be passed in a SQL string</p> +<pre><code class="language-r">mydb$queryInsert(&quot;sps_meta&quot;, value = &quot;'new1', '1'&quot;) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows +</code></pre> +<p>Or pass in a vector:</p> +<pre><code class="language-r">mydb$queryInsert(&quot;sps_meta&quot;, value = c(&quot;'new2'&quot;, &quot;'2'&quot;)) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows +</code></pre> +<pre><code class="language-r"># check the new table mydb$queryValue(&quot;sps_meta&quot;) -</code></pre> -<pre><code>## info value +</code></pre> +<pre><code>## info value ## 1 creation_date 20210422154504 -## 2 new1 1 -## 3 new2 2 -</code></pre> -<h3 id="change-values">change values</h3> -<pre><code class="language-r">mydb$queryUpdate(&quot;sps_meta&quot;, value = '234', col = &quot;value&quot;, WHERE = &quot;info = 'new1'&quot;) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows -</code></pre> -<pre><code class="language-r"># check the update +## 2 new1 1 +## 3 new2 2 +</code></pre> +<h3 id="change-values">change values</h3> +<pre><code class="language-r">mydb$queryUpdate(&quot;sps_meta&quot;, value = '234', col = &quot;value&quot;, WHERE = &quot;info = 'new1'&quot;) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows +</code></pre> +<pre><code class="language-r"># check the update mydb$queryValue(&quot;sps_meta&quot;) -</code></pre> -<pre><code>## info value +</code></pre> +<pre><code>## info value ## 1 creation_date 20210422154504 -## 2 new1 234 -## 3 new2 2 -</code></pre> -<h3 id="remove-values">remove values</h3> -<pre><code class="language-r">mydb$queryDel(&quot;sps_meta&quot;, WHERE = &quot;value = '234'&quot;) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows -</code></pre> -<pre><code class="language-r"># check again +## 2 new1 234 +## 3 new2 2 +</code></pre> +<h3 id="remove-values">remove values</h3> +<pre><code class="language-r">mydb$queryDel(&quot;sps_meta&quot;, WHERE = &quot;value = '234'&quot;) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows +</code></pre> +<pre><code class="language-r"># check again mydb$queryValue(&quot;sps_meta&quot;) -</code></pre> -<pre><code>## info value +</code></pre> +<pre><code>## info value ## 1 creation_date 20210422154504 -## 2 new2 2 -</code></pre> -<h2 id="spsencryption-class"><code>spsEncryption</code> class</h2> -<p>Reference manual under <a href="../../sps/funcs/sps/reference/spsEncryption.html">SPS Functions</a>.</p> -<p>Start by creating a class object</p> -<pre><code class="language-r">my_ecpt &lt;- spsEncryption$new() +## 2 new2 2 +</code></pre> +<h2 id="spsencryption-class"><code>spsEncryption</code> class</h2> +<p>Reference manual under <a href="../../sps/funcs/sps/reference/spsEncryption.html">SPS Functions</a>.</p> +<p>Start by creating a class object</p> +<pre><code class="language-r">my_ecpt &lt;- spsEncryption$new() ## [SPS-INFO] 2021-04-22 15:45:05 Created SPS encryption method container ## [SPS-INFO] 2021-04-22 15:45:05 Default SPS-db found and is working -</code></pre> -<h3 id="get-current-key">Get current key</h3> -<p>To see the public and private keys (in {<a href="https://github.com/jeroen/openssl">openssil{blk}</a>} format):</p> -<pre><code class="language-r"># private +</code></pre> +<h3 id="get-current-key">Get current key</h3> +<p>To see the public and private keys (in {<a href="https://github.com/jeroen/openssl">openssil{blk}</a>} format):</p> +<pre><code class="language-r"># private my_ecpt$keyGet() -</code></pre> -<pre><code>## [2048-bit rsa private key] +</code></pre> +<pre><code>## [2048-bit rsa private key] ## md5: 6306a50abcf3c7618566911a793b0405 -</code></pre> -<pre><code class="language-r"># public +</code></pre> +<pre><code class="language-r"># public my_ecpt$keyGet()$pubkey -</code></pre> -<pre><code>## [2048-bit rsa public key] +</code></pre> +<pre><code>## [2048-bit rsa public key] ## md5: 6306a50abcf3c7618566911a793b0405 -</code></pre> -<h3 id="change-the-encyption-key">Change the encyption key</h3> -<p class="text-danger text-bold" style="font-weight: 600;">Be super careful to change the encryption key. This will -result any file encrypted by the old key pair unlockable and the password of all -current accounts invalid.</p> -<p>By default it will prevent you to change the key in case you accidentally run this -method</p> -<pre><code class="language-r">my_ecpt$keyChange() -</code></pre> -<pre><code>## [SPS-DANGER] 2021-04-22 15:45:05 -## change this key will result all accounts' password failed to +</code></pre> +<h3 id="change-the-encyption-key">Change the encyption key</h3> +<p class="text-danger text-bold" style="font-weight: 600;">Be super careful to change the encryption key. This will +result any file encrypted by the old key pair unlockable and the password of all +current accounts invalid.</p> +<p>By default it will prevent you to change the key in case you accidentally run this +method</p> +<pre><code class="language-r">my_ecpt$keyChange() +</code></pre> +<pre><code>## [SPS-DANGER] 2021-04-22 15:45:05 +## change this key will result all accounts' password failed to ## authenticate. You have to regenerate all password for all ## accounts. All encrypted file using the old key will fail to ## decrypt. There is NO way to RECOVER the old key, password ## and files. If you wish to continue, recall this function ## with `confirm = TRUE`. -</code></pre> -<p>Unless you are super sure with a confirmation</p> -<pre><code class="language-r">my_ecpt$keyChange(confirm = TRUE) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18 -</code></pre> -<h3 id="encrypt-files">Encrypt files</h3> -<pre><code class="language-r"># imagine a file has one line &quot;test&quot; +</code></pre> +<p>Unless you are super sure with a confirmation</p> +<pre><code class="language-r">my_ecpt$keyChange(confirm = TRUE) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18 +</code></pre> +<h3 id="encrypt-files">Encrypt files</h3> +<pre><code class="language-r"># imagine a file has one line &quot;test&quot; writeLines(text = &quot;test&quot;, con = &quot;test.txt&quot;) my_ecpt$encrypt(&quot;test.txt&quot;, &quot;test.bin&quot;, overwrite = TRUE) -</code></pre> -<h3 id="decrypt-files">Decrypt files</h3> -<pre><code class="language-r">my_ecpt$decrypt(&quot;test.bin&quot;, &quot;test_decpt.txt&quot;, overwrite = TRUE) -</code></pre> -<p>Check the decrypted file content</p> -<pre><code class="language-r">readLines('test_decpt.txt') -</code></pre> -<pre><code>## [1] &quot;test&quot; -</code></pre> -<h2 id="spsacount-class"><code>spsAcount</code> class</h2> -<p>This class is discussed in details in the <a href="../login">Accounts, login and admin</a>.</p>Sps: Accounts, Login and Admin/sps/adv_features/login/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/login/ -<hr> -<h2 id="sps-accounts">SPS accounts</h2> -<p>After a SPS project is initialized, some default accounts has been set up. They -will not become useful unless you enable the login and admin features.</p> -<p>There are 2 default accounts created for you to test before deploy:</p> -<table> -<thead> -<tr> -<th>name</th> -<th>role</th> -<th>password</th> -</tr> -</thead> -<tbody> -<tr> -<td>admin</td> -<td>admin</td> -<td>admin</td> -</tr> -<tr> -<td>user</td> -<td>user</td> -<td>user</td> -</tr> -</tbody> -</table> -<p>The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login.</p> -<p class="text-danger">Please change these accounts before deployment.</p> -<h3 id="account-management">Account management</h3> -<p>You can manage accounts in two ways: commandline and admin page. Here is how you -manage from commandline, read how to do it from <a href="#admin-page">admin page below</a>.</p> -<p>There are some helper code inside <code>global.R</code> file under your SPS project root.</p> -<pre><code class="language-r">## account information +</code></pre> +<h3 id="decrypt-files">Decrypt files</h3> +<pre><code class="language-r">my_ecpt$decrypt(&quot;test.bin&quot;, &quot;test_decpt.txt&quot;, overwrite = TRUE) +</code></pre> +<p>Check the decrypted file content</p> +<pre><code class="language-r">readLines('test_decpt.txt') +</code></pre> +<pre><code>## [1] &quot;test&quot; +</code></pre> +<h2 id="spsacount-class"><code>spsAcount</code> class</h2> +<p>This class is discussed in details in the <a href="../login">Accounts, login and admin</a>.</p> + + + + + + Sps: Accounts, Login and Admin + /sps/adv_features/login/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/login/ + + + + <hr> +<h2 id="sps-accounts">SPS accounts</h2> +<p>After a SPS project is initialized, some default accounts has been set up. They +will not become useful unless you enable the login and admin features.</p> +<p>There are 2 default accounts created for you to test before deploy:</p> +<table> +<thead> +<tr> +<th>name</th> +<th>role</th> +<th>password</th> +</tr> +</thead> +<tbody> +<tr> +<td>admin</td> +<td>admin</td> +<td>admin</td> +</tr> +<tr> +<td>user</td> +<td>user</td> +<td>user</td> +</tr> +</tbody> +</table> +<p>The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login.</p> + <p class="text-danger">Please change these accounts before deployment.</p> +<h3 id="account-management">Account management</h3> +<p>You can manage accounts in two ways: commandline and admin page. Here is how you +manage from commandline, read how to do it from <a href="#admin-page">admin page below</a>.</p> +<p>There are some helper code inside <code>global.R</code> file under your SPS project root.</p> +<pre><code class="language-r">## account information ## PLEASE use following to add your own accounts and remove the default accounts for deployment # mydb &lt;- spsAccount$new() # mydb$accList() # mydb$accAdd(acc_name = &quot;XXX&quot;, acc_pass = &quot;$xxxx&quot;, role = &quot;admin&quot;) # mydb$accRemove(&quot;admin&quot;) # mydb$accRemove(&quot;user&quot;) -</code></pre> -<p>You can uncomment these lines to practice how to manage accounts, or read the reference manual about <a href="../../sps/funcs/sps/reference/spsAccount.html">spsAccount class</a>.</p> -<p>First to create a SPS project</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) -</code></pre> -<pre><code class="language-r">app_path &lt;- &quot;.&quot; +</code></pre> +<p>You can uncomment these lines to practice how to manage accounts, or read the reference manual about <a href="../../sps/funcs/sps/reference/spsAccount.html">spsAccount class</a>.</p> +<p>First to create a SPS project</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +</code></pre> +<pre><code class="language-r">app_path &lt;- &quot;.&quot; spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-16 16:25:15 Start to create a new SPS project +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-16 16:25:15 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 16:25:15 Create project under /tmp/RtmpMoNp2X/SPS_20210416 ## [SPS-INFO] 2021-04-16 16:25:15 Now copy files ## [SPS-INFO] 2021-04-16 16:25:15 Create SPS database ## [SPS-INFO] 2021-04-16 16:25:15 Created SPS database method container ## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db... -## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at '/tmp/RtmpMoNp2X/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. +## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at '/tmp/RtmpMoNp2X/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 db686a4f203edbdd0fe4c2a1642492d2 ## [SPS-INFO] 2021-04-16 16:25:15 SPS project setup done! -</code></pre> -<p>Create a <code>spsAccount</code> object. SPS accounts are stored in the <code>config/sps.db</code> database inside your SPS projects.</p> -<pre><code class="language-r">acc &lt;- spsAccount$new() +</code></pre> +<p>Create a <code>spsAccount</code> object. SPS accounts are stored in the <code>config/sps.db</code> database inside your SPS projects.</p> +<pre><code class="language-r">acc &lt;- spsAccount$new() ## [SPS-INFO] 2021-04-16 16:25:15 Created SPS account method container ## [SPS-INFO] 2021-04-16 16:25:15 Default SPS-db found and is working -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db... -</code></pre> -<pre><code>## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db... +</code></pre> +<pre><code>## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 127f00770c4ed318c48fe92cd67bf783 -</code></pre> -<p>See what accounts you have</p> -<pre><code class="language-r">acc$accList() -</code></pre> -<pre><code>## account role -## 1 admin admin -## 2 user user -</code></pre> -<p>You can also listed passwords. They are SHA256 encrypted.</p> -<pre><code class="language-r">tibble::as_tibble(acc$accList(include_pass = TRUE)) +</code></pre> +<p>See what accounts you have</p> +<pre><code class="language-r">acc$accList() +</code></pre> +<pre><code>## account role +## 1 admin admin +## 2 user user +</code></pre> +<p>You can also listed passwords. They are SHA256 encrypted.</p> +<pre><code class="language-r">tibble::as_tibble(acc$accList(include_pass = TRUE)) ## # A tibble: 2 x 3 -## account pass role -## &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; -## 1 admin 0b1460498bf1b50e05cc07e53c7856fc23ecd3fc2bc404d52dbf3aae743f8a9a admin -## 2 user 796be5ca7dafddf5e1e7c032fc71386fe16274f63b6068bb2b064d4c9876eaae user -</code></pre> -<p>See <a href="../database">SPS database</a> for encryption key details.</p> -<p>Add a new user</p> -<pre><code class="language-r">acc$accAdd(acc_name = 'user2', acc_pass = '!newuser12345', role = &quot;user&quot;) +## account pass role +## &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; +## 1 admin 0b1460498bf1b50e05cc07e53c7856fc23ecd3fc2bc404d52dbf3aae743f8a9a admin +## 2 user 796be5ca7dafddf5e1e7c032fc71386fe16274f63b6068bb2b064d4c9876eaae user +</code></pre> +<p>See <a href="../database">SPS database</a> for encryption key details.</p> +<p>Add a new user</p> +<pre><code class="language-r">acc$accAdd(acc_name = 'user2', acc_pass = '!newuser12345', role = &quot;user&quot;) ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 created. -</code></pre> -<p>Change the role of <code>user2</code> from &ldquo;user&rdquo; to &ldquo;admin&rdquo;</p> -<pre><code class="language-r">acc$accRoleChange(acc_name = &quot;user2&quot;, role = &quot;admin&quot;) +</code></pre> +<p>Change the role of <code>user2</code> from &ldquo;user&rdquo; to &ldquo;admin&rdquo;</p> +<pre><code class="language-r">acc$accRoleChange(acc_name = &quot;user2&quot;, role = &quot;admin&quot;) ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 role changed. -</code></pre> -<p>Remove a user</p> -<pre><code class="language-r">acc$accRemove(&quot;user2&quot;) +</code></pre> +<p>Remove a user</p> +<pre><code class="language-r">acc$accRemove(&quot;user2&quot;) ## [SPS-INFO] 2021-04-16 16:25:15 Deleted 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 removed acc$accList() -## account role -## 1 admin admin -## 2 user user -</code></pre> -<p>Change password</p> -<pre><code class="language-r">acc$accPassChange(acc_name = &quot;user&quot;, , acc_pass = '!newuser54321') +## account role +## 1 admin admin +## 2 user user +</code></pre> +<p>Change password</p> +<pre><code class="language-r">acc$accPassChange(acc_name = &quot;user&quot;, , acc_pass = '!newuser54321') ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows ## [SPS-INFO] 2021-04-16 16:25:15 Account user password created. -</code></pre> -<p>Validate password</p> -<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321') -</code></pre> -<pre><code>## [1] TRUE -</code></pre> -<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = &quot;user&quot;) -</code></pre> -<pre><code>## [1] FALSE -</code></pre> -<pre><code class="language-r">acc$accMatch(acc_name = &quot;abc&quot;, acc_pass = &quot;123&quot;) -</code></pre> -<pre><code>## [1] FALSE -</code></pre> -<p>Validate password + role</p> -<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321', match_role = TRUE, role = &quot;user&quot;) -</code></pre> -<pre><code>## [1] TRUE -</code></pre> -<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321', match_role = TRUE, role = &quot;admin&quot;) -</code></pre> -<pre><code>## [1] FALSE -</code></pre> -<h2 id="main-app-login">Main app login</h2> -<p>After the account has been set up properly, one can try to turn on the login page for the main app. Use <code>spsOption(&quot;login_screen&quot;, TRUE)</code> or set <code>login_screen = TRUE</code> in <strong><code>global.R</code></strong> file.</p> -<p>Whether enabling the login screen is fundamentally different how the Shiny app -loads the UI and server code.</p> -<ul> -<li>Disabled: loads UI and server on app start</li> -<li>Enabled: loads login UI and server on start, loads main app UI and server code only when login is successful.</li> -</ul> -<p>One advantage of using the login is the app starting time is fast. On app start, +</code></pre> +<p>Validate password</p> +<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321') +</code></pre> +<pre><code>## [1] TRUE +</code></pre> +<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = &quot;user&quot;) +</code></pre> +<pre><code>## [1] FALSE +</code></pre> +<pre><code class="language-r">acc$accMatch(acc_name = &quot;abc&quot;, acc_pass = &quot;123&quot;) +</code></pre> +<pre><code>## [1] FALSE +</code></pre> +<p>Validate password + role</p> +<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321', match_role = TRUE, role = &quot;user&quot;) +</code></pre> +<pre><code>## [1] TRUE +</code></pre> +<pre><code class="language-r">acc$accMatch(acc_name = &quot;user&quot;, acc_pass = '!newuser54321', match_role = TRUE, role = &quot;admin&quot;) +</code></pre> +<pre><code>## [1] FALSE +</code></pre> +<h2 id="main-app-login">Main app login</h2> +<p>After the account has been set up properly, one can try to turn on the login page for the main app. Use <code>spsOption(&quot;login_screen&quot;, TRUE)</code> or set <code>login_screen = TRUE</code> in <strong><code>global.R</code></strong> file.</p> +<p>Whether enabling the login screen is fundamentally different how the Shiny app +loads the UI and server code.</p> +<ul> +<li>Disabled: loads UI and server on app start</li> +<li>Enabled: loads login UI and server on start, loads main app UI and server code only when login is successful.</li> +</ul> +<p>One advantage of using the login is the app starting time is fast. On app start, it only loads the login logic so it saves some time. The heavy part is the main app logic which will be loaded after a successful login. So the overall loading time is about the same. The difference is at what time point to load main app. Of course, if the user fails to login, main app will never be loaded. This can save some resources to -handle unauthorized requests.</p> -<p class="text-warning">This difference may cause some javascript not working -if you are loading your custom tabs with custom javascript. Set a wait signal in -your javascript or report an issue to us if you have troubles.</p> -<hr> -<p>The login screen is also controlled by another setting <code>login_theme</code>. +handle unauthorized requests.</p> +<p class="text-warning">This difference may cause some javascript not working +if you are loading your custom tabs with custom javascript. Set a wait signal in +your javascript or report an issue to us if you have troubles.</p> +<hr> +<p>The login screen is also controlled by another setting <code>login_theme</code>. By default, if you turn on the &ldquo;login_screen&rdquo;, app will show you a random loading -theme (<code>login_theme = &quot;random&quot;</code>) before you see the login panel. You can interact +theme (<code>login_theme = &quot;random&quot;</code>) before you see the login panel. You can interact with these themes or change to play with a different theme. Or you can specify your favorate from &ldquo;vhelix&rdquo; (DNA double helix), &ldquo;hhelix&rdquo; (DNA flow), or &ldquo;biomatrix&rdquo; -(DNA Matrix).</p> -<p><img src="../login_theme.gif" alt=""></p> -<hr> -<p>If you are not a fan of these themes, you can use <code>login_theme = &quot;empty&quot;</code> to directly -go to login panel.</p> -<center> -<p><img src="../login_empty.png" alt=""></p> -</center> -<h2 id="admin-page">Admin page</h2> -<p>SPS Admin page is panel of tabs to help app managers administrate the app. Under +(DNA Matrix).</p> +<p><img src="../login_theme.gif" alt=""></p> +<hr> +<p>If you are not a fan of these themes, you can use <code>login_theme = &quot;empty&quot;</code> to directly +go to login panel.</p> +<center> +<p><img src="../login_empty.png" alt=""></p> +</center> +<h2 id="admin-page">Admin page</h2> +<p>SPS Admin page is panel of tabs to help app managers administrate the app. Under current version, SPS provides 2 main features: app information/statistics and -account control.</p> -<h3 id="admin-login">Admin login</h3> -<p>To reach the Admin page, users first need to enable this feature (default is <code>TRUE</code>) -in SPS options <code>admin_page</code> use either <code>spsOption(&quot;admin_page&quot;, TRUE)</code> or set it -in <code>global.R</code>. Afterwards, users need type in the correct url to find the page. -This can be set with the SPS option <code>admin_url</code>. Default is &ldquo;admin&rdquo;, <code>admin_url = &quot;admin&quot;</code>, -<span class="text-warning">but for security we recommend you to change it in deployment. </span></p> -<p>To access it, add &ldquo;?&rdquo; + &ldquo;YOUR_ADMIN_URL&rdquo; to your app url to visit it. For example:</p> -<p>we have a demo <a href="https://tgirke.shinyapps.io/systemPipeShiny_loading/">https://tgirke.shinyapps.io/systemPipeShiny_loading/</a></p> -<p>to visit the admin page, then we visit <a href="https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin">https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin</a></p> -<center> -<p><img src="../admin_login.png" alt=""></p> -<p>Admin login page</p> -</center> -<p>You can use the testing account &ldquo;admin&rdquo; and password &ldquo;admin&rdquo; to login, -<span class="text-warning">but for security we strongly recommend you to change it in deployment. </span></p> -<h3 id="app-information">App information</h3> -<p>The first tab of the Admin page is current app and server information, like CPU, -RAM, size, <em>etc</em>. On this tab, under details, some real-time statistic plots -are rendered. You can interact with these plots to dig for more information.</p> -<center> -<p><img src="../admin_tab_info.png" alt=""></p> -<p>Admin page app info</p> -</center> -<h3 id="account-control">Account control</h3> -<p>Instead of changing account information from commandline, you can use this tab -to add / remove / change password/ change roles of current app accounts.</p> -<center> -<p><img src="../admin_tab_user.png" alt=""></p> -<p>Admin page user control</p> -</center> -<center> -<p><img src="../admin_newuser.png" alt=""></p> -<p>Create a new user</p> -</center>Sps: Debugging/sps/adv_features/debug/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/debug/ -<hr> -<p>There are some options in SPS that will give you more information and help you on -debugging. They are: <code>verbose</code> and <code>traceback</code>. You can <a href="../config">config</a> -(enable/disable) themin a SPS project&rsquo;s <code>global.R</code> file, or use -<code>spsOption(&quot;verbose&quot;, TRUE)</code> and <code>spsOption(&quot;traceback&quot;, TRUE)</code> to turn on them.</p> -<p>Some setup:</p> -<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) +account control.</p> +<h3 id="admin-login">Admin login</h3> +<p>To reach the Admin page, users first need to enable this feature (default is <code>TRUE</code>) +in SPS options <code>admin_page</code> use either <code>spsOption(&quot;admin_page&quot;, TRUE)</code> or set it +in <code>global.R</code>. Afterwards, users need type in the correct url to find the page. +This can be set with the SPS option <code>admin_url</code>. Default is &ldquo;admin&rdquo;, <code>admin_url = &quot;admin&quot;</code>, +<span class="text-warning">but for security we recommend you to change it in deployment. </span></p> +<p>To access it, add &ldquo;?&rdquo; + &ldquo;YOUR_ADMIN_URL&rdquo; to your app url to visit it. For example:</p> +<p>we have a demo <a href="https://tgirke.shinyapps.io/systemPipeShiny_loading/">https://tgirke.shinyapps.io/systemPipeShiny_loading/</a></p> +<p>to visit the admin page, then we visit <a href="https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin">https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin</a></p> +<center> +<p><img src="../admin_login.png" alt=""></p> +<p>Admin login page</p> +</center> +<p>You can use the testing account &ldquo;admin&rdquo; and password &ldquo;admin&rdquo; to login, +<span class="text-warning">but for security we strongly recommend you to change it in deployment. </span></p> +<h3 id="app-information">App information</h3> +<p>The first tab of the Admin page is current app and server information, like CPU, +RAM, size, <em>etc</em>. On this tab, under details, some real-time statistic plots +are rendered. You can interact with these plots to dig for more information.</p> +<center> +<p><img src="../admin_tab_info.png" alt=""></p> +<p>Admin page app info</p> +</center> +<h3 id="account-control">Account control</h3> +<p>Instead of changing account information from commandline, you can use this tab +to add / remove / change password/ change roles of current app accounts.</p> +<center> +<p><img src="../admin_tab_user.png" alt=""></p> +<p>Admin page user control</p> +</center> +<center> +<p><img src="../admin_newuser.png" alt=""></p> +<p>Create a new user</p> +</center> + + + + + + Sps: Debugging + /sps/adv_features/debug/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/debug/ + + + + <hr> +<p>There are some options in SPS that will give you more information and help you on +debugging. They are: <code>verbose</code> and <code>traceback</code>. You can <a href="../config">config</a> +(enable/disable) themin a SPS project&rsquo;s <code>global.R</code> file, or use +<code>spsOption(&quot;verbose&quot;, TRUE)</code> and <code>spsOption(&quot;traceback&quot;, TRUE)</code> to turn on them.</p> +<p>Some setup:</p> +<pre><code class="language-r">suppressPackageStartupMessages(library(systemPipeShiny)) app_dir &lt;- tempdir() spsInit(app_path = app_dir, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 17:46:53 Start to create a new SPS project @@ -1617,34 +1763,34 @@ spsInit(app_path = app_dir, overwrite = TRUE, change_wd = FALSE, open_files = FA ## [SPS-INFO] 2021-04-16 17:46:53 Create SPS database ## [SPS-INFO] 2021-04-16 17:46:53 Created SPS database method container ## [SPS-INFO] 2021-04-16 17:46:53 Creating SPS db... -## [SPS-DANGER] 2021-04-16 17:46:53 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. +## [SPS-DANGER] 2021-04-16 17:46:53 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 17:46:53 Key md5 fc8c85a0e87073328864bd542d740801 ## [SPS-INFO] 2021-04-16 17:46:53 SPS project setup done! -app_path &lt;- file.path(app_dir, glue::glue(&quot;SPS_{format(Sys.time(), '%Y%m%d')}&quot;)) -</code></pre> -<h2 id="verbose"><code>verbose</code></h2> -<p>In many SPS functions, there is this argument <code>verbose</code> and usually default is <code>FALSE</code>. -It means do not print extra message, keep it clean. You can set in <code>spsOption(&quot;verbose&quot;, TRUE)</code> -or inside <code>global.R</code> file to turn on. These are called global settings, and you -can use a local setting to overwrite it (<code>func(..., verbose = TRUE)</code>).</p> -<p>Let&rsquo;s use SPS main function <code>sps</code> for example, without the verbose</p> -<pre><code class="language-r">spsOption(&quot;verbose&quot;, FALSE) +app_path &lt;- file.path(app_dir, glue::glue(&quot;SPS_{format(Sys.time(), '%Y%m%d')}&quot;)) +</code></pre> +<h2 id="verbose"><code>verbose</code></h2> +<p>In many SPS functions, there is this argument <code>verbose</code> and usually default is <code>FALSE</code>. +It means do not print extra message, keep it clean. You can set in <code>spsOption(&quot;verbose&quot;, TRUE)</code> +or inside <code>global.R</code> file to turn on. These are called global settings, and you +can use a local setting to overwrite it (<code>func(..., verbose = TRUE)</code>).</p> +<p>Let&rsquo;s use SPS main function <code>sps</code> for example, without the verbose</p> +<pre><code class="language-r">spsOption(&quot;verbose&quot;, FALSE) app &lt;- sps(app_path = app_path) -## Warning: +## Warning: [SPS-WARNING] 2021-04-16 17:46:53 These plot tabs has no image path: -## 'vs_example' -## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. +## 'vs_example' +## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. ## [SPS-INFO] 2021-04-16 17:46:55 App starts ... -</code></pre> -<p>Turn on the verbose:</p> -<pre><code class="language-r">spsOption(&quot;verbose&quot;, TRUE) +</code></pre> +<p>Turn on the verbose:</p> +<pre><code class="language-r">spsOption(&quot;verbose&quot;, TRUE) app &lt;- sps(app_path = app_path) ## [SPS-INFO] 2021-04-16 17:46:55 App has 19 default configs, resolving 19 custom configs ## [SPS-INFO] 2021-04-16 17:46:55 Now check the tab info in tabs.csv -## Warning: +## Warning: [SPS-WARNING] 2021-04-16 17:46:55 These plot tabs has no image path: -## 'vs_example' -## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. +## 'vs_example' +## It is recommended to add an image. It will be used to generate gallery. Now an empty image is used for these tabs' gallery. ## [SPS-INFO] 2021-04-16 17:46:55 tab.csv info check pass ## [SPS-INFO] 2021-04-16 17:46:55 Using default tabs ## [SPS-INFO] 2021-04-16 17:46:55 check guide @@ -1660,21 +1806,21 @@ app &lt;- sps(app_path = app_path) ## [SPS-INFO] 2021-04-16 17:46:55 Add tab content to body ... ## [SPS-INFO] 2021-04-16 17:46:55 Merge header, menu, body to dashboard ... ## [SPS-INFO] 2021-04-16 17:46:55 Add overlay loading screen, admin panel. -## Merge everything to app container ... +## Merge everything to app container ... ## [SPS-INFO] 2021-04-16 17:46:55 UI created ## [SPS-INFO] 2021-04-16 17:46:55 Start to create server function ## [SPS-INFO] 2021-04-16 17:46:55 Resolve default tabs server ## [SPS-INFO] 2021-04-16 17:46:55 Load custom tabs servers ## [SPS-INFO] 2021-04-16 17:46:55 Server functions created ## [SPS-INFO] 2021-04-16 17:46:55 App starts ... -</code></pre> -<h3 id="exception">Exception</h3> -<p>There is one exception which is the <code>spsInit</code>. It is used to create a SPS project +</code></pre> +<h3 id="exception">Exception</h3> +<p>There is one exception which is the <code>spsInit</code>. It is used to create a SPS project for you, so it assumes you do not have a SPS project yet and therefore do not have -the chance to reach SPS options. So the <code>verbose</code> global setting will not work here. -You need to turn it on locally with <code>verbose = TRUE</code>.</p> -<p>Compare messages of this with the initial <code>spsInit</code> creation on top.</p> -<pre><code class="language-r">spsInit(verbose = TRUE, app_path = app_path, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) +the chance to reach SPS options. So the <code>verbose</code> global setting will not work here. +You need to turn it on locally with <code>verbose = TRUE</code>.</p> +<p>Compare messages of this with the initial <code>spsInit</code> creation on top.</p> +<pre><code class="language-r">spsInit(verbose = TRUE, app_path = app_path, overwrite = TRUE, change_wd = FALSE, open_files = FALSE) ## [SPS-INFO] 2021-04-16 17:46:55 Start to create a new SPS project ## [SPS-INFO] 2021-04-16 17:46:55 Create project under /tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416 ## [SPS-INFO] 2021-04-16 17:46:55 Now copy files @@ -1699,174 +1845,194 @@ You need to turn it on locally with <code>verbose = TRUE</code>.</p> ## [SPS-INFO] 2021-04-16 17:46:56 Db write the raw table ## [SPS-INFO] 2021-04-16 17:46:56 Key generated and stored in db ## [SPS-INFO] 2021-04-16 17:46:56 Db create admin account -## [SPS-DANGER] 2021-04-16 17:46:56 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. +## [SPS-DANGER] 2021-04-16 17:46:56 Done, Db created at '/tmp/RtmpUfKCYR/SPS_20210416/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains. ## [SPS-INFO] 2021-04-16 17:46:56 Key md5 7dca8a45de4d7260f91ddb1a02d0a6bd ## [SPS-INFO] 2021-04-16 17:46:56 SPS project setup done! -</code></pre> -<h2 id="traceback"><code>traceback</code></h2> -<p>When error happens, it will be helpful if we can know where it happened. This option +</code></pre> +<h2 id="traceback"><code>traceback</code></h2> +<p>When error happens, it will be helpful if we can know where it happened. This option will give you additional information of which function it happened, the system call -list and error file and line of code if possible.</p> -<p>This feature is enabled in two functions <code>sps</code> and <code>shinyCatch</code>.</p> -<ul> -<li><code>sps</code>: Adding tracebacks if there are some errors sourcing helper functions located -in your SPS project under the <code>R</code> folder.</li> -<li><code>shinyCatch</code>: Traceback errors of expressions inside <code>shinyCatch</code></li> -</ul> -<p>Let&rsquo;s use <code>shinyCatch</code> to demo.</p> -<p>Before adding traceback:</p> -<pre><code class="language-r">spsOption(&quot;traceback&quot;, FALSE) +list and error file and line of code if possible.</p> +<p>This feature is enabled in two functions <code>sps</code> and <code>shinyCatch</code>.</p> +<ul> +<li><code>sps</code>: Adding tracebacks if there are some errors sourcing helper functions located +in your SPS project under the <code>R</code> folder.</li> +<li><code>shinyCatch</code>: Traceback errors of expressions inside <code>shinyCatch</code></li> +</ul> +<p>Let&rsquo;s use <code>shinyCatch</code> to demo.</p> +<p>Before adding traceback:</p> +<pre><code class="language-r">spsOption(&quot;traceback&quot;, FALSE) shinyCatch({ -stop(&quot;some error message&quot;) + stop(&quot;some error message&quot;) }) -</code></pre> -<pre><code>## [SPS-ERROR] 2021-04-16 17:46:56 some error message -</code></pre> -<pre><code>## NULL -</code></pre> -<p>After</p> -<pre><code class="language-r">spsOption(&quot;traceback&quot;, TRUE) +</code></pre> +<pre><code>## [SPS-ERROR] 2021-04-16 17:46:56 some error message +</code></pre> +<pre><code>## NULL +</code></pre> +<p>After</p> +<pre><code class="language-r">spsOption(&quot;traceback&quot;, TRUE) shinyCatch({ -stop(&quot;some error message&quot;) + stop(&quot;some error message&quot;) }) -</code></pre> -<pre><code>## 1. local({ -## if (length(a &lt;- commandArgs(TRUE)) != 2) -## stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) -## x = readRDS(a[1]) -## f = x[[1]] -## if (is.character(f)) -## f = eval(parse(text = f), envir = globalenv()) -## r = do.call(f, x[[2]], envir = globalenv()) -## saveRDS(r, a[2]) -## }) -## 2. eval.parent(substitute(eval(quote(expr), envir))) -## 3. eval(expr, p) -## 4. eval(expr, p) +</code></pre> +<pre><code>## 1. local({ +## if (length(a &lt;- commandArgs(TRUE)) != 2) +## stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) +## x = readRDS(a[1]) +## f = x[[1]] +## if (is.character(f)) +## f = eval(parse(text = f), envir = globalenv()) +## r = do.call(f, x[[2]], envir = globalenv()) +## saveRDS(r, a[2]) +## }) +## 2. eval.parent(substitute(eval(quote(expr), envir))) +## 3. eval(expr, p) +## 4. eval(expr, p) ## 5. eval(quote({ -## if (length(a &lt;- commandArgs(TRUE)) != 2) stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) -## x = readRDS(a[1]) -## f = x[[1]] -## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) -## r = do.call(f, x[[2]], envir = globalenv()) -## saveRDS(r, a[2]) -## }), new.env()) +## if (length(a &lt;- commandArgs(TRUE)) != 2) stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) +## x = readRDS(a[1]) +## f = x[[1]] +## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) +## r = do.call(f, x[[2]], envir = globalenv()) +## saveRDS(r, a[2]) +## }), new.env()) ## 6. eval(quote({ -## if (length(a &lt;- commandArgs(TRUE)) != 2) stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) -## x = readRDS(a[1]) -## f = x[[1]] -## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) -## r = do.call(f, x[[2]], envir = globalenv()) -## saveRDS(r, a[2]) -## }), new.env()) -## 7. do.call(f, x[[2]], envir = globalenv()) -## 8. (function (input, output, to_md = file_ext(output) != &quot;html&quot;, quiet = TRUE) +## if (length(a &lt;- commandArgs(TRUE)) != 2) stop(&quot;The number of arguments passed to Rscript should be 2.&quot;) +## x = readRDS(a[1]) +## f = x[[1]] +## if (is.character(f)) f = eval(parse(text = f), envir = globalenv()) +## r = do.call(f, x[[2]], envir = globalenv()) +## saveRDS(r, a[2]) +## }), new.env()) +## 7. do.call(f, x[[2]], envir = globalenv()) +## 8. (function (input, output, to_md = file_ext(output) != &quot;html&quot;, quiet = TRUE) ## { -## options(htmltools.dir.version = FALSE) -## setwd(dirname(input)) -## input = basename(input) -## if (to_md) -## options(bookdown.output.markdown = TRUE) -## res = rmarkdown::render(input, &quot;blogdown::html_page&quot;, output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) -## x = read_utf8(res) -## if (to_md) -## x = process_markdown(res, x) -## unlink(res) -## x -## })(&quot;content/en/sps/adv_features/debug.Rmd&quot;, &quot;debug.md~&quot;, TRUE, TRUE) -## 9. rmarkdown::render(input, &quot;blogdown::html_page&quot;, output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) -## 10. knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet) -## 11. process_file(text, output) +## options(htmltools.dir.version = FALSE) +## setwd(dirname(input)) +## input = basename(input) +## if (to_md) +## options(bookdown.output.markdown = TRUE) +## res = rmarkdown::render(input, &quot;blogdown::html_page&quot;, output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) +## x = read_utf8(res) +## if (to_md) +## x = process_markdown(res, x) +## unlink(res) +## x +## })(&quot;content/en/sps/adv_features/debug.Rmd&quot;, &quot;debug.md~&quot;, TRUE, TRUE) +## 9. rmarkdown::render(input, &quot;blogdown::html_page&quot;, output_file = output, envir = globalenv(), quiet = quiet, run_pandoc = !to_md, clean = !to_md) +## 10. knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet) +## 11. process_file(text, output) ## 12. withCallingHandlers(if (tangle) process_tangle(group) else process_group(group), error = function(e) { -## setwd(wd) -## cat(res, sep = &quot;\n&quot;, file = output %n% &quot;&quot;) -## message(&quot;Quitting from lines &quot;, paste(current_lines(i), collapse = &quot;-&quot;), &quot; (&quot;, knit_concord$get(&quot;infile&quot;), &quot;) &quot;) -## }) -## 13. process_group(group) -## 14. process_group.block(group) -## 15. call_block(x) -## 16. block_exec(params) -## 17. in_dir(input_dir(), evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error &amp;&amp; options$include) 0 else 2, output_handler = knit_handlers(options$render, options))) -## 18. evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error &amp;&amp; options$include) 0 else 2, output_handler = knit_handlers(options$render, options)) -## 19. evaluate::evaluate(...) -## 20. evaluate_call(expr, parsed$src[[i]], envir = envir, enclos = enclos, debug = debug, last = i == length(out), use_try = stop_on_error != 2, keep_warning = keep_warning, keep_message = keep_message, output_handler = output_handler, include_timing = include_timing) -## 21. timing_fn(handle(ev &lt;- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler))) -## 22. handle(ev &lt;- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler)) -## 23. withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler) -## 24. withVisible(eval(expr, envir, enclos)) -## 25. eval(expr, envir, enclos) -## 26. eval(expr, envir, enclos) +## setwd(wd) +## cat(res, sep = &quot;\n&quot;, file = output %n% &quot;&quot;) +## message(&quot;Quitting from lines &quot;, paste(current_lines(i), collapse = &quot;-&quot;), &quot; (&quot;, knit_concord$get(&quot;infile&quot;), &quot;) &quot;) +## }) +## 13. process_group(group) +## 14. process_group.block(group) +## 15. call_block(x) +## 16. block_exec(params) +## 17. in_dir(input_dir(), evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error &amp;&amp; options$include) 0 else 2, output_handler = knit_handlers(options$render, options))) +## 18. evaluate(code, envir = env, new_device = FALSE, keep_warning = !isFALSE(options$warning), keep_message = !isFALSE(options$message), stop_on_error = if (options$error &amp;&amp; options$include) 0 else 2, output_handler = knit_handlers(options$render, options)) +## 19. evaluate::evaluate(...) +## 20. evaluate_call(expr, parsed$src[[i]], envir = envir, enclos = enclos, debug = debug, last = i == length(out), use_try = stop_on_error != 2, keep_warning = keep_warning, keep_message = keep_message, output_handler = output_handler, include_timing = include_timing) +## 21. timing_fn(handle(ev &lt;- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler))) +## 22. handle(ev &lt;- withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler)) +## 23. withCallingHandlers(withVisible(eval(expr, envir, enclos)), warning = wHandler, error = eHandler, message = mHandler) +## 24. withVisible(eval(expr, envir, enclos)) +## 25. eval(expr, envir, enclos) +## 26. eval(expr, envir, enclos) ## 27. shinyCatch({ -## stop(&quot;some error message&quot;) -## }) +## stop(&quot;some error message&quot;) +## }) ## 28. tryCatch(suppressMessages(suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())))), error = function(m) { -## toastr_actions$error(m) -## return(NULL) -## }) -## 29. tryCatchList(expr, classes, parentenv, handlers) -## 30. tryCatchOne(expr, names, parentenv, handlers[[1]]) -## 31. doTryCatch(return(expr), name, parentenv, handler) -## 32. suppressMessages(suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())))) -## 33. withCallingHandlers(expr, message = function(c) if (inherits(c, classes)) tryInvokeRestart(&quot;muffleMessage&quot;)) -## 34. suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls()))) -## 35. withCallingHandlers(expr, warning = function(w) if (inherits(w, classes)) tryInvokeRestart(&quot;muffleWarning&quot;)) -## 36. withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())) +## toastr_actions$error(m) +## return(NULL) +## }) +## 29. tryCatchList(expr, classes, parentenv, handlers) +## 30. tryCatchOne(expr, names, parentenv, handlers[[1]]) +## 31. doTryCatch(return(expr), name, parentenv, handler) +## 32. suppressMessages(suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())))) +## 33. withCallingHandlers(expr, message = function(c) if (inherits(c, classes)) tryInvokeRestart(&quot;muffleMessage&quot;)) +## 34. suppressWarnings(withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls()))) +## 35. withCallingHandlers(expr, warning = function(w) if (inherits(w, classes)) tryInvokeRestart(&quot;muffleWarning&quot;)) +## 36. withCallingHandlers(expr, message = function(m) toastr_actions$message(m), warning = function(m) toastr_actions$warning(m), error = function(m) if (trace_back) printTraceback(sys.calls())) ## [SPS-ERROR] 2021-04-16 17:46:56 some error message -</code></pre> -<pre><code>## NULL -</code></pre> -<p>Or use local setting to overwrite the global, even we have <code>spsOption(&quot;traceback&quot;, TRUE)</code>, -but traceback is still muted by <code> trace_back = FALSE</code>.</p> -<pre><code class="language-r">spsOption(&quot;traceback&quot;, TRUE) +</code></pre> +<pre><code>## NULL +</code></pre> +<p>Or use local setting to overwrite the global, even we have <code>spsOption(&quot;traceback&quot;, TRUE)</code>, +but traceback is still muted by <code> trace_back = FALSE</code>.</p> +<pre><code class="language-r">spsOption(&quot;traceback&quot;, TRUE) shinyCatch({ -stop(&quot;some error message&quot;) + stop(&quot;some error message&quot;) }, trace_back = FALSE) -</code></pre> -<pre><code>## [SPS-ERROR] 2021-04-16 17:46:56 some error message -</code></pre> -<pre><code>## NULL -</code></pre> -<h3 id="traceback-with-file-and-line-number">Traceback with file and line number</h3> -<p>Let&rsquo;s write an R file with functions, source it and then call the function from -this file. Try it on your own computer:</p> -<pre><code class="language-r">temp_file &lt;- tempfile(fileext = &quot;.R&quot;) +</code></pre> +<pre><code>## [SPS-ERROR] 2021-04-16 17:46:56 some error message +</code></pre> +<pre><code>## NULL +</code></pre> +<h3 id="traceback-with-file-and-line-number">Traceback with file and line number</h3> +<p>Let&rsquo;s write an R file with functions, source it and then call the function from +this file. Try it on your own computer:</p> +<pre><code class="language-r">temp_file &lt;- tempfile(fileext = &quot;.R&quot;) writeLines( -&quot;myFunc &lt;- function(){ -myFunc2() -} -myFunc2 &lt;- function(){ -stop('some error message') -} -&quot;, -temp_file + &quot;myFunc &lt;- function(){ + myFunc2() + } + myFunc2 &lt;- function(){ + stop('some error message') + } + &quot;, + temp_file ) source(temp_file) + shinyCatch({ -myFunc() + myFunc() }) -</code></pre> -<p><img src="../shinycatch_traceback.png" alt=""></p> -<p>You can see the error happened in <code>myFunc</code> line No. 2 and then inside this function -it calls another function <code>myFunc2</code> which caused the final error. In <code>myFunc2</code> -it is also the line No. 2 caused the issue and error is coming from <code>/tmp/...</code> file.</p> -<h2 id="other-shiny-built-in-options">other Shiny built-in options</h2> -<p>There are some Shiny options can also be helpful on debugging:</p> -<pre><code class="language-r"># developer mode, use ?devmode to see details +</code></pre> +<p><img src="../shinycatch_traceback.png" alt=""></p> +<p>You can see the error happened in <code>myFunc</code> line No. 2 and then inside this function +it calls another function <code>myFunc2</code> which caused the final error. In <code>myFunc2</code> +it is also the line No. 2 caused the issue and error is coming from <code>/tmp/...</code> file.</p> +<h2 id="other-shiny-built-in-options">other Shiny built-in options</h2> +<p>There are some Shiny options can also be helpful on debugging:</p> +<pre><code class="language-r"># developer mode, use ?devmode to see details devmode(TRUE) # inspect reactivity in shiny options(shiny.reactlog = TRUE) -# similar to SPS's traceback but on the whole app level +# similar to SPS's traceback but on the whole app level options(shiny.fullstacktrace = TRUE) # open the `browser` debug mode on error options(shiny.error = browser) # when a shiny app file saves, reload the app, not working with modular apps like SPS at this moment options(shiny.autoreload = TRUE) -</code></pre> -<p>See <a href="https://shiny.rstudio.com/reference/shiny/0.14/shiny-options.html">Shiny option website{blk}</a> -for more details</p>Sps: Other customizations/sps/adv_features/other_customizations/Mon, 01 Jan 0001 00:00:00 +0000/sps/adv_features/other_customizations/ -<hr> -<h2 id="title-and-logo">Title and logo</h2> -<p>The default for title is &ldquo;systemPipeShiny&rdquo; and default logo is the &ldquo;img/sps_small.png&rdquo; -which is a relative path of the <code>www</code> folder in your SPS project. You can change -them in <a href="../config">SPS options</a>. The affected places are:</p> -<p><img src="../custom_title.png" alt=""></p> \ No newline at end of file +</code></pre> +<p>See <a href="https://shiny.rstudio.com/reference/shiny/0.14/shiny-options.html">Shiny option website{blk}</a> +for more details</p> + + + + + + Sps: Other customizations + /sps/adv_features/other_customizations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/adv_features/other_customizations/ + + + + <hr> +<h2 id="title-and-logo">Title and logo</h2> +<p>The default for title is &ldquo;systemPipeShiny&rdquo; and default logo is the &ldquo;img/sps_small.png&rdquo; +which is a relative path of the <code>www</code> folder in your SPS project. You can change +them in <a href="../config">SPS options</a>. The affected places are:</p> +<p><img src="../custom_title.png" alt=""></p> + + + + + + diff --git a/public/sps/adv_features/login/index.html b/public/sps/adv_features/login/index.html index a7f9d1345..67e32a2e1 100644 --- a/public/sps/adv_features/login/index.html +++ b/public/sps/adv_features/login/index.html @@ -1,76 +1,1098 @@ -Accounts, Login and Admin | sysPipe + + + + + + + + + + + + + + + + + +Accounts, Login and Admin | sysPipe + + + + + + + + + + + + + + +

    Accounts, Login and Admin


    SPS accounts

    After a SPS project is initialized, some default accounts has been set up. They -will not become useful unless you enable the login and admin features.

    There are 2 default accounts created for you to test before deploy:

    namerolepassword
    adminadminadmin
    useruseruser

    The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login.

    Please change these accounts before deployment.

    Account management

    You can manage accounts in two ways: commandline and admin page. Here is how you -manage from commandline, read how to do it from admin page below.

    There are some helper code inside global.R file under your SPS project root.

    ##  account information
    +   name role password     admin admin admin   user user user    The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login."/>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  
    +  
    +    
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Accounts, Login and Admin

    + + +
    +

    SPS accounts

    +

    After a SPS project is initialized, some default accounts has been set up. They +will not become useful unless you enable the login and admin features.

    +

    There are 2 default accounts created for you to test before deploy:

    + + + + + + + + + + + + + + + + + + + + +
    namerolepassword
    adminadminadmin
    useruseruser
    +

    The admin account can be used in both the main app login and admin page login, and the user account can only be used for main app login.

    +

    Please change these accounts before deployment.

    +

    Account management

    +

    You can manage accounts in two ways: commandline and admin page. Here is how you +manage from commandline, read how to do it from admin page below.

    +

    There are some helper code inside global.R file under your SPS project root.

    +
    ##  account information
     ## PLEASE use following to add your own accounts and remove the default accounts for deployment
     # mydb <- spsAccount$new()
     # mydb$accList()
     # mydb$accAdd(acc_name = "XXX", acc_pass = "$xxxx", role = "admin")
     # mydb$accRemove("admin")
     # mydb$accRemove("user")
    -

    You can uncomment these lines to practice how to manage accounts, or read the reference manual about spsAccount class.

    First to create a SPS project

    suppressPackageStartupMessages(library(systemPipeShiny))
    -
    app_path <- "."
    +
    +

    You can uncomment these lines to practice how to manage accounts, or read the reference manual about spsAccount class.

    +

    First to create a SPS project

    +
    suppressPackageStartupMessages(library(systemPipeShiny))
    +
    +
    app_path <- "."
     spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE)
    -
    ## [SPS-INFO] 2021-04-16 16:25:15 Start to create a new SPS project
    +
    +
    ## [SPS-INFO] 2021-04-16 16:25:15 Start to create a new SPS project
     ## [SPS-INFO] 2021-04-16 16:25:15 Create project under /tmp/RtmpMoNp2X/SPS_20210416
     ## [SPS-INFO] 2021-04-16 16:25:15 Now copy files
     ## [SPS-INFO] 2021-04-16 16:25:15 Create SPS database
    @@ -79,74 +1101,244 @@
     ## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at '/tmp/RtmpMoNp2X/SPS_20210416/config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 db686a4f203edbdd0fe4c2a1642492d2
     ## [SPS-INFO] 2021-04-16 16:25:15 SPS project setup done!
    -

    Create a spsAccount object. SPS accounts are stored in the config/sps.db database inside your SPS projects.

    acc <- spsAccount$new()
    +
    +

    Create a spsAccount object. SPS accounts are stored in the config/sps.db database inside your SPS projects.

    +
    acc <- spsAccount$new()
     ## [SPS-INFO] 2021-04-16 16:25:15 Created SPS account method container
     ## [SPS-INFO] 2021-04-16 16:25:15 Default SPS-db found and is working
    -
    ## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db...
    -
    ## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains.
    +
    +
    ## [SPS-INFO] 2021-04-16 16:25:15 Creating SPS db...
    +
    +
    ## [SPS-DANGER] 2021-04-16 16:25:15 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-16 16:25:15 Key md5 127f00770c4ed318c48fe92cd67bf783
    -

    See what accounts you have

    acc$accList()
    -
    ##   account  role
    +
    +

    See what accounts you have

    +
    acc$accList()
    +
    +
    ##   account  role
     ## 1   admin admin
     ## 2    user  user
    -

    You can also listed passwords. They are SHA256 encrypted.

    tibble::as_tibble(acc$accList(include_pass = TRUE))
    +
    +

    You can also listed passwords. They are SHA256 encrypted.

    +
    tibble::as_tibble(acc$accList(include_pass = TRUE))
     ## # A tibble: 2 x 3
     ##   account pass                                                             role 
     ##   <chr>   <chr>                                                            <chr>
     ## 1 admin   0b1460498bf1b50e05cc07e53c7856fc23ecd3fc2bc404d52dbf3aae743f8a9a admin
     ## 2 user    796be5ca7dafddf5e1e7c032fc71386fe16274f63b6068bb2b064d4c9876eaae user
    -

    See SPS database for encryption key details.

    Add a new user

    acc$accAdd(acc_name = 'user2', acc_pass = '!newuser12345', role = "user")
    +
    +

    See SPS database for encryption key details.

    +

    Add a new user

    +
    acc$accAdd(acc_name = 'user2', acc_pass = '!newuser12345', role = "user")
     ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 created.
    -

    Change the role of user2 from “user” to “admin”

    acc$accRoleChange(acc_name = "user2", role = "admin")
    +
    +

    Change the role of user2 from “user” to “admin”

    +
    acc$accRoleChange(acc_name = "user2", role = "admin")
     ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows
     ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 role changed.
    -

    Remove a user

    acc$accRemove("user2")
    +
    +

    Remove a user

    +
    acc$accRemove("user2")
     ## [SPS-INFO] 2021-04-16 16:25:15 Deleted 1 rows
     ## [SPS-INFO] 2021-04-16 16:25:15 Account user2 removed
     acc$accList()
     ##   account  role
     ## 1   admin admin
     ## 2    user  user
    -

    Change password

    acc$accPassChange(acc_name = "user", , acc_pass = '!newuser54321')
    +
    +

    Change password

    +
    acc$accPassChange(acc_name = "user", , acc_pass = '!newuser54321')
     ## [SPS-INFO] 2021-04-16 16:25:15 Updated 1 rows
     ## [SPS-INFO] 2021-04-16 16:25:15 Account user password created.
    -

    Validate password

    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321')
    -
    ## [1] TRUE
    -
    acc$accMatch(acc_name = "user", acc_pass = "user")
    -
    ## [1] FALSE
    -
    acc$accMatch(acc_name = "abc", acc_pass = "123")
    -
    ## [1] FALSE
    -

    Validate password + role

    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321', match_role = TRUE, role = "user")
    -
    ## [1] TRUE
    -
    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321', match_role = TRUE, role = "admin")
    -
    ## [1] FALSE
    -

    Main app login

    After the account has been set up properly, one can try to turn on the login page for the main app. Use spsOption("login_screen", TRUE) or set login_screen = TRUE in global.R file.

    Whether enabling the login screen is fundamentally different how the Shiny app -loads the UI and server code.

    • Disabled: loads UI and server on app start
    • Enabled: loads login UI and server on start, loads main app UI and server code only when login is successful.

    One advantage of using the login is the app starting time is fast. On app start, +

    +

    Validate password

    +
    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321')
    +
    +
    ## [1] TRUE
    +
    +
    acc$accMatch(acc_name = "user", acc_pass = "user")
    +
    +
    ## [1] FALSE
    +
    +
    acc$accMatch(acc_name = "abc", acc_pass = "123")
    +
    +
    ## [1] FALSE
    +
    +

    Validate password + role

    +
    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321', match_role = TRUE, role = "user")
    +
    +
    ## [1] TRUE
    +
    +
    acc$accMatch(acc_name = "user", acc_pass = '!newuser54321', match_role = TRUE, role = "admin")
    +
    +
    ## [1] FALSE
    +
    +

    Main app login

    +

    After the account has been set up properly, one can try to turn on the login page for the main app. Use spsOption("login_screen", TRUE) or set login_screen = TRUE in global.R file.

    +

    Whether enabling the login screen is fundamentally different how the Shiny app +loads the UI and server code.

    +
      +
    • Disabled: loads UI and server on app start
    • +
    • Enabled: loads login UI and server on start, loads main app UI and server code only when login is successful.
    • +
    +

    One advantage of using the login is the app starting time is fast. On app start, it only loads the login logic so it saves some time. The heavy part is the main app logic which will be loaded after a successful login. So the overall loading time is about the same. The difference is at what time point to load main app. Of course, if the user fails to login, main app will never be loaded. This can save some resources to -handle unauthorized requests.

    This difference may cause some javascript not working -if you are loading your custom tabs with custom javascript. Set a wait signal in -your javascript or report an issue to us if you have troubles.


    The login screen is also controlled by another setting login_theme. +handle unauthorized requests.

    +

    This difference may cause some javascript not working +if you are loading your custom tabs with custom javascript. Set a wait signal in +your javascript or report an issue to us if you have troubles.

    +
    +

    The login screen is also controlled by another setting login_theme. By default, if you turn on the “login_screen”, app will show you a random loading -theme (login_theme = "random") before you see the login panel. You can interact +theme (login_theme = "random") before you see the login panel. You can interact with these themes or change to play with a different theme. Or you can specify your favorate from “vhelix” (DNA double helix), “hhelix” (DNA flow), or “biomatrix” -(DNA Matrix).


    If you are not a fan of these themes, you can use login_theme = "empty" to directly -go to login panel.

    Admin page

    SPS Admin page is panel of tabs to help app managers administrate the app. Under +(DNA Matrix).

    +

    +
    +

    If you are not a fan of these themes, you can use login_theme = "empty" to directly +go to login panel.

    +
    +

    +
    +

    Admin page

    +

    SPS Admin page is panel of tabs to help app managers administrate the app. Under current version, SPS provides 2 main features: app information/statistics and -account control.

    Admin login

    To reach the Admin page, users first need to enable this feature (default is TRUE) -in SPS options admin_page use either spsOption("admin_page", TRUE) or set it +account control.

    +

    Admin login

    +

    To reach the Admin page, users first need to enable this feature (default is TRUE) +in SPS options admin_page use either spsOption("admin_page", TRUE) or set it in global.R. Afterwards, users need type in the correct url to find the page. -This can be set with the SPS option admin_url. Default is “admin”, admin_url = "admin", -but for security we recommend you to change it in deployment.

    To access it, add “?” + “YOUR_ADMIN_URL” to your app url to visit it. For example:

    we have a demo https://tgirke.shinyapps.io/systemPipeShiny_loading/

    to visit the admin page, then we visit https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin

    Admin login page

    You can use the testing account “admin” and password “admin” to login, -but for security we strongly recommend you to change it in deployment.

    App information

    The first tab of the Admin page is current app and server information, like CPU, +This can be set with the SPS option admin_url. Default is “admin”, admin_url = "admin", +but for security we recommend you to change it in deployment.

    +

    To access it, add “?” + “YOUR_ADMIN_URL” to your app url to visit it. For example:

    +

    we have a demo https://tgirke.shinyapps.io/systemPipeShiny_loading/

    +

    to visit the admin page, then we visit https://tgirke.shinyapps.io/systemPipeShiny_loading/?admin

    +
    +

    +

    Admin login page

    +
    +

    You can use the testing account “admin” and password “admin” to login, +but for security we strongly recommend you to change it in deployment.

    +

    App information

    +

    The first tab of the Admin page is current app and server information, like CPU, RAM, size, etc. On this tab, under details, some real-time statistic plots -are rendered. You can interact with these plots to dig for more information.

    Admin page app info

    Account control

    Instead of changing account information from commandline, you can use this tab -to add / remove / change password/ change roles of current app accounts.

    Admin page user control

    Create a new user

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/notification/index.html b/public/sps/adv_features/notification/index.html index 7163f49d4..4bc2ad0b2 100644 --- a/public/sps/adv_features/notification/index.html +++ b/public/sps/adv_features/notification/index.html @@ -1,80 +1,1093 @@ -Notification system | sysPipe + + + + + + + + + + + + + + + + + +Notification system | sysPipe + + + + + + + + + + + + + + +

    Notification system


    SPS notification system

    In SPS, there is a notification dropdown where developers can broadcast new messages -to users. The dropdown is located on the top-right corner.

    Notification Dropdown


    When a notification item is clicked, details of the notification will be displayed -in a modal.

    Notification Detail Moadal

    Official notification

    If you only use the original SPS, we will send out new notifications every time + Notification Detail Moadal Official notification If you only use the original SPS, we will send out new notifications every time we update the package or other important things that we want to inform you."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    Notification system

    + + +
    +

    SPS notification system

    +

    In SPS, there is a notification dropdown where developers can broadcast new messages +to users. The dropdown is located on the top-right corner.

    +
    +

    +Notification Dropdown +
    +


    When a notification item is clicked, details of the notification will be displayed +in a modal.

    +
    +

    +Notification Detail Moadal +
    +

    Official notification

    +

    If you only use the original SPS, we will send out new notifications every time we update the package or other important things that we want to inform you. You should see the icon of the dropdown becomes. -+ the message number. If there is no -message or you have clicked the dropdown, it will become + 0.

    Custom notification

    If you do not want to receive the official notification or want to write your -own note to your users, first let us understand how it works.

    Mechanism

    Every time when you run the sps() main function, it will look for a remote URL -that stores the notification information in yaml{blk} format. + + the message number. If there is no +message or you have clicked the dropdown, it will become + 0.

    +

    Custom notification

    +

    If you do not want to receive the official notification or want to write your +own note to your users, first let us understand how it works.

    +

    Mechanism

    +

    Every time when you run the sps() main function, it will look for a remote URL +that stores the notification information in yaml{blk} format. If this file can be successfully parsed, you will see the notification dropdown menu -on SPS UI, otherwise no dropdown displayed.

    To define your own notification URL, you need to change the option note_url in -the global.R file. Read more about changing SPS options. +on SPS UI, otherwise no dropdown displayed.

    +

    To define your own notification URL, you need to change the option note_url in +the global.R file. Read more about changing SPS options. The default value is a file on Github, which also can be used as your template to write custom -notification messages:

    https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml{blk}

    Notification template

    If you download the link above, you should see something like this:

    ############ Create remote messages to notify users in the app #################
    +notification messages:

    +

    https://raw.githubusercontent.com/systemPipeR/systemPipeShiny/master/inst/remote_resource/notifications.yaml{blk}

    +

    Notification template

    +

    If you download the link above, you should see something like this:

    +
    ############ Create remote messages to notify users in the app #################
     ## When app starts, it will first try to load this file from online.
     ## You should place this file somewhere publically reachable online, like Github.
     ## This file should not be included in your app deployment.
    @@ -109,18 +1122,126 @@
                Github, do not inlcude this file in app deployment.
             3. During app deployment, indicate the URL of this file in `global.R`
                file, `note_url:` option.
    -

    Template details

    Most entries are easy-to-understand. Here are some key points.

    Indentation

    Indentation is very important in a yaml file. In the template, we use 4 spaces -as 1 level of indentation.

    Notification start and end

    Always start with a - note: to define a notification item. After you finish typing -the message body, leave at least one line blank before starting another notification.

    type

    general: Use this type to create a general notification. It will ignore pkg_name -and version information.

    package: A notification that is related to a package updates. This type of note will first -check if the user has installed the package (single one) with a version that is +

    +

    Template details

    +

    Most entries are easy-to-understand. Here are some key points.

    +

    Indentation

    +

    Indentation is very important in a yaml file. In the template, we use 4 spaces +as 1 level of indentation.

    +

    Notification start and end

    +

    Always start with a - note: to define a notification item. After you finish typing +the message body, leave at least one line blank before starting another notification.

    +

    type

    +

    general: Use this type to create a general notification. It will ignore pkg_name +and version information.

    +

    package: A notification that is related to a package updates. This type of note will first +check if the user has installed the package (single one) with a version that is higher than the specified version number in pkg_name and version entries. If so, the notification will not be displayed. -If not the user will see the notification before expiration date.

    expire

    The expire decides how long to show users the notification. If current date has -passed the date in expire, the notification will not be displayed.

    Message body

    Use | to start a new line and put the markdown format text body -in the next indentation level.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/other_customizations/index.html b/public/sps/adv_features/other_customizations/index.html index 7f1cdf69e..1d6f51123 100644 --- a/public/sps/adv_features/other_customizations/index.html +++ b/public/sps/adv_features/other_customizations/index.html @@ -1,62 +1,1125 @@ -Other customizations | sysPipe

    Other customizations


    The default for title is “systemPipeShiny” and default logo is the “img/sps_small.png” + + + + + + + + + + + + + + + + + + + +Other customizations | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + +
    +
    + + + + + + +
    +

    Other customizations

    + + +
    + +

    The default for title is “systemPipeShiny” and default logo is the “img/sps_small.png” which is a relative path of the www folder in your SPS project. You can change -them in SPS options. The affected places are:

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/overwritetabs/index.html b/public/sps/adv_features/overwritetabs/index.html index 5fd0dabb9..e49da3cd8 100644 --- a/public/sps/adv_features/overwritetabs/index.html +++ b/public/sps/adv_features/overwritetabs/index.html @@ -1,75 +1,1055 @@ -Overwrite tabs | sysPipe + + + + + + + + + + + + + + + + + +Overwrite tabs | sysPipe + + + + + + + + + + + + + + +

    Overwrite tabs


    As a framework, default SPS tabs like the welcome tab, the module main tab, -the visualization main tab, the Canvas tab and the About tab can be user-defined.

    Default UI and tabs you can overwrite

    Overwrite SPS default tabs

    To start create a SPS project:

    suppressPackageStartupMessages(library(systemPipeShiny))
    -
    app_path <- "."
    +suppressPackageStartupMessages(library(systemPipeShiny))  app_path <- "." spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE)  ## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps."/>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  
    +  
    +    
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + +
    +
    + + + + + + +
    +

    Overwrite tabs

    + + +
    +

    As a framework, default SPS tabs like the welcome tab, the module main tab, +the visualization main tab, the Canvas tab and the About tab can be user-defined.

    +
    +

    +Default UI and tabs you can overwrite +
    +

    Overwrite SPS default tabs

    +

    To start create a SPS project:

    +
    suppressPackageStartupMessages(library(systemPipeShiny))
    +
    +
    app_path <- "."
     spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE)
    -
    ## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps.db'. DO NOT share this file with others or upload to open access domains.
    +
    +
    ## [SPS-DANGER] 2021-04-22 15:45:11 Done, Db created at '/tmp/Rtmp2YLDmY/overwrite/config/sps.db'. DO NOT share this file with others or upload to open access domains.
     ## [SPS-INFO] 2021-04-22 15:45:11 Key md5 6886f6bf17229ffb646102abad92fa31
     ## [SPS-INFO] 2021-04-22 15:45:11 SPS project setup done!
    -

    use the function spsCoreTabReplace to create a template of which tab you would +

    +

    use the function spsCoreTabReplace to create a template of which tab you would like to overwrite. Here we use the “Welcome” tab as example to demo how to write -your own welcome tab.

    spsCoreTabReplace(replace_tab = "welcome")
    -
    ## [SUCCESS] 2021-04-22 15:45:11 File /tmp/Rtmp2YLDmY/overwrite/R/tab_core_welcome.R created
    -

    If you are using Rstudio the template will be opened for you like following:

    ########################## Overwrite the welcome tab ###########################
    +your own welcome tab.

    +
    spsCoreTabReplace(replace_tab = "welcome")
    +
    +
    ## [SUCCESS] 2021-04-22 15:45:11 File /tmp/Rtmp2YLDmY/overwrite/R/tab_core_welcome.R created
    +
    +

    If you are using Rstudio the template will be opened for you like following:

    +
    ########################## Overwrite the welcome tab ###########################
     ## UI
     core_welcomeUI <- function(id){
         ns <- NS(id)
    @@ -86,8 +1066,10 @@
         }
         moduleServer(id, module)
     }
    -

    Then you can write your own UI and server for this tab, for example, we can add -some UI to the tab:

    core_welcomeUI <- function(id){
    +
    +

    Then you can write your own UI and server for this tab, for example, we can add +some UI to the tab:

    +
    core_welcomeUI <- function(id){
         ns <- NS(id)
         tagList(
             # add your UI code below
    @@ -96,9 +1078,109 @@
             sliderInput(ns("num"), "Select a number", 0, 10, 5)
         )
     }
    -

    When you restart the app, you should see your custom Welcome tab:

    Custom Welcome tab UI
    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/adv_features/tabs/index.html b/public/sps/adv_features/tabs/index.html index 1c2220aa1..5c860fae3 100644 --- a/public/sps/adv_features/tabs/index.html +++ b/public/sps/adv_features/tabs/index.html @@ -1,68 +1,1062 @@ -Manage tabs | sysPipe + + + + + + + + + + + + + + + + + +Manage tabs | sysPipe + + + + + + + + + + + + + + +

    Manage tabs


    SPS tabs

    In SPS, tab is the basic component of a functionality unit. For example, all the Modules -in SPS are complex tabs with many small sub-tabs, the Canvas is another independent tab providing -image editing features and an user custom tab is also a SPS tab.

    From the developer’s view, all SPS tabs are Shiny Modules{blk}.

    To understand how SPS tabs work, we will demonstrate with a SPS project. For demo purpose, we are using the -/tmp folder but one should use a regular location instead of the temp in a real -case.

    suppressPackageStartupMessages(library(systemPipeShiny))
    +To understand how SPS tabs work, we will demonstrate with a SPS project."/>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  
    +  
    +    
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Manage tabs

    + + +
    +

    SPS tabs

    +

    In SPS, tab is the basic component of a functionality unit. For example, all the Modules +in SPS are complex tabs with many small sub-tabs, the Canvas is another independent tab providing +image editing features and an user custom tab is also a SPS tab.

    +

    From the developer’s view, all SPS tabs are Shiny Modules{blk}.

    +

    To understand how SPS tabs work, we will demonstrate with a SPS project. For demo purpose, we are using the +/tmp folder but one should use a regular location instead of the temp in a real +case.

    +
    suppressPackageStartupMessages(library(systemPipeShiny))
     spsInit(app_path = tempdir(), project_name = "tab_demo", overwrite = TRUE, change_wd = FALSE)
     ## [SPS-INFO] 2021-04-19 23:16:52 Start to create a new SPS project
     ## [SPS-INFO] 2021-04-19 23:16:52 Create project under /tmp/RtmpjAYUc0/tab_demo
    @@ -76,13 +1070,19 @@
     ## save project path 
     (sps_dir <- file.path(tempdir(), "tab_demo"))
     ## [1] "/tmp/RtmpjAYUc0/tab_demo"
    -

    To reproduce code locally, run the following chunk instead.

    library(systemPipeShiny)
    +
    +

    To reproduce code locally, run the following chunk instead.

    +
    library(systemPipeShiny)
     spsInit()
     sps_dir <- normalizePath(".")
    -

    Tab registration

    In SPS, all tabs are controlled by the config/tabs.csv file. To see what kind of +

    +

    Tab registration

    +

    In SPS, all tabs are controlled by the config/tabs.csv file. To see what kind of tabs you have with current project. use the spsTabInfo function. It returns a tibble -of current tab information.

    spsTabInfo(app_path = sps_dir)
    -
    ## # A tibble: 11 x 8
    +of current tab information.

    +
    spsTabInfo(app_path = sps_dir)
    +
    +
    ## # A tibble: 11 x 8
     ##    tab_id   display_label    type  type_sub image displayed tab_file_name plugin
     ##    <chr>    <chr>            <chr> <chr>    <chr> <chr>     <chr>         <chr> 
     ##  1 core_ab… About this App   core  ""       ""    1         No file for … "core"
    @@ -96,29 +1096,72 @@
     ##  9 vs_esq   Quick ggplot mo… modu… ""       ""    1         No file for … "core"
     ## 10 vs_main  custom tabs mai… core  ""       ""    1         No file for … "core"
     ## 11 vs_exam… My custom plott… vs    "plot"   ""    1         tab_vs_examp… ""
    -
    • tab_id: A unique string ID
    • display_label: for type is “core” or “module”, this is only some description, but for you own custom tabs, -this value will be used as a display tab name on left sidebar on SPS UI.
    • type: tab category, “core”, “module” and “vs” (visualization).
    • type_sub: more specific category, current only “plot” (plotting)
    • image: If this is an user custom tab, providing an image path will display the image in +
    +
      +
    • tab_id: A unique string ID
    • +
    • display_label: for type is “core” or “module”, this is only some description, but for you own custom tabs, +this value will be used as a display tab name on left sidebar on SPS UI.
    • +
    • type: tab category, “core”, “module” and “vs” (visualization).
    • +
    • type_sub: more specific category, current only “plot” (plotting)
    • +
    • image: If this is an user custom tab, providing an image path will display the image in visualization main tab gallery. If it not provided, a warning will be given on app -starts and an “No image” image will be used like the following:

    vs_main

    • displayed: Internal use only
    • tab_file_name: where the tab file is relative to the R folder.
    • plugin: Internal use only

    Add a new custom tab

    SPS provides templates to help developers to create a small SPS tab that

    1. The main purpose is to generate some plots
    2. can be loaded into SPS framework easily
    3. can interact with other SPS tabs (components), like the Canvas tab.

    When you initiate a SPS project, an example custom tab is created for you already. +starts and an “No image” image will be used like the following: + +

    vs_main

    +
      +
    • displayed: Internal use only
    • +
    • tab_file_name: where the tab file is relative to the R folder.
    • +
    • plugin: Internal use only
    • +
    +

    Add a new custom tab

    +

    SPS provides templates to help developers to create a small SPS tab that

    +
      +
    1. The main purpose is to generate some plots
    2. +
    3. can be loaded into SPS framework easily
    4. +
    5. can interact with other SPS tabs (components), like the Canvas tab.
    6. +
    +

    When you initiate a SPS project, an example custom tab is created for you already. You can find the tab file inside the R folder of the project root. When you start the app for the first time, you can easily find it from the left sidebar, or -click on the “Custom tabs” to go to custom tab main tab.

    Example custom tab

    Simple template

    Under current SPS version, users are able to add custom tabs with the spsNewTab function. -This function:

    1. creates the tab file.
    2. provides a nice template.
    3. Helps you to register tab information to tabs.csv
    spsNewTab(tab_id = "vs_new", tab_displayname = "New tab demo", app_path = sps_dir)
    +click on the “Custom tabs” to go to custom tab main tab.

    +
    +

    +Example custom tab +
    +

    Simple template

    +

    Under current SPS version, users are able to add custom tabs with the spsNewTab function. +This function:

    +
      +
    1. creates the tab file.
    2. +
    3. provides a nice template.
    4. +
    5. Helps you to register tab information to tabs.csv
    6. +
    +
    spsNewTab(tab_id = "vs_new", tab_displayname = "New tab demo", app_path = sps_dir)
     ## [SPS-INFO] 2021-04-19 23:16:52 Write to file /tmp/RtmpjAYUc0/tab_demo/R/tab_vs_new.R
     ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv
     ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created!
     ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c("vs_new")`
    -

    If you are running the code locally, and are using Rstudio, the tab file will be opened -automatically for you.

    In your global.R, add the new tab to confirm you want to load it, and then restart -you app. Scroll down to the bottom, you should see:

    # add "vs_new" in `tabs`
    +
    +

    If you are running the code locally, and are using Rstudio, the tab file will be opened +automatically for you.

    +

    In your global.R, add the new tab to confirm you want to load it, and then restart +you app. Scroll down to the bottom, you should see:

    +
    # add "vs_new" in `tabs`
     sps_app <- sps(
         tabs = c("vs_example", "vs_new"),
         server_expr = {
             msg("Custom expression runs -- Hello World", "GREETING", "green")
         }
     )
    -

    Load new custom tabs

    By default, it uses the simple template, which contains the spsEzUI and spsEzServer functions. -We have provided commented instructions on how to fill each argument.

    UI

    spsEzUI(
    +
    +
    +

    +Load new custom tabs +
    +

    By default, it uses the simple template, which contains the spsEzUI and spsEzServer functions. +We have provided commented instructions on how to fill each argument.

    +

    UI

    +
    spsEzUI(
       desc = "xxx",
       tab_title = "xxx",
       plot_title = "xxx",
    @@ -126,10 +1169,13 @@
         xxx
       )
     )
    -

    The only augment new users need to take some time to learn is adding plot_control. +

    +

    The only augment new users need to take some time to learn is adding plot_control. Developers need to add some Shiny UI components to let users control how the plotting is done with interactive options. Basic use can be learned in 5 minutes on -Shiny website{blk} and Shiny book{blk}

    Server

    spsEzServer(
    +Shiny website{blk} and Shiny book{blk}

    +

    Server

    +
    spsEzServer(
         plot_code = {
             # data passed from data loading is a reactiveValues object, data stored in `mydata$data`
             plot_data <- mydata$data
    @@ -153,16 +1199,21 @@
         },
         other_server_code = {}
     )
    -

    For the server code, users only need to focus on the plotting code. The only very important thing +

    +

    For the server code, users only need to focus on the plotting code. The only very important thing developers need to remember is that the plotting data been passed to this function -is stored in a reactiveValues{blk} +is stored in a reactiveValues{blk} object and it is called mydata$data. Usually we assign it to a new value so it can -be used easily downstream, like plot_data <- mydata$data.

    Some validation is recommended before reaching the plotting code. You would never know what +be used easily downstream, like plot_data <- mydata$data.

    +

    Some validation is recommended before reaching the plotting code. You would never know what kind of dataset users upload. It is always good to check if users' uploads meet the -requirements. In SPS you can use the spsValidate function or use Shiny’s default validate{blk} -function (spsValidate is discussed in developer tools).

    Full template

    For some developers who already has experience with Shiny, and would like to make more +requirements. In SPS you can use the spsValidate function or use Shiny’s default validate{blk} +function (spsValidate is discussed in developer tools).

    +

    Full template

    +

    For some developers who already has experience with Shiny, and would like to make more complex customization, using the full template enables you to change every detail on -the new tab. Simply add the template = "full" argument.

    spsNewTab(
    +the new tab. Simply add the template = "full" argument.

    +
    spsNewTab(
       tab_id = "vs_new_full", 
       tab_displayname = "New tab demo",
       template = "full",
    @@ -171,29 +1222,135 @@
     ## [SPS-INFO] 2021-04-19 23:16:52 Now register your new tab to config/tab.csv
     ## [SPS-SUCCESS] 2021-04-19 23:16:52 New tab created!
     ## [SPS] 2021-04-19 23:16:52 To load this new tab: `sps(tabs = c("vs_new_full")`
    -

    You can see the full template is a lot longer than the simple template:

    simple_len <- R.utils::countLines(file.path(sps_dir, "R", "tab_vs_new.R"))
    +
    +

    You can see the full template is a lot longer than the simple template:

    +
    simple_len <- R.utils::countLines(file.path(sps_dir, "R", "tab_vs_new.R"))
     full_len <- R.utils::countLines(file.path(sps_dir, "R", "tab_vs_new_full.R"))
     spsinfo(glue::glue("Simple template has {simple_len} lines"), TRUE)
    -
    ## [SPS-INFO] 2021-04-19 23:16:52 Simple template has 66 lines
    -
    spsinfo(glue::glue("Full template has {full_len} lines"), TRUE)
    -
    ## [SPS-INFO] 2021-04-19 23:16:52 Full template has 281 lines
    -

    Tab registeration

    In your global.R, scroll down to the bottom, you should see:

    sps_app <- sps(
    +
    +
    ## [SPS-INFO] 2021-04-19 23:16:52 Simple template has 66 lines
    +
    +
    spsinfo(glue::glue("Full template has {full_len} lines"), TRUE)
    +
    +
    ## [SPS-INFO] 2021-04-19 23:16:52 Full template has 281 lines
    +
    +

    Tab registeration

    +

    In your global.R, scroll down to the bottom, you should see:

    +
    sps_app <- sps(
         tabs = c("vs_example"),
         server_expr = {
             msg("Custom expression runs -- Hello World", "GREETING", "green")
         }
     )
    -

    This is the SPS main function. You can load/unload custom tabs by providing tab IDs in tabs argument, like -c("tab1", "tab2). Open config/tabs.csv or use spsTabInfo() to see what tabs IDs can be load and other -tab information. Essential framework tabs (core) and built-in modules (modules) are loaded automatically. However, you can choose to unload core and modules tabs, -and overwrite core tabs by changing some SPS options.

    Tab naming

    Once a tab ID is provided in the sps function tabs argument, when the function +

    +

    This is the SPS main function. You can load/unload custom tabs by providing tab IDs in tabs argument, like +c("tab1", "tab2). Open config/tabs.csv or use spsTabInfo() to see what tabs IDs can be load and other +tab information. Essential framework tabs (core) and built-in modules (modules) are loaded automatically. However, you can choose to unload core and modules tabs, +and overwrite core tabs by changing some SPS options.

    +

    Tab naming

    +

    Once a tab ID is provided in the sps function tabs argument, when the function runs, it is looking for tab information inside this tabs.csv, like the display name and tab image. Then it will search for the UI and server function in the enviornment. -It is expecting a UI function named tab_id + UI -> tab_idUI and the server -tab_id + Server -> tab_idServer. If you did not use the spsNewTab function -to generate the new tab, make sure you name your tab UI and server in this pattern.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/canvas/index.html b/public/sps/canvas/index.html index 2e5bba899..06a3c25a8 100644 --- a/public/sps/canvas/index.html +++ b/public/sps/canvas/index.html @@ -1,76 +1,1166 @@ -Canvas | sysPipe

    Canvas


    SPS Canvas is a place to display and edit scrennshots from different plots. To start + + + + + + + + + + + + + + + + + + + +Canvas | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Canvas

    + + +
    +

    SPS Canvas is a place to display and edit scrennshots from different plots. To start to use Canvas, you need to take some screenshots but clicking “To Canvas” buttons on different tabs/modules. After clicking, the screenshots will be automatically sent -from these places to this Canvas.

    After SPS v1.1.0 this Canvas feature has been provided as a separate package -{drawer}. If you like this feature and want to use outside -of SPS, install {drawer}. It is fully compatible with both -Shiny and R markdown.

    Prepare plots

    In other SPS tabs, adjust your plots to the optimal size by dragging the corner:

    plot_tab

    Then use the ‵toCanvas‵ button of that plot to send a screenshot of current plot -to the Canvas. Or you can click on the “down arrow” to save it to edit in other tools.

    plot_tab

    Use the Canvas

    plot_tab

    Figure 9 Canvas

    1. The Canvas area.
    2. Canvas drawing grids. By default, your objects are limited to these drawing grids, but you can change it from top options inside “canvas”. -The grid area size is automatically calculated to fit your screen size when you start SPS.
    3. Object information. When you select any object on the Canvas, a bounding box will show to display the object’s dimensions, scale, angle and other information. -You can disable them in the “View” menu
    4. To edit your screenshots, simply drag your screenshots from left to Canvas working area.
    5. You can add text or titles, and change the font color, decorations in this panel.
    6. Different Canvas options. Several menus and buttons help you to better control the Canvas. -Hover your mouse on buttons will display a tooltip of their functionality.

    Keyboard shortcuts are also enabled with SPS Canvas. Go to “help” menu to see these -options.

    Support

    Canvas only works on recent browsers versions, like Chrome, latest Edge, Firefox. +from these places to this Canvas.

    +

    After SPS v1.1.0 this Canvas feature has been provided as a separate package +{drawer}. If you like this feature and want to use outside +of SPS, install {drawer}. It is fully compatible with both +Shiny and R markdown.

    +

    Prepare plots

    +

    In other SPS tabs, adjust your plots to the optimal size by dragging the corner:

    +
    +

    plot_tab

    +
    +

    Then use the ‵toCanvas‵ button of that plot to send a screenshot of current plot +to the Canvas. Or you can click on the “down arrow” +to save it to edit in other tools.

    +
    +

    plot_tab

    +
    +

    Use the Canvas

    +
    +

    plot_tab

    +
    +

    Figure 9 Canvas

    +
      +
    1. The Canvas area.
    2. +
    3. Canvas drawing grids. By default, your objects are limited to these drawing grids, but you can change it from top options inside “canvas”. +The grid area size is automatically calculated to fit your screen size when you start SPS.
    4. +
    5. Object information. When you select any object on the Canvas, a bounding box will show to display the object’s dimensions, scale, angle and other information. +You can disable them in the “View” menu
    6. +
    7. To edit your screenshots, simply drag your screenshots from left to Canvas working area.
    8. +
    9. You can add text or titles, and change the font color, decorations in this panel.
    10. +
    11. Different Canvas options. Several menus and buttons help you to better control the Canvas. +Hover your mouse on buttons will display a tooltip of their functionality.
    12. +
    +

    Keyboard shortcuts are also enabled with SPS Canvas. Go to “help” menu to see these +options.

    +

    Support

    +

    Canvas only works on recent browsers versions, like Chrome, latest Edge, Firefox. IE is not supported. Also, some browser privacy extensions will block javascript -and HTML5 canvas fingerprint. This will cause the screenshot to be blank.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/deploy/index.html b/public/sps/deploy/index.html index 4f8b7faf7..aabe52516 100644 --- a/public/sps/deploy/index.html +++ b/public/sps/deploy/index.html @@ -1,76 +1,1069 @@ -Deploy | sysPipe

    Deploy


    How to deploy the application

    The easiest way to deploy SPS is shinyapps.io{blk}. -To get started, it is required to create a shinyapps.io account. Please follow this tutorial{blk} + + + + + + + + + + + + + + + + + + + +Deploy | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Deploy

    + + +
    +

    How to deploy the application

    +

    The easiest way to deploy SPS is shinyapps.io{blk}. +To get started, it is required to create a shinyapps.io account. Please follow this tutorial{blk} with all the instructions to create an account. There are other ways to deploy, like AWS or Google Cloud with a custom Shiny server. There are a lot of tutorials to deploy the app other than shinyapps.io. We only use shinyapps.io as the example -here to discuss how to deploy.

    Get started

    After you have created a SPS project, it is in a deploy-ready state, which means -you can deploy it as soon as you create the project.

    We have created some important helper code in deploy.R under the project root for you.

    1. Read the tutorial{blk}
    2. After you have the accounts and token set up according to the tutorial, open -deploy.R.
      • If you have used Bioconductor packages (mostly likely yes, unless you do not use -the default modules), run the options line in R console before deploy, which is this

        options(repos = BiocManager::repositories())
        -
      • If you want to use develop version of Bioconductor packages (not recommended), -uncomment following lines and follow the instructions in the file.

        # repos <- BiocManager::repositories()
        +here to discuss how to deploy.

        +

        Get started

        +

        After you have created a SPS project, it is in a deploy-ready state, which means +you can deploy it as soon as you create the project.

        +

        We have created some important helper code in deploy.R under the project root for you.

        +
          +
        1. Read the tutorial{blk}
        2. +
        3. After you have the accounts and token set up according to the tutorial, open +deploy.R. +
            +
          • +

            If you have used Bioconductor packages (mostly likely yes, unless you do not use +the default modules), run the options line in R console before deploy, which is this

            +
            options(repos = BiocManager::repositories())
            +
            +
          • +
          • +

            If you want to use develop version of Bioconductor packages (not recommended), +uncomment following lines and follow the instructions in the file.

            +
            # repos <- BiocManager::repositories()
             # devel <- "3.13"
             # repos[length(repos) + 1] <- paste0("https://bioconductor.org/packages/", devel, "/bioc")
             # names(repos)[length(repos)] <- "BioC"
             # options(repos = repos)
             # getOption("repos")
            -
          • If you wish shinyapps.io to install SPS modules, copy and +

        +
      • +
      • +

        If you wish shinyapps.io to install SPS modules, copy and uncomment following lines for the modules to global.R file below the -line # load additional libraries that you want to use below.

        ## Workflow module
        +line # load additional libraries that you want to use below.

        +
        ## Workflow module
         # requireNamespace("DOT"); requireNamespace("networkD3"); requireNamespace("pushbar")
         # requireNamespace("readr"); requireNamespace("rhandsontable"); requireNamespace("shinyTree")
         # requireNamespace("systemPipeR"); requireNamespace("systemPipeRdata"); requireNamespace("zip")
        @@ -82,22 +1075,148 @@
              
         ## Quick ggplot module
         # requireNamespace("esquisse")
        -
      • The last section in deploy.R is some helper code to set up the account and +

    + +
  • +

    The last section in deploy.R is some helper code to set up the account and deploy the app programmatically. If you use the -tutorial{blk}, -there is no need to do this section.

  • Save your changes in the global.R.

  • Deploy in Rstudio

    We recommend you to deploy the app with Rstudio. If you have set up your shinyapps.io -account, we are ready to go.

    A

    1. Open global.R in Rstudio, use the “Run App” button to make sure your app -can be run without problems locally.
    2. Run options(repos = BiocManager::repositories()) and other Bioconductor -set up code as listed above.
    3. Click the button next to “Run App” and choose “Publish Application…”

    B

    1. If you have set up your account correctly, you should see your account to the -right panel.
    2. Select all the files of your SPS project.
    3. Change the app “Title” to what you want.
    4. hit “Publish”.

    RAM requirement

    If you wish to load the workflow and/or RNAseq module(s) on shinyapps.io, you need +tutorial{blk}, +there is no need to do this section.

    + +
  • +

    Save your changes in the global.R.

    +
  • + + + +

    Deploy in Rstudio

    +

    We recommend you to deploy the app with Rstudio. If you have set up your shinyapps.io +account, we are ready to go.

    +
    +

    +
    +

    A

    +
      +
    1. Open global.R in Rstudio, use the “Run App” button to make sure your app +can be run without problems locally.
    2. +
    3. Run options(repos = BiocManager::repositories()) and other Bioconductor +set up code as listed above.
    4. +
    5. Click the button next to “Run App” and choose “Publish Application…”
    6. +
    +

    B

    +
      +
    1. If you have set up your account correctly, you should see your account to the +right panel.
    2. +
    3. Select all the files of your SPS project.
    4. +
    5. Change the app “Title” to what you want.
    6. +
    7. hit “Publish”.
    8. +
    +

    RAM requirement

    +

    If you wish to load the workflow and/or RNAseq module(s) on shinyapps.io, you need at least 2GB of memory. Unfortunately, these 2 modules depend heavily on Bioconductor packages and these packages are not light-weighted. The max RAM for free account on shinyapps.io is 1GB which means you either need to upgrade your account or -use other server to deploy your app.

    If you decide to not load these modules which will allow you to deploy the app +use other server to deploy your app.

    +

    If you decide to not load these modules which will allow you to deploy the app with a free account, change the settings to unload these modules in -app options in global.R.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/drawer/index.html b/public/sps/dev/drawer/index.html index 1ff0a5528..6a246b4bd 100644 --- a/public/sps/dev/drawer/index.html +++ b/public/sps/dev/drawer/index.html @@ -1,77 +1,1270 @@ -drawer | sysPipe

    drawer

    The {drawer} package offers an interactive image editing tool that can be added as part of the + + + + + + + + + + + + + + + + + + + + +drawer | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    drawer

    + + +

    The {drawer} package offers an interactive image editing tool that can be added as part of the HTML in Shiny, R markdown or any type of HTML document. Often times, plots, photos are embedded in the web application/file. {drawer} can take screenshots of these image-like elements, or any part of the HTML document and send to an image editing space called “canvas” to allow users immediately edit the screenshot(s) within the same document. Users can quickly combine, compare -different screenshots, upload their own images and maybe make a scientific figure.

    Features

    • {drawer} is built with 99% javascript + HTML + CSS, there is no need to have a Shiny server or any other +different screenshots, upload their own images and maybe make a scientific figure.

      +

      Features

      +
        +
      • {drawer} is built with 99% javascript + HTML + CSS, there is no need to have a Shiny server or any other types of server in the back-end. That’s why you can use it in any HTML document. -All you need is a modern web browser, like Chrome or Firefox (IE will not work).
      • Shiny and R markdown compatible.
      • Screenshot any element in the page and edit in canvas or download it png or jpg
      • Drag and upload your own images.

      Drawer UI screenshot -drawer

      Installation

      Read the developer tools main page, not repeating here.

      Functions reference manual

      Please read the reference manuals for details of every function.

      Some video demos

      Basic looking and options

      Capture

      Use the capture buttons to capture plots, images and other elements in the same -document.

      Add text

      Upload your own images

      You can upload one or multiple your own images at once.

      Browser support

      {drawer} only works on recent browsers versions, like Chrome, latest Edge, Firefox. +All you need is a modern web browser, like Chrome or Firefox (IE will not work).

    • +
    • Shiny and R markdown compatible.
    • +
    • Screenshot any element in the page and edit in canvas or download it png or jpg
    • +
    • Drag and upload your own images.
    • +
    +

    Drawer UI screenshot +drawer

    +

    Installation

    +

    Read the developer tools main page, not repeating here.

    +

    Functions reference manual

    +

    Please read the reference manuals for details of every function.

    +

    Some video demos

    +

    Basic looking and options

    + +

    Capture

    +

    Use the capture buttons to capture plots, images and other elements in the same +document.

    + +

    Add text

    + +

    Upload your own images

    +

    You can upload one or multiple your own images at once.

    + +

    Browser support

    +

    {drawer} only works on recent browsers versions, like Chrome, latest Edge, Firefox. IE is not supported (IE is not my friend). Also, some browser privacy extensions will block javascript and HTML5 canvas fingerprint. This will cause the screenshot to be blank. {drawer} -does not collect any user information from you.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/drawer/index.xml b/public/sps/dev/drawer/index.xml index 8665f1a1c..903b6faea 100644 --- a/public/sps/dev/drawer/index.xml +++ b/public/sps/dev/drawer/index.xml @@ -1,43 +1,85 @@ -sysPipe – drawer/sps/dev/drawer/Recent content in drawer on sysPipeHugo -- gohugo.ioSps: drawer in Shiny/sps/dev/drawer/shiny/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/drawer/shiny/ -<h2 id="demo">Demo</h2> -<table> -<thead> -<tr> -<th>Demo</th> -<th>demo Source code</th> -</tr> -</thead> -<tbody> -<tr> -<td><a href="https://lezhang.shinyapps.io/drawer">shinyapps.io</a></td> -<td><a href="https://github.com/lz100/drawer/tree/master/examples/demo">github</a></td> -</tr> -</tbody> -</table> -<h2 id="instructions">Instructions</h2> -<p>Instructions on how to use {drawer} and the capture buttons are provided in the -demo Shiny app in details. Click on the <strong>show code</strong> button on each tab in the -demo app for code to reproduce.</p>Sps: drawer in Rmarkdown/sps/dev/drawer/rmd/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/drawer/rmd/ -<br> -<br> -<br> -<p>{drawer} is compatible with R markdown. Instructions and details are all -included in these Rmd demos:</p> -<table> -<thead> -<tr> -<th>Demo</th> -<th>Source code</th> -</tr> -</thead> -<tbody> -<tr> -<td><a href="../drawer_rmd_demo.html">With instructions</a></td> -<td><a href="https://github.com/lz100/drawer/blob/master/examples/rmd_demo/drawer_rmd_demo.Rmd">link</a></td> -</tr> -<tr> -<td><a href="../drawer_independent.html">Pure drawer</a></td> -<td><a href="https://github.com/lz100/drawer/blob/master/examples/rmd_demo/drawer_independent.Rmd">link</a></td> -</tr> -</tbody> -</table> \ No newline at end of file + + + sysPipe – drawer + /sps/dev/drawer/ + Recent content in drawer on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sps: drawer in Shiny + /sps/dev/drawer/shiny/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/drawer/shiny/ + + + + <h2 id="demo">Demo</h2> +<table> +<thead> +<tr> +<th>Demo</th> +<th>demo Source code</th> +</tr> +</thead> +<tbody> +<tr> +<td><a href="https://lezhang.shinyapps.io/drawer">shinyapps.io</a></td> +<td><a href="https://github.com/lz100/drawer/tree/master/examples/demo">github</a></td> +</tr> +</tbody> +</table> +<h2 id="instructions">Instructions</h2> +<p>Instructions on how to use {drawer} and the capture buttons are provided in the +demo Shiny app in details. Click on the <strong>show code</strong> button on each tab in the +demo app for code to reproduce.</p> + + + + + + Sps: drawer in Rmarkdown + /sps/dev/drawer/rmd/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/drawer/rmd/ + + + + <br> +<br> +<br> +<p>{drawer} is compatible with R markdown. Instructions and details are all +included in these Rmd demos:</p> +<table> +<thead> +<tr> +<th>Demo</th> +<th>Source code</th> +</tr> +</thead> +<tbody> +<tr> +<td><a href="../drawer_rmd_demo.html">With instructions</a></td> +<td><a href="https://github.com/lz100/drawer/blob/master/examples/rmd_demo/drawer_rmd_demo.Rmd">link</a></td> +</tr> +<tr> +<td><a href="../drawer_independent.html">Pure drawer</a></td> +<td><a href="https://github.com/lz100/drawer/blob/master/examples/rmd_demo/drawer_independent.Rmd">link</a></td> +</tr> +</tbody> +</table> + + + + + + diff --git a/public/sps/dev/drawer/rmd/index.html b/public/sps/dev/drawer/rmd/index.html index cb76f7748..40faee3c6 100644 --- a/public/sps/dev/drawer/rmd/index.html +++ b/public/sps/dev/drawer/rmd/index.html @@ -1,64 +1,1158 @@ -drawer in Rmarkdown | sysPipe
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + +
    +
    + + + + + + +
    +

    drawer in Rmarkdown

    + + +
    +
    +
    +

    {drawer} is compatible with R markdown. Instructions and details are all +included in these Rmd demos:

    + + + + + + + + + + + + + + + + + +
    DemoSource code
    With instructionslink
    Pure drawerlink
    + + + +
    Last modified 2021-03-01: updates fix homepage no_render (799f3267) +
    +
    + + +
    + + + +
    +
    + + + + +
    + + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/drawer/shiny/index.html b/public/sps/dev/drawer/shiny/index.html index 0036fd94d..688f32e5c 100644 --- a/public/sps/dev/drawer/shiny/index.html +++ b/public/sps/dev/drawer/shiny/index.html @@ -1,62 +1,1148 @@ -drawer in Shiny | sysPipe

    drawer in Shiny

    Demo

    Demodemo Source code
    shinyapps.iogithub

    Instructions

    Instructions on how to use {drawer} and the capture buttons are provided in the + + + + + + + + + + + + + + + + + + + +drawer in Shiny | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + +
    +
    + + + + + + +
    +

    drawer in Shiny

    + + +

    Demo

    + + + + + + + + + + + + + +
    Demodemo Source code
    shinyapps.iogithub
    +

    Instructions

    +

    Instructions on how to use {drawer} and the capture buttons are provided in the demo Shiny app in details. Click on the show code button on each tab in the -demo app for code to reproduce.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/index.html b/public/sps/dev/index.html index 9802c875e..e2ccbd1f7 100644 --- a/public/sps/dev/index.html +++ b/public/sps/dev/index.html @@ -1,87 +1,1264 @@ -Developer tools | sysPipe

    Developer tools

    SPS is not only a framework to run interactive workflow and visualize data, but + + + + + + + + + + + + + + + + + + + + +Developer tools | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Developer tools

    + + +

    SPS is not only a framework to run interactive workflow and visualize data, but also a framework with abundant developer tools for building Shiny apps, writing R markdowns, -integrating R-HTML and general R utilities.

    These developer toolkits are distributed in supporting packages. If you like +integrating R-HTML and general R utilities.

    +

    These developer toolkits are distributed in supporting packages. If you like some of the functionality from SPS and think installing the whole framework is too expensive (time consuming), cherry-pick the functionality you want in following -categories:

    • spsCpmps: Shiny/Rmarkdown UI components, and Shiny server functions.
    • drawer: Shiny/Rmarkdown/HTML interactive image editing tool.
    • spsUtil: General R utilities, like pretty logging functions.

    Install

    All these supporting packages are available on CRAN. We recommend to use the -modern package manager {pak} to install packages.

    if(!requireNamespace("pak", quietly = TRUE))
    +categories:

    +
      +
    • spsCpmps: Shiny/Rmarkdown UI components, and Shiny server functions.
    • +
    • drawer: Shiny/Rmarkdown/HTML interactive image editing tool.
    • +
    • spsUtil: General R utilities, like pretty logging functions.
    • +
    +

    Install

    +

    All these supporting packages are available on CRAN. We recommend to use the +modern package manager {pak} to install packages.

    +
    if(!requireNamespace("pak", quietly = TRUE))
       install.packages("pak", repos = "https://r-lib.github.io/p/pak/dev/")
    -

    Pick and install packages as your need

    pak::pkg_install("spsCpmps")
    +
    +

    Pick and install packages as your need

    +
    pak::pkg_install("spsCpmps")
     pak::pkg_install("drawer")
     pak::pkg_install("spsUtil")
    -

    Linux

    If you are on Linux, you need to install some system dependencies before R package +

    +

    Linux

    +

    If you are on Linux, you need to install some system dependencies before R package installation. To figure out -what system dependencies and command, run:

    paste("sudo", pak::pkg_system_requirements("spsComps"))
    -
    ## [1] "sudo apt-get install -y libcurl4-openssl-dev"
    +what system dependencies and command, run:

    +
    paste("sudo", pak::pkg_system_requirements("spsComps"))
    +
    +
    ## [1] "sudo apt-get install -y libcurl4-openssl-dev"
     ## [2] "sudo apt-get install -y libssl-dev"          
     ## [3] "sudo apt-get install -y make"                
     ## [4] "sudo apt-get install -y libicu-dev"          
     ## [5] "sudo apt-get install -y pandoc"
    -
    paste("sudo", pak::pkg_system_requirements("drawer"))
    -
    ## [1] "sudo apt-get install -y make"       "sudo apt-get install -y libicu-dev"
    +
    +
    paste("sudo", pak::pkg_system_requirements("drawer"))
    +
    +
    ## [1] "sudo apt-get install -y make"       "sudo apt-get install -y libicu-dev"
     ## [3] "sudo apt-get install -y pandoc"
    -
    paste("sudo", pak::pkg_system_requirements("spsUtil"))
    -
    ## [1] "sudo apt-get install -y libcurl4-openssl-dev"
    +
    +
    paste("sudo", pak::pkg_system_requirements("spsUtil"))
    +
    +
    ## [1] "sudo apt-get install -y libcurl4-openssl-dev"
     ## [2] "sudo apt-get install -y libssl-dev"          
     ## [3] "sudo apt-get install -y libicu-dev"
    -

    We are rendering this doc in Ubuntu. If your Linux distribution is different, commands above will be different.

    Functions reference manual

    In documents, we only highlight some important functions. Please read -the reference manuals for details of every function.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/index.xml b/public/sps/dev/index.xml index 847c7571f..c0a81834f 100644 --- a/public/sps/dev/index.xml +++ b/public/sps/dev/index.xml @@ -1,289 +1,338 @@ -sysPipe – Developer tools/sps/dev/Recent content in Developer tools on sysPipeHugo -- gohugo.ioSps: spsComps/sps/dev/spscomps/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/spscomps/ -<h2 id="sps-components-package">SPS Components package</h2> -<p>systemPipeShiny Components (spsComps) package is a collection of custom UI and + + + sysPipe – Developer tools + /sps/dev/ + Recent content in Developer tools on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sps: spsComps + /sps/dev/spscomps/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/spscomps/ + + + + <h2 id="sps-components-package">SPS Components package</h2> +<p>systemPipeShiny Components (spsComps) package is a collection of custom UI and server components that are used in SPS main framework. If you see a component in SPS but want to outside the SPS framework, like in your own Shiny apps, -take a look at these components.</p> -<h2 id="demos">Demos</h2> -<table> -<thead> -<tr> -<th>Demo</th> -<th>type</th> -<th>source code</th> -</tr> -</thead> -<tbody> -<tr> -<td><a href="https://lezhang.shinyapps.io/spsComps">shiny{blk}</a></td> -<td>shinyapps.io</td> -<td><a href="https://github.com/lz100/spsComps/tree/master/examples/demo">Github{blk}</a></td> -</tr> -<tr> -<td><a href="https://systempipe.org/sps/dev/spscomps/ui/">Rmd</a></td> -<td>Rmarkdown rendered</td> -<td><a href="https://raw.githubusercontent.com/systemPipeR/systemPipeR.github.io/main/content/en/sps/dev/spscomps/ui.Rmd">Raw{blk}</a></td> -</tr> -</tbody> -</table> -<style> +take a look at these components.</p> +<h2 id="demos">Demos</h2> +<table> +<thead> +<tr> +<th>Demo</th> +<th>type</th> +<th>source code</th> +</tr> +</thead> +<tbody> +<tr> +<td><a href="https://lezhang.shinyapps.io/spsComps">shiny{blk}</a></td> +<td>shinyapps.io</td> +<td><a href="https://github.com/lz100/spsComps/tree/master/examples/demo">Github{blk}</a></td> +</tr> +<tr> +<td><a href="https://systempipe.org/sps/dev/spscomps/ui/">Rmd</a></td> +<td>Rmarkdown rendered</td> +<td><a href="https://raw.githubusercontent.com/systemPipeR/systemPipeR.github.io/main/content/en/sps/dev/spscomps/ui.Rmd">Raw{blk}</a></td> +</tr> +</tbody> +</table> +<style> table {font-size: 1.5rem} -</style> -<h2 id="installation">Installation</h2> -<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> -<h2 id="category">Category</h2> -<p>{spsComps} can be divided into two major categories: <a href="ui">UI</a> and <a href="server">server</a>.</p> -<ul> -<li><a href="ui"><strong>UI</strong></a>: Shiny or HTML UI components, for example, a box, a gallery, a button, etc. With -these most of components, you do <strong>NOT need a server</strong>, so they are compatible with -R markdown documents. See the <a href="ui">UI</a> page and its source code how we use the +</style> +<h2 id="installation">Installation</h2> +<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> +<h2 id="category">Category</h2> +<p>{spsComps} can be divided into two major categories: <a href="ui">UI</a> and <a href="server">server</a>.</p> +<ul> +<li><a href="ui"><strong>UI</strong></a>: Shiny or HTML UI components, for example, a box, a gallery, a button, etc. With +these most of components, you do <strong>NOT need a server</strong>, so they are compatible with +R markdown documents. See the <a href="ui">UI</a> page and its source code how we use the components in a Rmd doucment. However, some UI components has server side functions, -mostly like <code>updateXXX</code> functions. Mainly these functions are used to update/change the +mostly like <code>updateXXX</code> functions. Mainly these functions are used to update/change the UI based on user behaviors. It is totally okay to use the UI functions without the -server functions (you will get static UI).</li> -<li><a href="server"><strong>server</strong></a>: <strong>can only be run in the Shiny server</strong>. These functions are designed -to make back-end progress easier, extensions of original shiny Server functions.</li> -</ul> -<h2 id="functions-reference-manual">Functions reference manual</h2> -<p>In documents, we only highlight some important functions. Please read -the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> -<h2 id="some-screenshots-of-spscomps">some screenshots of spsComps</h2> -<h4 id="animations">Animations</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/animations.gif?raw=true" alt="animation"></p> -<h4 id="loaders">Loaders</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/loader.gif?raw=true" alt="loader"></p> -<h4 id="buttons">Buttons</h4> -<h5 id="code-display-button">Code display button</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/display_code.gif?raw=true" alt="display_code"></p> -<h5 id="go-top-button">Go top button</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/gotop.gif?raw=true" alt="gotop"></p> -<h5 id="input-buttons">Input buttons</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons.png?raw=true" alt="buttons"></p> -<h5 id="button-groups">Button groups</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons_tab.png?raw=true" alt="buttons_tab"></p> -<h5 id="table-of-buttons">Table of buttons</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons_table.png?raw=true" alt="buttons_table"></p> -<h4 id="gallery">Gallery</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/gallery.png?raw=true" alt="gallery"></p> -<h4 id="logos">Logos</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/logos.png?raw=true" alt="logos"></p> -<h4 id="progress-tracking">Progress tracking</h4> -<h5 id="porgress-panel">Porgress panel</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/pg_panel.gif?raw=true" alt="pg_panel"></p> -<h5 id="timeline">Timeline</h5> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/timeline.gif?raw=true" alt="timeline"></p> -<h4 id="tooltips">Tooltips</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bstip.gif?raw=true" alt="tooltips"></p> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bstip.png?raw=true" alt="tooltips"></p> -<h4 id="popovers">Popovers</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bspopover.gif?raw=true" alt="popovers"></p> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bspopover.png?raw=true" alt="popovers"></p> -<h4 id="colorful-titles">Colorful titles</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/spstitle.png?raw=true" alt="spstitle"></p> -<h4 id="colorful-divider-lines">Colorful divider lines</h4> -<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/spshr.png?raw=true" alt="spshr"></p>Sps: drawer/sps/dev/drawer/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/drawer/ -<p>The {drawer} package offers an interactive image editing tool that can be added as part of the +server functions (you will get static UI).</li> +<li><a href="server"><strong>server</strong></a>: <strong>can only be run in the Shiny server</strong>. These functions are designed +to make back-end progress easier, extensions of original shiny Server functions.</li> +</ul> +<h2 id="functions-reference-manual">Functions reference manual</h2> +<p>In documents, we only highlight some important functions. Please read +the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> +<h2 id="some-screenshots-of-spscomps">some screenshots of spsComps</h2> +<h4 id="animations">Animations</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/animations.gif?raw=true" alt="animation"></p> +<h4 id="loaders">Loaders</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/loader.gif?raw=true" alt="loader"></p> +<h4 id="buttons">Buttons</h4> +<h5 id="code-display-button">Code display button</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/display_code.gif?raw=true" alt="display_code"></p> +<h5 id="go-top-button">Go top button</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/gotop.gif?raw=true" alt="gotop"></p> +<h5 id="input-buttons">Input buttons</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons.png?raw=true" alt="buttons"></p> +<h5 id="button-groups">Button groups</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons_tab.png?raw=true" alt="buttons_tab"></p> +<h5 id="table-of-buttons">Table of buttons</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/buttons_table.png?raw=true" alt="buttons_table"></p> +<h4 id="gallery">Gallery</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/gallery.png?raw=true" alt="gallery"></p> +<h4 id="logos">Logos</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/logos.png?raw=true" alt="logos"></p> +<h4 id="progress-tracking">Progress tracking</h4> +<h5 id="porgress-panel">Porgress panel</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/pg_panel.gif?raw=true" alt="pg_panel"></p> +<h5 id="timeline">Timeline</h5> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/timeline.gif?raw=true" alt="timeline"></p> +<h4 id="tooltips">Tooltips</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bstip.gif?raw=true" alt="tooltips"></p> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bstip.png?raw=true" alt="tooltips"></p> +<h4 id="popovers">Popovers</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bspopover.gif?raw=true" alt="popovers"></p> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/bspopover.png?raw=true" alt="popovers"></p> +<h4 id="colorful-titles">Colorful titles</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/spstitle.png?raw=true" alt="spstitle"></p> +<h4 id="colorful-divider-lines">Colorful divider lines</h4> +<p><img src="https://github.com/systemPipeR/systemPipeR.github.io/blob/main/static/sps/img/spscomps/spshr.png?raw=true" alt="spshr"></p> + + + + + + Sps: drawer + /sps/dev/drawer/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/drawer/ + + + + <p>The {drawer} package offers an interactive image editing tool that can be added as part of the HTML in Shiny, R markdown or any type of HTML document. Often times, plots, photos are embedded in the web application/file. {drawer} can take screenshots of these image-like elements, or any part of the HTML document and send to an image editing space called &ldquo;canvas&rdquo; to allow users immediately edit the screenshot(s) within the same document. Users can quickly combine, compare -different screenshots, upload their own images and maybe make a scientific figure.</p> -<h2 id="features">Features</h2> -<ul> -<li>{drawer} is built with 99% javascript + HTML + CSS, there is <strong>no need to have a Shiny server</strong> or any other +different screenshots, upload their own images and maybe make a scientific figure.</p> +<h2 id="features">Features</h2> +<ul> +<li>{drawer} is built with 99% javascript + HTML + CSS, there is <strong>no need to have a Shiny server</strong> or any other types of server in the back-end. That&rsquo;s why you can use it in any HTML document. -<strong>All you need is a modern web browser</strong>, like Chrome or Firefox (IE will not work).</li> -<li>Shiny and R markdown compatible.</li> -<li>Screenshot any element in the page and edit in canvas or download it <em>png</em> or <em>jpg</em></li> -<li>Drag and upload your own images.</li> -</ul> -<p>Drawer UI screenshot -<img src="drawer_demo.png" alt="drawer"></p> -<h2 id="installation">Installation</h2> -<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> -<h2 id="functions-reference-manual">Functions reference manual</h2> -<p>Please read the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> -<h2 id="some-video-demos">Some video demos</h2> -<h3 id="basic-looking-and-options">Basic looking and options</h3> -<video width="100%" height="100%" controls> -<source src="basic_and_options.mp4" type="video/mp4"> -</video> -<h3 id="capture">Capture</h3> -<p>Use the capture buttons to capture plots, images and other elements in the same -document.</p> -<video width="100%" height="100%" controls> -<source src="capture_plots.mp4" type="video/mp4"> -</video> -<h3 id="add-text">Add text</h3> -<video width="100%" height="100%" controls> -<source src="add_text.mp4" type="video/mp4"> -</video> -<h3 id="upload-your-own-images">Upload your own images</h3> -<p>You can upload one or multiple your own images at once.</p> -<video width="100%" height="100%" controls> -<source src="upload_img.mp4" type="video/mp4"> -</video> -<h2 id="browser-support">Browser support</h2> -<p>{drawer} only works on recent browsers versions, like Chrome, latest Edge, Firefox. +<strong>All you need is a modern web browser</strong>, like Chrome or Firefox (IE will not work).</li> +<li>Shiny and R markdown compatible.</li> +<li>Screenshot any element in the page and edit in canvas or download it <em>png</em> or <em>jpg</em></li> +<li>Drag and upload your own images.</li> +</ul> +<p>Drawer UI screenshot +<img src="drawer_demo.png" alt="drawer"></p> +<h2 id="installation">Installation</h2> +<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> +<h2 id="functions-reference-manual">Functions reference manual</h2> +<p>Please read the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> +<h2 id="some-video-demos">Some video demos</h2> +<h3 id="basic-looking-and-options">Basic looking and options</h3> +<video width="100%" height="100%" controls> + <source src="basic_and_options.mp4" type="video/mp4"> +</video> +<h3 id="capture">Capture</h3> +<p>Use the capture buttons to capture plots, images and other elements in the same +document.</p> +<video width="100%" height="100%" controls> + <source src="capture_plots.mp4" type="video/mp4"> +</video> +<h3 id="add-text">Add text</h3> +<video width="100%" height="100%" controls> + <source src="add_text.mp4" type="video/mp4"> +</video> +<h3 id="upload-your-own-images">Upload your own images</h3> +<p>You can upload one or multiple your own images at once.</p> +<video width="100%" height="100%" controls> + <source src="upload_img.mp4" type="video/mp4"> +</video> +<h2 id="browser-support">Browser support</h2> +<p>{drawer} only works on recent browsers versions, like Chrome, latest Edge, Firefox. IE is not supported (IE is not my friend). Also, some browser privacy extensions will block javascript -and HTML5 canvas fingerprint. This will cause the screenshot to be blank. {<strong>drawer</strong>} -does not collect any user information from you.</p>Sps: spsUtil/sps/dev/spsutil/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/spsutil/ -<hr> -<p>SPS framework come with a plenty of useful general R utility functions, like -pretty logging, package namespace checking, URL checking, and more.</p> -<p>Since SPS 1.1, these functions are separated into a supporting package called -<strong>spsUtil</strong> (systemPipeShiny Utility). You can install it from CRAN.</p> -<h2 id="installation">Installation</h2> -<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> -<h2 id="functions-reference-manual">Functions reference manual</h2> -<p>In documents, we only highlight some important functions. Please read -the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> -<h2 id="function-highlights">Function highlights</h2> -<pre><code class="language-r">library(spsUtil) -</code></pre> -<h3 id="logging-with-msg">logging with <code>msg</code></h3> -<h4 id="basic">basic</h4> -<p>Often times in an R function, we want to use some text to inform users the -status and message. We can use functions like <code>message</code>, <code>warning</code>, <code>stop</code> to generate different -levels of information.</p> -<p>{spsUtil} provides some more informative and prettier ways to generate these kind of messages.</p> -<pre><code class="language-r">msg(&quot;my message&quot;) -</code></pre> -<pre><code>## [INFO] 2021-04-12 11:49:35 my message -</code></pre> -<p>You can see it starts with a <code>level</code> information, then a time stamp, and follows the -actual message. By default, it uses the <code>INFO</code> level, and you can change to whatever -level you want. However, there are 3 keywords that have special meaning.</p> -<h4 id="levels">Levels</h4> -<ul> -<li><strong>INFO</strong>: equals <code>message</code> method in native R</li> -<li><strong>WARNING</strong>: generates warnings the same as <code>warning</code> function</li> -<li><strong>ERROR</strong>: generates error the same as <code>stop</code> function and will prevent downstream -code get evaluated.</li> -</ul> -<p>If the level is other than these 3, there is no special meaning in R, just <code>cat</code> -the message out.</p> -<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;) -</code></pre> -<pre><code>## [INFO] 2021-04-12 11:49:35 I am info -</code></pre> -<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;) # not case sensitive -</code></pre> -<pre><code>## Warning: [WARNING] 2021-04-12 11:49:35 I am warning -</code></pre> -<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;ERROR&quot;) -</code></pre> -<pre><code>## Error: +and HTML5 canvas fingerprint. This will cause the screenshot to be blank. {<strong>drawer</strong>} +does not collect any user information from you.</p> + + + + + + Sps: spsUtil + /sps/dev/spsutil/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/spsutil/ + + + + <hr> +<p>SPS framework come with a plenty of useful general R utility functions, like +pretty logging, package namespace checking, URL checking, and more.</p> +<p>Since SPS 1.1, these functions are separated into a supporting package called +<strong>spsUtil</strong> (systemPipeShiny Utility). You can install it from CRAN.</p> +<h2 id="installation">Installation</h2> +<p>Read the <a href="..">developer tools</a> main page, not repeating here.</p> +<h2 id="functions-reference-manual">Functions reference manual</h2> +<p>In documents, we only highlight some important functions. Please read +the <a href="../../sps/sps_funcs">reference manuals</a> for details of every function.</p> +<h2 id="function-highlights">Function highlights</h2> +<pre><code class="language-r">library(spsUtil) +</code></pre> +<h3 id="logging-with-msg">logging with <code>msg</code></h3> +<h4 id="basic">basic</h4> +<p>Often times in an R function, we want to use some text to inform users the +status and message. We can use functions like <code>message</code>, <code>warning</code>, <code>stop</code> to generate different +levels of information.</p> +<p>{spsUtil} provides some more informative and prettier ways to generate these kind of messages.</p> +<pre><code class="language-r">msg(&quot;my message&quot;) +</code></pre> +<pre><code>## [INFO] 2021-04-12 11:49:35 my message +</code></pre> +<p>You can see it starts with a <code>level</code> information, then a time stamp, and follows the +actual message. By default, it uses the <code>INFO</code> level, and you can change to whatever +level you want. However, there are 3 keywords that have special meaning.</p> +<h4 id="levels">Levels</h4> +<ul> +<li><strong>INFO</strong>: equals <code>message</code> method in native R</li> +<li><strong>WARNING</strong>: generates warnings the same as <code>warning</code> function</li> +<li><strong>ERROR</strong>: generates error the same as <code>stop</code> function and will prevent downstream +code get evaluated.</li> +</ul> +<p>If the level is other than these 3, there is no special meaning in R, just <code>cat</code> +the message out.</p> +<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;) +</code></pre> +<pre><code>## [INFO] 2021-04-12 11:49:35 I am info +</code></pre> +<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;) # not case sensitive +</code></pre> +<pre><code>## Warning: [WARNING] 2021-04-12 11:49:35 I am warning +</code></pre> +<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;ERROR&quot;) +</code></pre> +<pre><code>## Error: [ERROR] 2021-04-12 11:49:35 I am error -</code></pre> -<pre><code class="language-r">msg(&quot;I am random level&quot;, level = &quot;MY LEVEL&quot;) -</code></pre> -<pre><code>## [MY LEVEL] 2021-04-12 11:49:35 I am random level -</code></pre> -<h4 id="prefix">Prefix</h4> -<p>For the 3 key levels, you can specify the prefix in front of the level text to -over write the default level text <code>INFO</code>, <code>WARNING</code>, or <code>ERROR</code></p> -<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;, info_text = &quot;NEW-INFO&quot;) -</code></pre> -<pre><code>## [NEW-INFO] 2021-04-12 11:49:35 I am info -</code></pre> -<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;, warning_text = &quot;MY-WARNING&quot;) -</code></pre> -<pre><code>## Warning: [MY-WARNING] 2021-04-12 11:49:35 I am warning -</code></pre> -<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;ERROR&quot;, error_text = &quot;STOP&quot;) -</code></pre> -<pre><code>## Error: +</code></pre> +<pre><code class="language-r">msg(&quot;I am random level&quot;, level = &quot;MY LEVEL&quot;) +</code></pre> +<pre><code>## [MY LEVEL] 2021-04-12 11:49:35 I am random level +</code></pre> +<h4 id="prefix">Prefix</h4> +<p>For the 3 key levels, you can specify the prefix in front of the level text to +over write the default level text <code>INFO</code>, <code>WARNING</code>, or <code>ERROR</code></p> +<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;, info_text = &quot;NEW-INFO&quot;) +</code></pre> +<pre><code>## [NEW-INFO] 2021-04-12 11:49:35 I am info +</code></pre> +<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;, warning_text = &quot;MY-WARNING&quot;) +</code></pre> +<pre><code>## Warning: [MY-WARNING] 2021-04-12 11:49:35 I am warning +</code></pre> +<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;ERROR&quot;, error_text = &quot;STOP&quot;) +</code></pre> +<pre><code>## Error: [STOP] 2021-04-12 11:49:35 I am error -</code></pre> -<h4 id="colors">Colors</h4> -<p>Colors are automatically enabled if it is supported. If you try all code above in +</code></pre> +<h4 id="colors">Colors</h4> +<p>Colors are automatically enabled if it is supported. If you try all code above in your terminal or Rstudio, they all have colors. In Rmd, to enable the color, -you need to add the following code chunk. You also need to install the <code>fansi</code> package.</p> -<pre><code>```{r echo=FALSE, results='asis'} +you need to add the following code chunk. You also need to install the <code>fansi</code> package.</p> +<pre><code>```{r echo=FALSE, results='asis'} options(crayon.enabled = TRUE) old_hooks &lt;- fansi::set_knit_hooks(knitr::knit_hooks, which = c(&quot;output&quot;, &quot;message&quot;, &quot;error&quot;, &quot;warning&quot;)) ``` -</code></pre> -<STYLE type='text/css' scoped> +</code></pre> +<STYLE type='text/css' scoped> PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em}; -</STYLE> -<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;, info_text = &quot;NEW-INFO&quot;) -</code></pre> -<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[NEW-INFO] 2021-04-12 11:49:35 I am info</span><span> -</span></CODE></PRE> -<p>The 3 key levels has default colors:</p> -<ul> -<li><strong>INFO</strong>: <span style="color:blue">blue</span></li> -<li><strong>WARNING</strong>: <span style="color:orange">orange</span></li> -<li><strong>ERROR</strong>: <span style="color:red">red</span></li> -</ul> -<p>You can specify colors for your own levels</p> -<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;) ## not super orange in Rmd translation -_-= -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 I am warning</span><span> -</span></CODE></PRE> -<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;error&quot;) -</code></pre> -<PRE class="fansi fansi-error"><CODE>## Error: -<span style='color: #BB0000;font-weight: bold;'>[ERROR] 2021-04-12 11:49:35 I am error</span><span> -</span></CODE></PRE> -<pre><code class="language-r">msg(&quot;oh yeah&quot;, level = &quot;SUCCESS&quot;, .other_color = &quot;green&quot;) -</code></pre> -<PRE class="fansi fansi-output"><CODE>## <span style='color: #00BB00;font-weight: bold;'>[SUCCESS] 2021-04-12 11:49:35 oh yeah</span><span> -</span></CODE></PRE> -<pre><code class="language-r">msg(&quot;oh no&quot;, level = &quot;FAIL&quot;, .other_color = &quot;purple&quot;) -</code></pre> -<PRE class="fansi fansi-output"><CODE>## <span style='color: #BB00BB;font-weight: bold;'>[FAIL] 2021-04-12 11:49:35 oh no</span><span> -</span></CODE></PRE> -<h4 id="wrapper">Wrapper</h4> -<p>You can use this logging function in your own projects by wrapping it inside a -upper level function, like what we do for <code>spsinfo</code>, <code>spswarn</code>, <code>spserror</code>. They -have <code>SPS-</code> prefix added, and have some SPS global settings appended.</p> -<pre><code class="language-r">spsOption('use_crayon', TRUE) +</STYLE> +<pre><code class="language-r">msg(&quot;I am info&quot;, level = &quot;INFO&quot;, info_text = &quot;NEW-INFO&quot;) +</code></pre> +<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[NEW-INFO] 2021-04-12 11:49:35 I am info</span><span> +</span></CODE></PRE> +<p>The 3 key levels has default colors:</p> +<ul> +<li><strong>INFO</strong>: <span style="color:blue">blue</span></li> +<li><strong>WARNING</strong>: <span style="color:orange">orange</span></li> +<li><strong>ERROR</strong>: <span style="color:red">red</span></li> +</ul> +<p>You can specify colors for your own levels</p> +<pre><code class="language-r">msg(&quot;I am warning&quot;, level = &quot;warning&quot;) ## not super orange in Rmd translation -_-= +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 I am warning</span><span> +</span></CODE></PRE> +<pre><code class="language-r">msg(&quot;I am error&quot;, level = &quot;error&quot;) +</code></pre> +<PRE class="fansi fansi-error"><CODE>## Error: +<span style='color: #BB0000;font-weight: bold;'>[ERROR] 2021-04-12 11:49:35 I am error</span><span> +</span></CODE></PRE> +<pre><code class="language-r">msg(&quot;oh yeah&quot;, level = &quot;SUCCESS&quot;, .other_color = &quot;green&quot;) +</code></pre> +<PRE class="fansi fansi-output"><CODE>## <span style='color: #00BB00;font-weight: bold;'>[SUCCESS] 2021-04-12 11:49:35 oh yeah</span><span> +</span></CODE></PRE> +<pre><code class="language-r">msg(&quot;oh no&quot;, level = &quot;FAIL&quot;, .other_color = &quot;purple&quot;) +</code></pre> +<PRE class="fansi fansi-output"><CODE>## <span style='color: #BB00BB;font-weight: bold;'>[FAIL] 2021-04-12 11:49:35 oh no</span><span> +</span></CODE></PRE> +<h4 id="wrapper">Wrapper</h4> +<p>You can use this logging function in your own projects by wrapping it inside a +upper level function, like what we do for <code>spsinfo</code>, <code>spswarn</code>, <code>spserror</code>. They +have <code>SPS-</code> prefix added, and have some SPS global settings appended.</p> +<pre><code class="language-r">spsOption('use_crayon', TRUE) spsinfo(&quot;info&quot;, verbose = TRUE) ## default `verbose` mute the message -</code></pre> -<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[SPS-INFO] 2021-04-12 11:49:35 info</span><span> -</span></CODE></PRE> -<pre><code class="language-r">spswarn(&quot;warning&quot;) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[SPS-WARNING] 2021-04-12 11:49:35 warning</span><span> -</span></CODE></PRE> -<pre><code class="language-r">spserror(&quot;stop&quot;) -</code></pre> -<PRE class="fansi fansi-error"><CODE>## Error: -<span style='color: #BB0000;font-weight: bold;'>[SPS-ERROR] 2021-04-12 11:49:35 stop</span><span> -</span></CODE></PRE> -<p>To create a simple one for project is very easy. Assume your project is named &ldquo;My Project&rdquo;. -You can create logging as:</p> -<pre><code class="language-r">mpInfo &lt;- function(text){ -spsUtil::msg(text, info_text = &quot;MP-INFO&quot;) +</code></pre> +<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[SPS-INFO] 2021-04-12 11:49:35 info</span><span> +</span></CODE></PRE> +<pre><code class="language-r">spswarn(&quot;warning&quot;) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[SPS-WARNING] 2021-04-12 11:49:35 warning</span><span> +</span></CODE></PRE> +<pre><code class="language-r">spserror(&quot;stop&quot;) +</code></pre> +<PRE class="fansi fansi-error"><CODE>## Error: +<span style='color: #BB0000;font-weight: bold;'>[SPS-ERROR] 2021-04-12 11:49:35 stop</span><span> +</span></CODE></PRE> +<p>To create a simple one for project is very easy. Assume your project is named &ldquo;My Project&rdquo;. +You can create logging as:</p> +<pre><code class="language-r">mpInfo &lt;- function(text){ + spsUtil::msg(text, info_text = &quot;MP-INFO&quot;) } mpWarn &lt;- function(text){ -spsUtil::msg(text, level = &quot;warning&quot;, warning_text = &quot;MP-WARNING&quot;) + spsUtil::msg(text, level = &quot;warning&quot;, warning_text = &quot;MP-WARNING&quot;) } mpErr &lt;- function(text){ -spsUtil::msg(text, level = &quot;error&quot;, error_text = &quot;MP-ERROR&quot;) + spsUtil::msg(text, level = &quot;error&quot;, error_text = &quot;MP-ERROR&quot;) } mpInfo(&quot;info&quot;) -</code></pre> -<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[MP-INFO] 2021-04-12 11:49:35 info</span><span> -</span></CODE></PRE> -<pre><code class="language-r">mpWarn(&quot;warning&quot;) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[MP-WARNING] 2021-04-12 11:49:35 warning</span><span> -</span></CODE></PRE> -<pre><code class="language-r">mpErr(&quot;error&quot;) -</code></pre> -<PRE class="fansi fansi-error"><CODE>## Error: -<span style='color: #BB0000;font-weight: bold;'>[MP-ERROR] 2021-04-12 11:49:35 error</span><span> -</span></CODE></PRE> -<h2 id="mute-message-with-quiet">mute message with <code>quiet</code></h2> -<p>In R, you can easily mute message and warnings with <code>suppressMessages()</code>, and -<code>suppressWarnings()</code>, but not so easy with <code>print</code> or <code>cat</code> methods. <code>spsUtil::quiet</code> -enables you to mute all these methods or choose what to mute.</p> -<pre><code class="language-r">{ +</code></pre> +<PRE class="fansi fansi-message"><CODE>## <span style='color: #0000BB;font-weight: bold;'>[MP-INFO] 2021-04-12 11:49:35 info</span><span> +</span></CODE></PRE> +<pre><code class="language-r">mpWarn(&quot;warning&quot;) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[MP-WARNING] 2021-04-12 11:49:35 warning</span><span> +</span></CODE></PRE> +<pre><code class="language-r">mpErr(&quot;error&quot;) +</code></pre> +<PRE class="fansi fansi-error"><CODE>## Error: +<span style='color: #BB0000;font-weight: bold;'>[MP-ERROR] 2021-04-12 11:49:35 error</span><span> +</span></CODE></PRE> +<h2 id="mute-message-with-quiet">mute message with <code>quiet</code></h2> +<p>In R, you can easily mute message and warnings with <code>suppressMessages()</code>, and +<code>suppressWarnings()</code>, but not so easy with <code>print</code> or <code>cat</code> methods. <code>spsUtil::quiet</code> +enables you to mute all these methods or choose what to mute.</p> +<pre><code class="language-r">{ # muted quiet(warning(123)) quiet(message(123)) @@ -299,13 +348,13 @@ quiet(cat(123), print_cat = FALSE) ## 123 ## [1] 123 ## 123 -</code></pre> -<h2 id="check-empty-values-with-emptyisfalse">check &ldquo;empty&rdquo; values with <code>emptyIsFalse</code></h2> -<p>In R, values like <code>NA</code>, <code>&quot;&quot;</code>, <code>NULL</code>, length(0) is not very meaningful in +</code></pre> +<h2 id="check-empty-values-with-emptyisfalse">check &ldquo;empty&rdquo; values with <code>emptyIsFalse</code></h2> +<p>In R, values like <code>NA</code>, <code>&quot;&quot;</code>, <code>NULL</code>, length(0) is not very meaningful in condition judgment and will give you errors. Yet, R does not have a native -method to handle these &ldquo;empty&rdquo; values in <code>if</code> like other languages. They are -meaningful in other ways, but in conditions, we may want to turn them to <code>FALSE</code>.</p> -<pre><code class="language-r">if(&quot;&quot;) TRUE else FALSE +method to handle these &ldquo;empty&rdquo; values in <code>if</code> like other languages. They are +meaningful in other ways, but in conditions, we may want to turn them to <code>FALSE</code>.</p> +<pre><code class="language-r">if(&quot;&quot;) TRUE else FALSE ## Error in if (&quot;&quot;) TRUE else FALSE: argument is not interpretable as logical if(NULL) TRUE else FALSE ## Error in if (NULL) TRUE else FALSE: argument is of length zero @@ -313,10 +362,10 @@ if(character(0)) TRUE else FALSE ## Error in if (character(0)) TRUE else FALSE: argument is of length zero if(NA) TRUE else FALSE ## Error in if (NA) TRUE else FALSE: missing value where TRUE/FALSE needed -</code></pre> -<p>You can see they all give errors. In other languages (javascript in this example), -these values are often treated as <code>FALSE</code>.</p> -<pre><code class="language-js">if (NaN) true; else false +</code></pre> +<p>You can see they all give errors. In other languages (javascript in this example), +these values are often treated as <code>FALSE</code>.</p> +<pre><code class="language-js">if (NaN) true; else false //&gt; false if (undefined) true; else false //&gt; false @@ -324,20 +373,20 @@ if (&quot;&quot;) true; else false //&gt; false if (null) true; else false //&gt; false -</code></pre> -<script type="text/javascript"> +</code></pre> +<script type="text/javascript"> if (NaN) true; else false -//> false +//> false if (undefined) true; else false -//> false -if ("") true; else false -//> false +//> false +if ("") true; else false +//> false if (null) true; else false -//> false -</script> -<p>This is how <code>emptyIsFalse</code> -work. If the input is one of these values, return <code>FALSE</code>, else <code>TRUE</code></p> -<pre><code class="language-r">if(emptyIsFalse(&quot;&quot;)) TRUE else FALSE +//> false +</script> +<p>This is how <code>emptyIsFalse</code> +work. If the input is one of these values, return <code>FALSE</code>, else <code>TRUE</code></p> +<pre><code class="language-r">if(emptyIsFalse(&quot;&quot;)) TRUE else FALSE ## [1] FALSE if(emptyIsFalse(NULL)) TRUE else FALSE ## [1] FALSE @@ -345,77 +394,86 @@ if(emptyIsFalse(character(0))) TRUE else FALSE ## [1] FALSE if(emptyIsFalse(NA)) TRUE else FALSE ## [1] FALSE -</code></pre> -<h2 id="check-missing-packages-checknamespace">check missing packages <code>checkNameSpace</code></h2> -<p>In our functions, sometimes we want to have the users to install certain packages -to enable more functionalities, like the <code>DESeq2::lfcShrink</code> function. Or like +</code></pre> +<h2 id="check-missing-packages-checknamespace">check missing packages <code>checkNameSpace</code></h2> +<p>In our functions, sometimes we want to have the users to install certain packages +to enable more functionalities, like the <code>DESeq2::lfcShrink</code> function. Or like in a Rmd source code, before other people can rerender the document, they must -install certain packages. <code>checkNameSpace</code> checks all required packages and returns -the missing names.</p> -<pre><code class="language-r">checkNameSpace(&quot;random_pkg&quot;) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from -## CRAN: random_pkg</span><span> -</span></CODE></PRE> -<pre><code>## [1] &quot;random_pkg&quot; -</code></pre> -<p>You can add it to your function to or on the top of your Rmd document to inform -your users the missing packages and where to install.</p> -<pre><code class="language-r">pkgs &lt;- list( -CRAN = c(&quot;pkg1&quot;, &quot;pkg2&quot;), -Bioconductor = c(&quot;bio_pkg1&quot;, &quot;bio_pkg2&quot;) +install certain packages. <code>checkNameSpace</code> checks all required packages and returns +the missing names.</p> +<pre><code class="language-r">checkNameSpace(&quot;random_pkg&quot;) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from +## CRAN: random_pkg</span><span> +</span></CODE></PRE> +<pre><code>## [1] &quot;random_pkg&quot; +</code></pre> +<p>You can add it to your function to or on the top of your Rmd document to inform +your users the missing packages and where to install.</p> +<pre><code class="language-r">pkgs &lt;- list( + CRAN = c(&quot;pkg1&quot;, &quot;pkg2&quot;), + Bioconductor = c(&quot;bio_pkg1&quot;, &quot;bio_pkg2&quot;) ) -missing_pkg &lt;- checkNameSpace(pkgs[[1]], from = names(pkgs)[1]) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from -## CRAN: pkg1,pkg2</span><span> -</span></CODE></PRE> -<pre><code class="language-r">missing_pkg &lt;- c(missing_pkg, checkNameSpace(pkgs[[2]], from = names(pkgs)[2])) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from -## Bioconductor: bio_pkg1,bio_pkg2</span><span> -</span></CODE></PRE> -<pre><code class="language-r">if(emptyIsFalse(missing_pkg)) stop(&quot;Install packages&quot;) -</code></pre> -<pre><code>## Error in eval(expr, envir, enclos): Install packages -</code></pre> -<p>Or write your custom warning message:</p> -<pre><code class="language-r">{ + +missing_pkg &lt;- checkNameSpace(pkgs[[1]], from = names(pkgs)[1]) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from +## CRAN: pkg1,pkg2</span><span> +</span></CODE></PRE> +<pre><code class="language-r">missing_pkg &lt;- c(missing_pkg, checkNameSpace(pkgs[[2]], from = names(pkgs)[2])) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:35 These packages are missing from +## Bioconductor: bio_pkg1,bio_pkg2</span><span> +</span></CODE></PRE> +<pre><code class="language-r">if(emptyIsFalse(missing_pkg)) stop(&quot;Install packages&quot;) +</code></pre> +<pre><code>## Error in eval(expr, envir, enclos): Install packages +</code></pre> +<p>Or write your custom warning message:</p> +<pre><code class="language-r">{ missing_pkg &lt;- mapply(function(pkg, from) { -checkNameSpace(pkg, quietly = TRUE, from) + checkNameSpace(pkg, quietly = TRUE, from) }, pkg = pkgs, from = names(pkgs), SIMPLIFY = FALSE) + + cat( -&quot;Use `install.packages(c('&quot;, -paste0(missing_pkg[['CRAN']], collapse = &quot;','&quot;), -&quot;'))` to install CRAN packages\n&quot;, -sep = &quot;&quot; + &quot;Use `install.packages(c('&quot;, + paste0(missing_pkg[['CRAN']], collapse = &quot;','&quot;), + &quot;'))` to install CRAN packages\n&quot;, + sep = &quot;&quot; ) cat( -&quot;Use `BiocManager::install(c('&quot;, -paste0(missing_pkg[['Bioconductor']], collapse = &quot;','&quot;), -&quot;'))` to install Bioconductor packages\n&quot;, -sep = &quot;&quot; + &quot;Use `BiocManager::install(c('&quot;, + paste0(missing_pkg[['Bioconductor']], collapse = &quot;','&quot;), + &quot;'))` to install Bioconductor packages\n&quot;, + sep = &quot;&quot; ) if(emptyIsFalse(unlist(missing_pkg))) stop(&quot;Install packages&quot;) } -</code></pre> -<pre><code>## Use `install.packages(c('pkg1','pkg2'))` to install CRAN packages -## Use `BiocManager::install(c('bio_pkg1','bio_pkg2'))` to install Bioconductor packages -</code></pre> -<pre><code>## Error in eval(expr, envir, enclos): Install packages -</code></pre> -<h2 id="check-a-url-is-reachable-with-checkurl">check a URL is reachable with <code>checkUrl</code></h2> -<p>Useful if you need make some big HTTP requests.</p> -<pre><code class="language-r">checkUrl(&quot;https://google.com&quot;) -</code></pre> -<pre><code>## [1] TRUE -</code></pre> -<pre><code class="language-r">checkUrl(&quot;https://randomwebsite123.com&quot;, timeout = 1) -</code></pre> -<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:37 Bad url https:// -## randomwebsite123.com</span><span> -</span></CODE></PRE><PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:37 Timeout was reached: -<h2 id="randomwebsite123com-connection-timed-out-after-1001-millisecondsspanspan">[randomwebsite123.com] Connection timed out after 1001 milliseconds</span><span></h2> -<p></span></CODE></PRE></p> -<pre><code>## [1] FALSE -</code></pre> \ No newline at end of file +</code></pre> +<pre><code>## Use `install.packages(c('pkg1','pkg2'))` to install CRAN packages +## Use `BiocManager::install(c('bio_pkg1','bio_pkg2'))` to install Bioconductor packages +</code></pre> +<pre><code>## Error in eval(expr, envir, enclos): Install packages +</code></pre> +<h2 id="check-a-url-is-reachable-with-checkurl">check a URL is reachable with <code>checkUrl</code></h2> +<p>Useful if you need make some big HTTP requests.</p> +<pre><code class="language-r">checkUrl(&quot;https://google.com&quot;) +</code></pre> +<pre><code>## [1] TRUE +</code></pre> +<pre><code class="language-r">checkUrl(&quot;https://randomwebsite123.com&quot;, timeout = 1) +</code></pre> +<PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:37 Bad url https:// +## randomwebsite123.com</span><span> +</span></CODE></PRE><PRE class="fansi fansi-warning"><CODE>## Warning: <span style='color: #BBBB00;font-weight: bold;'>[WARNING] 2021-04-12 11:49:37 Timeout was reached: +<h2 id="randomwebsite123com-connection-timed-out-after-1001-millisecondsspanspan">[randomwebsite123.com] Connection timed out after 1001 milliseconds</span><span></h2> +<p></span></CODE></PRE></p> +<pre><code>## [1] FALSE +</code></pre> + + + + + + diff --git a/public/sps/dev/spscomps/index.html b/public/sps/dev/spscomps/index.html index 32f872d11..b62cf7c38 100644 --- a/public/sps/dev/spscomps/index.html +++ b/public/sps/dev/spscomps/index.html @@ -1,71 +1,1330 @@ -spsComps | sysPipe

    spsComps

    SPS Components package

    systemPipeShiny Components (spsComps) package is a collection of custom UI and + + + + + + + + + + + + + + + + + + + + +spsComps | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    spsComps

    + + +

    SPS Components package

    +

    systemPipeShiny Components (spsComps) package is a collection of custom UI and server components that are used in SPS main framework. If you see a component in SPS but want to outside the SPS framework, like in your own Shiny apps, -take a look at these components.

    Demos

    Demotypesource code
    shiny{blk}shinyapps.ioGithub{blk}
    RmdRmarkdown renderedRaw{blk}

    Installation

    Read the developer tools main page, not repeating here.

    Category

    {spsComps} can be divided into two major categories: UI and server.

    • UI: Shiny or HTML UI components, for example, a box, a gallery, a button, etc. With +take a look at these components.

      +

      Demos

      + + + + + + + + + + + + + + + + + + + + +
      Demotypesource code
      shiny{blk}shinyapps.ioGithub{blk}
      RmdRmarkdown renderedRaw{blk}
      + +

      Installation

      +

      Read the developer tools main page, not repeating here.

      +

      Category

      +

      {spsComps} can be divided into two major categories: UI and server.

      +
        +
      • UI: Shiny or HTML UI components, for example, a box, a gallery, a button, etc. With these most of components, you do NOT need a server, so they are compatible with -R markdown documents. See the UI page and its source code how we use the +R markdown documents. See the UI page and its source code how we use the components in a Rmd doucment. However, some UI components has server side functions, mostly like updateXXX functions. Mainly these functions are used to update/change the UI based on user behaviors. It is totally okay to use the UI functions without the -server functions (you will get static UI).
      • server: can only be run in the Shiny server. These functions are designed -to make back-end progress easier, extensions of original shiny Server functions.

      Functions reference manual

      In documents, we only highlight some important functions. Please read -the reference manuals for details of every function.

      some screenshots of spsComps

      Animations

      animation

      Loaders

      loader

      Buttons

      Code display button

      display_code

      Go top button

      gotop

      Input buttons

      buttons

      Button groups

      buttons_tab

      Table of buttons

      buttons_table

      gallery

      Logos

      logos

      Progress tracking

      Porgress panel

      pg_panel

      Timeline

      timeline

      Tooltips

      tooltips

      tooltips

      Popovers

      popovers

      popovers

      Colorful titles

      spstitle

      Colorful divider lines

      spshr

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/spscomps/index.xml b/public/sps/dev/spscomps/index.xml index ddd095110..51219a01f 100644 --- a/public/sps/dev/spscomps/index.xml +++ b/public/sps/dev/spscomps/index.xml @@ -1,1054 +1,1105 @@ -sysPipe – spsComps/sps/dev/spscomps/Recent content in spsComps on sysPipeHugo -- gohugo.ioSps: UI components/sps/dev/spscomps/ui/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/spscomps/ui/ -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/sps-gotop/js/sps_gotop.js"></script> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> -<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> -<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> -<p>For most of the UI components, you can view them in the <a href="https://lezhang.shinyapps.io/spsComps">online Shiny demo{blk}</a>. -Most but <strong>not all</strong> UI components work in a Rmarkdown document. Here we demostrate + + + sysPipe – spsComps + /sps/dev/spscomps/ + Recent content in spsComps on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sps: UI components + /sps/dev/spscomps/ui/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/spscomps/ui/ + + + + <link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/sps-gotop/js/sps_gotop.js"></script> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-js/js/sps-comps.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css/css/sps-comps.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-animation/js/sps_animation.js"></script> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome-animation/css/font-awesome-animation.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/all.min.css" rel="stylesheet" /> +<link href="../../../rmarkdown-libs/font-awesome/css/v4-shims.min.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/spsComps-css-loader-js/js/sps_cssloader.js"></script> +<link href="../../../rmarkdown-libs/spsComps-css-loader-css/css/css_loader.css" rel="stylesheet" /> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<script src="../../../rmarkdown-libs/sps-pop-tip/js/bs3pop_tip.js"></script> +<p>For most of the UI components, you can view them in the <a href="https://lezhang.shinyapps.io/spsComps">online Shiny demo{blk}</a>. +Most but <strong>not all</strong> UI components work in a Rmarkdown document. Here we demostrate how you could use some of them in a Rmarkdown doc. The source code of this -document is on <a href="https://raw.githubusercontent.com/systemPipeR/systemPipeR.github.io/main/content/en/sps/dev/spscomps/ui.Rmd">Github{blk}</a>.</p> -<h2 id="load-package">load package</h2> -<p>To start to use <code>spsComps</code>, load it in your Shiny app file or Rmarkdown file</p> -<pre><code class="language-r">library(spsComps) -</code></pre> -<pre><code>## Loading required package: shiny -</code></pre> -<pre><code class="language-r">library(magrittr) -</code></pre> -<p>So you can see it depends on <code>shiny</code> and <code>spsUtil</code>. When you load it, there is no -need to additionally load <code>shiny</code> or <code>spsUtil</code>.</p> -<h2 id="spsgotop"><code>spsGoTop</code></h2> -<p>A go top button.</p> -<pre><code class="language-r">spsGoTop() -</code></pre> -<div class="sps-gotop" id="gotop" style="right: 1rem;&#10;bottom: 10rem;&#10;fill: #337ab7;" data-toggle="tooltip" data-placement="left" title="Go Top" onclick="goTop()"> -<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> -<path d="M526.60727968 10.90185116 -a27.675 27.675 0 0 0-29.21455937 0 -c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 -394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903 -c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 -54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777 -c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 -42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 -6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492 -c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 -55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 -52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 -11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 -462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 -357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z"> -</path> -<path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 -1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 -82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 -30.59548842-82.51086798 68.34111062z"> -</path> -</svg> -</div> -<p>It will not be display inline of the Rmd, just simply call it and maybe change the -style as you want. By default, a “go to top” button will be created on the <strong>bottom-right</strong> -<strong>corner</strong>. Now scroll this page, and you should see it (the rocket button).</p> -<h2 id="gallery"><code>gallery</code></h2> -<pre><code class="language-r">texts &lt;- c(&quot;p1&quot;, &quot;p2&quot;, &quot;&quot;, &quot;p4&quot;, &quot;p5&quot;) +document is on <a href="https://raw.githubusercontent.com/systemPipeR/systemPipeR.github.io/main/content/en/sps/dev/spscomps/ui.Rmd">Github{blk}</a>.</p> +<h2 id="load-package">load package</h2> +<p>To start to use <code>spsComps</code>, load it in your Shiny app file or Rmarkdown file</p> +<pre><code class="language-r">library(spsComps) +</code></pre> +<pre><code>## Loading required package: shiny +</code></pre> +<pre><code class="language-r">library(magrittr) +</code></pre> +<p>So you can see it depends on <code>shiny</code> and <code>spsUtil</code>. When you load it, there is no +need to additionally load <code>shiny</code> or <code>spsUtil</code>.</p> +<h2 id="spsgotop"><code>spsGoTop</code></h2> +<p>A go top button.</p> +<pre><code class="language-r">spsGoTop() +</code></pre> +<div class="sps-gotop" id="gotop" style="right: 1rem;&#10;bottom: 10rem;&#10;fill: #337ab7;" data-toggle="tooltip" data-placement="left" title="Go Top" onclick="goTop()"> + <svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M526.60727968 10.90185116 + a27.675 27.675 0 0 0-29.21455937 0 + c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 + 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903 + c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 + 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777 + c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 + 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 + 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492 + c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 + 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 + 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 + 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 + 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 + 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z"> + </path> + <path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 + 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 + 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 + 30.59548842-82.51086798 68.34111062z"> + </path> + </svg> + </div> +<p>It will not be display inline of the Rmd, just simply call it and maybe change the +style as you want. By default, a “go to top” button will be created on the <strong>bottom-right</strong> +<strong>corner</strong>. Now scroll this page, and you should see it (the rocket button).</p> +<h2 id="gallery"><code>gallery</code></h2> +<pre><code class="language-r">texts &lt;- c(&quot;p1&quot;, &quot;p2&quot;, &quot;&quot;, &quot;p4&quot;, &quot;p5&quot;) hrefs &lt;- c(&quot;https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true&quot;, -&quot;&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true&quot;) + &quot;https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true&quot;, + &quot;&quot;, + &quot;https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true&quot;, + &quot;https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true&quot;) images &lt;- c(&quot;https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/3.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true&quot;, -&quot;https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true&quot;) + &quot;https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true&quot;, + &quot;https://github.com/lz100/spsComps/blob/master/img/3.jpg?raw=true&quot;, + &quot;https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true&quot;, + &quot;https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true&quot;) gallery( -texts = texts, hrefs = hrefs, images = images, -enlarge = TRUE, -enlarge_method = &quot;modal&quot; + texts = texts, hrefs = hrefs, images = images, + enlarge = TRUE, + enlarge_method = &quot;modal&quot; ) -</code></pre> -<div id="gallery6448598" class="col sps-gallery" style=""> -<p class="text-center h2" style="color: #0275d8;">Gallery</p> -<div class="row" style=" margin: 10px;"><div id=gallery6448598-1 class="col-sm-4 sps-tab-link" style="right: 1px;"> -<img -src="https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true" class="img-gallery" -height=300 width=400 -style="width: 100%;" -onclick=galEnlarge("#gallery6448598-1") -> -<a href="https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true" ><p class="text-center h4 ">p1</p></a> -</div> <div id=gallery6448598-2 class="col-sm-4 sps-tab-link" style="right: 1px;"> -<img -src="https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true" class="img-gallery" -height=300 width=400 -style="width: 100%;" -onclick=galEnlarge("#gallery6448598-2") -> -<a href="https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true" ><p class="text-center h4 ">p2</p></a> -</div> <div id=gallery6448598-3 class="col-sm-4 sps-tab-link" style="right: 1px;"> -<img -src="https://github.com/lz100/spsComps/blob/master/img/3.jpg?raw=true" class="img-gallery" -height=300 width=400 -style="width: 100%;" -onclick=galEnlarge("#gallery6448598-3") -> -<a ><p class="text-center h4 gallery-nohover">&nbsp;</p></a> -</div> <div id=gallery6448598-4 class="col-sm-4 sps-tab-link" style="right: 1px;"> -<img -src="https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true" class="img-gallery" -height=300 width=400 -style="width: 100%;" -onclick=galEnlarge("#gallery6448598-4") -> -<a href="https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true" ><p class="text-center h4 ">p4</p></a> -</div> <div id=gallery6448598-5 class="col-sm-4 sps-tab-link" style="right: 1px;"> -<img -src="https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true" class="img-gallery" -height=300 width=400 -style="width: 100%;" -onclick=galEnlarge("#gallery6448598-5") -> -<a href="https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true" ><p class="text-center h4 ">p5</p></a> -</div></div> -<!--SHINY.SINGLETON[7fdec3ac87205a269983f4a367a45b9599c89d0b]--> -<div id="sps-gallery-modal" class="gallery-modal" onclick="galModalClose()"> -<span class="gallery-modal-close">X</span> -<img id="sps-gallery-modal-content" class="gallery-modal-content"/> -<div class="gallery-caption"></div> -</div> -<!--/SHINY.SINGLETON[7fdec3ac87205a269983f4a367a45b9599c89d0b]--> -<script>fixGalHeight("gallery6448598")</script> -</div> -<p>You can show a gallery of plots you make in the Rmd and when people click it, -it will be enlarged. You can also specify a link for each image.</p> -<h2 id="logos">Logos</h2> -<h3 id="a-single-one-with-hexlogo">a single one with <code>hexLogo</code></h3> -<pre><code class="language-r">hexLogo( -&quot;logo&quot;, &quot;Logo&quot;, -hex_img = &quot;https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg&quot;, -hex_link = &quot;https://www.google.com&quot;, -footer = &quot;Footer&quot;, -footer_link = &quot;https://www.google.com&quot; +</code></pre> +<div id="gallery6448598" class="col sps-gallery" style=""> +<p class="text-center h2" style="color: #0275d8;">Gallery</p> +<div class="row" style=" margin: 10px;"><div id=gallery6448598-1 class="col-sm-4 sps-tab-link" style="right: 1px;"> + <img + src="https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true" class="img-gallery" + height=300 width=400 + style="width: 100%;" + onclick=galEnlarge("#gallery6448598-1") + > + <a href="https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true" ><p class="text-center h4 ">p1</p></a> +</div> <div id=gallery6448598-2 class="col-sm-4 sps-tab-link" style="right: 1px;"> + <img + src="https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true" class="img-gallery" + height=300 width=400 + style="width: 100%;" + onclick=galEnlarge("#gallery6448598-2") + > + <a href="https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true" ><p class="text-center h4 ">p2</p></a> +</div> <div id=gallery6448598-3 class="col-sm-4 sps-tab-link" style="right: 1px;"> + <img + src="https://github.com/lz100/spsComps/blob/master/img/3.jpg?raw=true" class="img-gallery" + height=300 width=400 + style="width: 100%;" + onclick=galEnlarge("#gallery6448598-3") + > + <a ><p class="text-center h4 gallery-nohover">&nbsp;</p></a> +</div> <div id=gallery6448598-4 class="col-sm-4 sps-tab-link" style="right: 1px;"> + <img + src="https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true" class="img-gallery" + height=300 width=400 + style="width: 100%;" + onclick=galEnlarge("#gallery6448598-4") + > + <a href="https://github.com/lz100/spsComps/blob/master/img/4.jpg?raw=true" ><p class="text-center h4 ">p4</p></a> +</div> <div id=gallery6448598-5 class="col-sm-4 sps-tab-link" style="right: 1px;"> + <img + src="https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true" class="img-gallery" + height=300 width=400 + style="width: 100%;" + onclick=galEnlarge("#gallery6448598-5") + > + <a href="https://github.com/lz100/spsComps/blob/master/img/5.jpg?raw=true" ><p class="text-center h4 ">p5</p></a> +</div></div> +<!--SHINY.SINGLETON[7fdec3ac87205a269983f4a367a45b9599c89d0b]--> +<div id="sps-gallery-modal" class="gallery-modal" onclick="galModalClose()"> +<span class="gallery-modal-close">X</span> +<img id="sps-gallery-modal-content" class="gallery-modal-content"/> +<div class="gallery-caption"></div> +</div> +<!--/SHINY.SINGLETON[7fdec3ac87205a269983f4a367a45b9599c89d0b]--> +<script>fixGalHeight("gallery6448598")</script> +</div> +<p>You can show a gallery of plots you make in the Rmd and when people click it, +it will be enlarged. You can also specify a link for each image.</p> +<h2 id="logos">Logos</h2> +<h3 id="a-single-one-with-hexlogo">a single one with <code>hexLogo</code></h3> +<pre><code class="language-r">hexLogo( + &quot;logo&quot;, &quot;Logo&quot;, + hex_img = &quot;https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg&quot;, + hex_link = &quot;https://www.google.com&quot;, + footer = &quot;Footer&quot;, + footer_link = &quot;https://www.google.com&quot; ) -</code></pre> -<div id="logo" class="hex-container"> -<span class="text-info">Logo</span><br> -<svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> -<defs> -<pattern id="logo-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> -<image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> -</pattern> -</defs> -<a href="https://www.google.com" ><polygon class="hex" points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#logo-hex)" stroke="var(--primary)"stroke-width="2"/></a> -<text x=10 y=115><a class="powerby-link"href="https://www.google.com" target="_blank">Footer</a></text> -</svg> -</div> -<h3 id="a-panel-of-logos-with-hexpanel">a panel of logos with <code>hexPanel</code></h3> -<pre><code class="language-r">hexPanel( -&quot;demo1&quot;, &quot;&quot; , -rep(&quot;https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg&quot;, 2) +</code></pre> +<div id="logo" class="hex-container"> + <span class="text-info">Logo</span><br> + <svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <pattern id="logo-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> + <image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> + </pattern> + </defs> + <a href="https://www.google.com" ><polygon class="hex" points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#logo-hex)" stroke="var(--primary)"stroke-width="2"/></a> + <text x=10 y=115><a class="powerby-link"href="https://www.google.com" target="_blank">Footer</a></text> + </svg> +</div> +<h3 id="a-panel-of-logos-with-hexpanel">a panel of logos with <code>hexPanel</code></h3> +<pre><code class="language-r">hexPanel( + &quot;demo1&quot;, &quot;&quot; , + rep(&quot;https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg&quot;, 2) ) -</code></pre> -<div class="row hex-panel"> -<h5 class="text-primary"></h5> -<div class="hex-item"><div id="demo11" class="hex-container"> -<svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> -<defs> -<pattern id="demo11-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> -<image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> -</pattern> -</defs> -<polygon points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#demo11-hex)" stroke="var(--primary)"stroke-width="2"/> -</svg> -</div></div> -<div class="hex-item"><div id="demo12" class="hex-container"> -<svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> -<defs> -<pattern id="demo12-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> -<image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> -</pattern> -</defs> -<polygon points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#demo12-hex)" stroke="var(--primary)"stroke-width="2"/> -</svg> -</div></div> -</div> -<h2 id="buttons">Buttons</h2> -<h3 id="some-colorful-buttons-hreftab">Some colorful buttons <code>hrefTab</code></h3> -<pre><code class="language-r">hrefTab( -title = &quot;Different background and text colors&quot;, -label_texts = c(&quot;Go top&quot;, &quot;Disabled&quot;, &quot;Email me&quot;), -hrefs = c(&quot;#&quot;, &quot;&quot;, &quot;mailto:xxx@abc.com&quot;), -bg_colors = c(&quot;green&quot;, &quot;#eee&quot;, &quot;orange&quot;), -text_colors = c(&quot;#caffc1&quot;, &quot;black&quot;, &quot;blue&quot;) +</code></pre> +<div class="row hex-panel"> +<h5 class="text-primary"></h5> +<div class="hex-item"><div id="demo11" class="hex-container"> + <svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <pattern id="demo11-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> + <image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> + </pattern> + </defs> + <polygon points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#demo11-hex)" stroke="var(--primary)"stroke-width="2"/> + </svg> +</div></div> +<div class="hex-item"><div id="demo12" class="hex-container"> + <svg class="hex-box" viewBox="0 0 100 115" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <pattern id="demo12-hex" patternUnits="userSpaceOnUse" height="100%" width="100%"> + <image href="https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg" x="-10" y="-20" height="125%" width="125%" /> + </pattern> + </defs> + <polygon points="50 1 95 25 95 75 50 99 5 75 5 25"fill="url(#demo12-hex)" stroke="var(--primary)"stroke-width="2"/> + </svg> +</div></div> +</div> +<h2 id="buttons">Buttons</h2> +<h3 id="some-colorful-buttons-hreftab">Some colorful buttons <code>hrefTab</code></h3> +<pre><code class="language-r">hrefTab( + title = &quot;Different background and text colors&quot;, + label_texts = c(&quot;Go top&quot;, &quot;Disabled&quot;, &quot;Email me&quot;), + hrefs = c(&quot;#&quot;, &quot;&quot;, &quot;mailto:xxx@abc.com&quot;), + bg_colors = c(&quot;green&quot;, &quot;#eee&quot;, &quot;orange&quot;), + text_colors = c(&quot;#caffc1&quot;, &quot;black&quot;, &quot;blue&quot;) ) -</code></pre> -<div id="list-tab8360116" class="col"> -<p class="h4" style="color: #0275d8; text-align: left;">Different background and text colors</p> -<div><a -href="#" -class="href-button sps-tab-link " -style="background-color: green; color: #caffc1;" -> -Go top -</a> -<a -href="javascript:null;" -class="href-button sps-tab-link nohover" -style="background-color: #eee; color: black;" -> -Disabled -</a> -<a -href="mailto:xxx@abc.com" -class="href-button sps-tab-link " -style="background-color: orange; color: blue;" -> -Email me -</a> -</div> -</div> -<h3 id="a-table-colorful-buttons-hreftable">A table colorful buttons <code>hrefTable</code></h3> -<pre><code class="language-r">hrefTable( -title = &quot;Change button color and text color&quot;, -item_titles = c(&quot;workflow 1&quot;, &quot;No links&quot;), -item_labels = list(c(&quot;tab 1&quot;), c(&quot;tab 3&quot;, &quot;tab 4&quot;)), -item_hrefs = list(c(&quot;https://www.google.com/&quot;), c(&quot;&quot;, &quot;&quot;)), -item_bg_colors = list(c(&quot;blue&quot;), c(&quot;red&quot;, &quot;orange&quot;)), -item_text_colors = list(c(&quot;black&quot;), c(&quot;yellow&quot;, &quot;green&quot;)), -style = &quot;display: table;&quot; +</code></pre> +<div id="list-tab8360116" class="col"> +<p class="h4" style="color: #0275d8; text-align: left;">Different background and text colors</p> +<div><a + href="#" + class="href-button sps-tab-link " + style="background-color: green; color: #caffc1;" + > + Go top +</a> + <a + href="javascript:null;" + class="href-button sps-tab-link nohover" + style="background-color: #eee; color: black;" + > + Disabled +</a> + <a + href="mailto:xxx@abc.com" + class="href-button sps-tab-link " + style="background-color: orange; color: blue;" + > + Email me +</a> +</div> +</div> +<h3 id="a-table-colorful-buttons-hreftable">A table colorful buttons <code>hrefTable</code></h3> +<pre><code class="language-r">hrefTable( + title = &quot;Change button color and text color&quot;, + item_titles = c(&quot;workflow 1&quot;, &quot;No links&quot;), + item_labels = list(c(&quot;tab 1&quot;), c(&quot;tab 3&quot;, &quot;tab 4&quot;)), + item_hrefs = list(c(&quot;https://www.google.com/&quot;), c(&quot;&quot;, &quot;&quot;)), + item_bg_colors = list(c(&quot;blue&quot;), c(&quot;red&quot;, &quot;orange&quot;)), + item_text_colors = list(c(&quot;black&quot;), c(&quot;yellow&quot;, &quot;green&quot;)), + style = &quot;display: table;&quot; ) -</code></pre> -<table id="list-table4793772" class="table table-hover table-href table-striped" style="display: table;"> -<caption class="text-center h2" style="color: #0275d8;">Change button color and text color</caption> -<thead> -<tr class="info"> -<th>Category</th> -<th>Options</th> -</tr> -</thead> -<tbody> <tr> -<td class="h4" style="color: #0275d8;">workflow 1</td> -<td><a -href="https://www.google.com/" -class="href-button sps-tab-link" -style="background-color: blue; color: black;" -> -tab 1 -</a></td> -</tr> -<tr> -<td class="h4" style="color: #0275d8;">No links</td> -<td><a -href="javascript:null;" -class="href-button nohover sps-tab-link" -style="background-color: red; color: yellow;" -> -tab 3 -</a><a -href="javascript:null;" -class="href-button nohover sps-tab-link" -style="background-color: orange; color: green;" -> -tab 4 -</a></td> -</tr> -</tbody> -</table> -<pre><code class="language-r">hrefTable( -title = &quot;Change row name colors and width&quot;, -item_titles = c(&quot;Green&quot;, &quot;Red&quot;, &quot;Orange&quot;), -item_labels = list(c(&quot;tab 1&quot;), c(&quot;tab 3&quot;, &quot;tab 4&quot;), c(&quot;tab 5&quot;, &quot;tab 6&quot;, &quot;tab 7&quot;)), -item_hrefs = list( -c(&quot;https://www.google.com/&quot;), -c(&quot;&quot;, &quot;&quot;), -c(&quot;https://www.google.com/&quot;, &quot;https://www.google.com/&quot;, &quot;&quot;) -), -item_title_colors = c(&quot;green&quot;, &quot;red&quot;, &quot;orange&quot;), -style = &quot;display: table;&quot; +</code></pre> +<table id="list-table4793772" class="table table-hover table-href table-striped" style="display: table;"> +<caption class="text-center h2" style="color: #0275d8;">Change button color and text color</caption> +<thead> + <tr class="info"> + <th>Category</th> + <th>Options</th> + </tr> +</thead> +<tbody> <tr> + <td class="h4" style="color: #0275d8;">workflow 1</td> + <td><a + href="https://www.google.com/" + class="href-button sps-tab-link" + style="background-color: blue; color: black;" +> + tab 1 +</a></td> + </tr> + <tr> + <td class="h4" style="color: #0275d8;">No links</td> + <td><a + href="javascript:null;" + class="href-button nohover sps-tab-link" + style="background-color: red; color: yellow;" +> + tab 3 +</a><a + href="javascript:null;" + class="href-button nohover sps-tab-link" + style="background-color: orange; color: green;" +> + tab 4 +</a></td> + </tr> +</tbody> +</table> +<pre><code class="language-r">hrefTable( + title = &quot;Change row name colors and width&quot;, + item_titles = c(&quot;Green&quot;, &quot;Red&quot;, &quot;Orange&quot;), + item_labels = list(c(&quot;tab 1&quot;), c(&quot;tab 3&quot;, &quot;tab 4&quot;), c(&quot;tab 5&quot;, &quot;tab 6&quot;, &quot;tab 7&quot;)), + item_hrefs = list( + c(&quot;https://www.google.com/&quot;), + c(&quot;&quot;, &quot;&quot;), + c(&quot;https://www.google.com/&quot;, &quot;https://www.google.com/&quot;, &quot;&quot;) + ), + item_title_colors = c(&quot;green&quot;, &quot;red&quot;, &quot;orange&quot;), + style = &quot;display: table;&quot; ) -</code></pre> -<table id="list-table3903696" class="table table-hover table-href table-striped" style="display: table;"> -<caption class="text-center h2" style="color: #0275d8;">Change row name colors and width</caption> -<thead> -<tr class="info"> -<th>Category</th> -<th>Options</th> -</tr> -</thead> -<tbody> <tr> -<td class="h4" style="color: green;">Green</td> -<td><a -href="https://www.google.com/" -class="href-button sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 1 -</a></td> -</tr> -<tr> -<td class="h4" style="color: red;">Red</td> -<td><a -href="javascript:null;" -class="href-button nohover sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 3 -</a><a -href="javascript:null;" -class="href-button nohover sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 4 -</a></td> -</tr> -<tr> -<td class="h4" style="color: orange;">Orange</td> -<td><a -href="https://www.google.com/" -class="href-button sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 5 -</a><a -href="https://www.google.com/" -class="href-button sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 6 -</a><a -href="javascript:null;" -class="href-button nohover sps-tab-link" -style="background-color: #337ab7; color: white;" -> -tab 7 -</a></td> -</tr> -</tbody> -</table> -<p>The table caption is on top in Shiny but on bottom in Rmd. You may also want to -add the <code>style = &quot;display: table;&quot;</code> in Rmd to make the table occupy full length of -the document in R markdown.</p> -<h2 id="animations">Animations</h2> -<h3 id="animateui"><code>animateUI</code></h3> -<p>Add animations to existing components with <strong><code>animateUI</code></strong></p> -<h4 id="to-buttons">To buttons</h4> -<pre><code class="language-r">tags$button(id = &quot;btn1&quot;, &quot;random button&quot;) -</code></pre> -<p><button id="btn1">random button</button></p> -<pre><code class="language-r">animateUI(&quot;btn1&quot;, animation = &quot;ring&quot;) -</code></pre> -<script>addSpsAnimation("#btn1", "sps-animation faa-ring animated ")</script> -<h4 id="to-some-text">To some text</h4> -<pre><code class="language-r">p(id = &quot;mytext&quot;, class = &quot;text-red&quot;, &quot;some move text&quot;) -</code></pre> -<p id="mytext" class="text-red">some move text</p> -<pre><code class="language-r">animateUI(&quot;mytext&quot;, animation = &quot;horizontal&quot;, speed = &quot;fast&quot;) -</code></pre> -<script>addSpsAnimation("#mytext", "sps-animation faa-horizontal animated faa-fast")</script> -<h4 id="on-hover-move-mouse-on-the-red-thumb">On hover, move mouse on the red thumb</h4> -<pre><code class="language-r">tags$button( -id = &quot;btn2&quot;, -icon(id = &quot;myicon&quot;, &quot;thumbs-o-up&quot;), -style = &quot;color: red; boarder: initial; border-color: transparent;&quot; +</code></pre> +<table id="list-table3903696" class="table table-hover table-href table-striped" style="display: table;"> +<caption class="text-center h2" style="color: #0275d8;">Change row name colors and width</caption> +<thead> + <tr class="info"> + <th>Category</th> + <th>Options</th> + </tr> +</thead> +<tbody> <tr> + <td class="h4" style="color: green;">Green</td> + <td><a + href="https://www.google.com/" + class="href-button sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 1 +</a></td> + </tr> + <tr> + <td class="h4" style="color: red;">Red</td> + <td><a + href="javascript:null;" + class="href-button nohover sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 3 +</a><a + href="javascript:null;" + class="href-button nohover sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 4 +</a></td> + </tr> + <tr> + <td class="h4" style="color: orange;">Orange</td> + <td><a + href="https://www.google.com/" + class="href-button sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 5 +</a><a + href="https://www.google.com/" + class="href-button sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 6 +</a><a + href="javascript:null;" + class="href-button nohover sps-tab-link" + style="background-color: #337ab7; color: white;" +> + tab 7 +</a></td> + </tr> +</tbody> +</table> +<p>The table caption is on top in Shiny but on bottom in Rmd. You may also want to +add the <code>style = &quot;display: table;&quot;</code> in Rmd to make the table occupy full length of +the document in R markdown.</p> +<h2 id="animations">Animations</h2> +<h3 id="animateui"><code>animateUI</code></h3> +<p>Add animations to existing components with <strong><code>animateUI</code></strong></p> +<h4 id="to-buttons">To buttons</h4> +<pre><code class="language-r">tags$button(id = &quot;btn1&quot;, &quot;random button&quot;) +</code></pre> +<p><button id="btn1">random button</button></p> +<pre><code class="language-r">animateUI(&quot;btn1&quot;, animation = &quot;ring&quot;) +</code></pre> +<script>addSpsAnimation("#btn1", "sps-animation faa-ring animated ")</script> +<h4 id="to-some-text">To some text</h4> +<pre><code class="language-r">p(id = &quot;mytext&quot;, class = &quot;text-red&quot;, &quot;some move text&quot;) +</code></pre> +<p id="mytext" class="text-red">some move text</p> +<pre><code class="language-r">animateUI(&quot;mytext&quot;, animation = &quot;horizontal&quot;, speed = &quot;fast&quot;) +</code></pre> +<script>addSpsAnimation("#mytext", "sps-animation faa-horizontal animated faa-fast")</script> +<h4 id="on-hover-move-mouse-on-the-red-thumb">On hover, move mouse on the red thumb</h4> +<pre><code class="language-r">tags$button( + id = &quot;btn2&quot;, + icon(id = &quot;myicon&quot;, &quot;thumbs-o-up&quot;), + style = &quot;color: red; boarder: initial; border-color: transparent;&quot; ) -</code></pre> -<button id="btn2" style="color: red; boarder: initial; border-color: transparent;"> -<i class="fa fa-thumbs-o-up" role="presentation" aria-label="thumbs-o-up icon" id="myicon"></i> -</button> -<pre><code class="language-r">animateUI(&quot;btn2&quot;, animation = &quot;bounce&quot;, speed = &quot;fast&quot;, hover = TRUE) -</code></pre> -<script>addSpsAnimation("#btn2", "sps-animation faa-bounce animated-hover faa-fast")</script> -<h4 id="inline-animation">Inline animation</h4> -<p>You can add animations to inline Rmarkdown text by giving it a HTML tag and id, like -following:</p> -<pre><code class="language-html">some text some text &lt;span id=&quot;some-text&quot; style=&quot;display: inline-block&quot;&gt;some text&lt;/span&gt; some text some text -</code></pre> -<p>some text some text <span id="some-text" style="display: inline-block">some text</span> some text some text</p> -<pre><code class="language-r">animateUI(selector = &quot;some-text&quot;, animation = &quot;ring&quot;) -</code></pre> -<script>addSpsAnimation("#some-text", "sps-animation faa-ring animated ")</script> -<p><strong>Most animations required the target tag to have CSS display “block” or “inline-block”</strong>, -you can append this by adding <code>style=&quot;display: inline-block&quot;</code> to the tag as shown above -or check examples below.</p> -<hr> -<h3 id="animateappend"><code>animateAppend</code></h3> -<p>Add animations with pipe <code>%&gt;%</code> by <strong><code>animateAppend</code></strong></p> -<pre><code class="language-r">icon(&quot;home&quot;) %&gt;% -animateAppend(&quot;ring&quot;) -</code></pre> -<p><i aria-label="home icon" class="fa fa-home sps-animation faa-ring animated " role="presentation"></i></p> -<pre><code class="language-r">tags$p(&quot;Append animation&quot;, class = &quot;text-primary&quot;, style=&quot;display: inline-block&quot;) %&gt;% -animateAppend(&quot;pulse&quot;) -</code></pre> -<p class="text-primary sps-animation faa-pulse animated " style="display: inline-block">Append animation</p> -<hr> -<h3 id="animateappendnested"><code>animateAppendNested</code></h3> -<p>Apply multiple animations to the same component</p> -<pre><code class="language-r">tags$b(&quot;Nested animations&quot;, class = &quot;text-primary&quot;) %&gt;% -animateAppendNested(&quot;ring&quot;) %&gt;% -animateAppendNested(&quot;pulse&quot;) %&gt;% -animateAppendNested(&quot;passing&quot;) -</code></pre> -<div style="display: inline-block;" class="sps-animation faa-passing animated "> -<div style="display: inline-block;" class="sps-animation faa-pulse animated "> -<div style="display: inline-block;" class="sps-animation faa-ring animated "> -<b class="text-primary">Nested animations</b> -</div> -</div> -</div> -<pre><code class="language-r">tags$b(&quot;Nested animations display changed&quot;, class = &quot;text-primary&quot;) %&gt;% -animateAppendNested(&quot;ring&quot;) %&gt;% -animateAppendNested(&quot;pulse&quot;, display = &quot;block&quot;, style = &quot;width: 30%&quot;) -</code></pre> -<div class="sps-animation faa-pulse animated " style="display: block; width: 30%"> -<div style="display: inline-block;" class="sps-animation faa-ring animated "> -<b class="text-primary">Nested animations display changed</b> -</div> -</div> -<hr> -<h3 id="animateicon"><code>animateIcon</code></h3> -<p>Here is a convenient function that allows you to create font-awesome icons with +</code></pre> +<button id="btn2" style="color: red; boarder: initial; border-color: transparent;"> +<i class="fa fa-thumbs-o-up" role="presentation" aria-label="thumbs-o-up icon" id="myicon"></i> +</button> +<pre><code class="language-r">animateUI(&quot;btn2&quot;, animation = &quot;bounce&quot;, speed = &quot;fast&quot;, hover = TRUE) +</code></pre> +<script>addSpsAnimation("#btn2", "sps-animation faa-bounce animated-hover faa-fast")</script> +<h4 id="inline-animation">Inline animation</h4> +<p>You can add animations to inline Rmarkdown text by giving it a HTML tag and id, like +following:</p> +<pre><code class="language-html">some text some text &lt;span id=&quot;some-text&quot; style=&quot;display: inline-block&quot;&gt;some text&lt;/span&gt; some text some text +</code></pre> +<p>some text some text <span id="some-text" style="display: inline-block">some text</span> some text some text</p> +<pre><code class="language-r">animateUI(selector = &quot;some-text&quot;, animation = &quot;ring&quot;) +</code></pre> +<script>addSpsAnimation("#some-text", "sps-animation faa-ring animated ")</script> +<p><strong>Most animations required the target tag to have CSS display “block” or “inline-block”</strong>, +you can append this by adding <code>style=&quot;display: inline-block&quot;</code> to the tag as shown above +or check examples below.</p> +<hr> +<h3 id="animateappend"><code>animateAppend</code></h3> +<p>Add animations with pipe <code>%&gt;%</code> by <strong><code>animateAppend</code></strong></p> +<pre><code class="language-r">icon(&quot;home&quot;) %&gt;% + animateAppend(&quot;ring&quot;) +</code></pre> +<p><i aria-label="home icon" class="fa fa-home sps-animation faa-ring animated " role="presentation"></i></p> +<pre><code class="language-r">tags$p(&quot;Append animation&quot;, class = &quot;text-primary&quot;, style=&quot;display: inline-block&quot;) %&gt;% + animateAppend(&quot;pulse&quot;) +</code></pre> +<p class="text-primary sps-animation faa-pulse animated " style="display: inline-block">Append animation</p> +<hr> +<h3 id="animateappendnested"><code>animateAppendNested</code></h3> +<p>Apply multiple animations to the same component</p> +<pre><code class="language-r">tags$b(&quot;Nested animations&quot;, class = &quot;text-primary&quot;) %&gt;% + animateAppendNested(&quot;ring&quot;) %&gt;% + animateAppendNested(&quot;pulse&quot;) %&gt;% + animateAppendNested(&quot;passing&quot;) +</code></pre> +<div style="display: inline-block;" class="sps-animation faa-passing animated "> +<div style="display: inline-block;" class="sps-animation faa-pulse animated "> +<div style="display: inline-block;" class="sps-animation faa-ring animated "> +<b class="text-primary">Nested animations</b> +</div> +</div> +</div> +<pre><code class="language-r">tags$b(&quot;Nested animations display changed&quot;, class = &quot;text-primary&quot;) %&gt;% + animateAppendNested(&quot;ring&quot;) %&gt;% + animateAppendNested(&quot;pulse&quot;, display = &quot;block&quot;, style = &quot;width: 30%&quot;) +</code></pre> +<div class="sps-animation faa-pulse animated " style="display: block; width: 30%"> +<div style="display: inline-block;" class="sps-animation faa-ring animated "> +<b class="text-primary">Nested animations display changed</b> +</div> +</div> +<hr> +<h3 id="animateicon"><code>animateIcon</code></h3> +<p>Here is a convenient function that allows you to create font-awesome icons with animations and customize, color, size, etc, an enhanced version of original -<code>shiny::icon</code> and can also be used in Rmarkdown.</p> -<h4 id="default">Default</h4> -<p>Default is the same as original icon</p> -<pre><code class="language-r">animateIcon(&quot;home&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home animated " style="color: ;"></i></p> -<h4 id="animation-and-color">Animation and color</h4> -<pre><code class="language-r">animateIcon(name = &quot;home&quot;, animation = &quot;horizontal&quot;, speed = &quot;slow&quot;, color =&quot;red&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home faa-horizontal animated faa-slow" style="color: red;"></i></p> -<h4 id="add-to-a-button">Add to a button</h4> -<pre><code class="language-r">tags$button(animateIcon(&quot;spinner&quot;, &quot;spin&quot;, &quot;fast&quot;), &quot;A button&quot;) -</code></pre> -<button> -<i class="fa sps-animation fa-spinner faa-spin animated faa-fast" style="color: ;"></i> +<code>shiny::icon</code> and can also be used in Rmarkdown.</p> +<h4 id="default">Default</h4> +<p>Default is the same as original icon</p> +<pre><code class="language-r">animateIcon(&quot;home&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home animated " style="color: ;"></i></p> +<h4 id="animation-and-color">Animation and color</h4> +<pre><code class="language-r">animateIcon(name = &quot;home&quot;, animation = &quot;horizontal&quot;, speed = &quot;slow&quot;, color =&quot;red&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home faa-horizontal animated faa-slow" style="color: red;"></i></p> +<h4 id="add-to-a-button">Add to a button</h4> +<pre><code class="language-r">tags$button(animateIcon(&quot;spinner&quot;, &quot;spin&quot;, &quot;fast&quot;), &quot;A button&quot;) +</code></pre> +<button> +<i class="fa sps-animation fa-spinner faa-spin animated faa-fast" style="color: ;"></i> A button -</button> -<h4 id="on-hover">on hover</h4> -<pre><code class="language-r">animateIcon(name = &quot;wrench&quot;, animation = &quot;wrench&quot;, hover = TRUE, color =&quot;green&quot;) -</code></pre> -<p><i class="fa sps-animation fa-wrench faa-wrench animated-hover " style="color: green;"></i></p> -<h4 id="change-size">Change size</h4> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;xs&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-xs animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;sm&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-sm animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;lg&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-lg animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;2x&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-2x animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;3x&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-3x animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;5x&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-5x animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;7x&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-7x animated " style="color: ;"></i></p> -<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;10x&quot;) -</code></pre> -<p><i class="fa sps-animation fa-home fa-10x animated " style="color: ;"></i></p> -<hr> -<h2 id="loaders">Loaders</h2> -<p>Add loaders to indicate busy status. Most cases, loaders are added by a backend +</button> +<h4 id="on-hover">on hover</h4> +<pre><code class="language-r">animateIcon(name = &quot;wrench&quot;, animation = &quot;wrench&quot;, hover = TRUE, color =&quot;green&quot;) +</code></pre> +<p><i class="fa sps-animation fa-wrench faa-wrench animated-hover " style="color: green;"></i></p> +<h4 id="change-size">Change size</h4> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;xs&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-xs animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;sm&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-sm animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;lg&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-lg animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;2x&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-2x animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;3x&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-3x animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;5x&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-5x animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;7x&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-7x animated " style="color: ;"></i></p> +<pre><code class="language-r">animateIcon(&quot;home&quot;, size = &quot;10x&quot;) +</code></pre> +<p><i class="fa sps-animation fa-home fa-10x animated " style="color: ;"></i></p> +<hr> +<h2 id="loaders">Loaders</h2> +<p>Add loaders to indicate busy status. Most cases, loaders are added by a backend server to show the busy processing status and are removed when the process is done. -Rmarkdown documents does not have a server, but you can still add some loaders.</p> -<h3 id="cssloader"><code>cssLoader</code></h3> -<h4 id="default-loaders">Default loaders</h4> -<p>There are 12 different default loaders: “circle,” “dual-ring,” “facebook,” “heart,” -“ring,” “roller,” “default,” “ellipsis,” “grid,” “hourglass,” “ripple,” “spinner.”</p> -<pre><code class="language-r">cssLoader(height = &quot;100px&quot;) -</code></pre> -<div id="spsloader-913278546" class="sps-cssloader" style="height: 100px; width: 100px; display: block; opacity: 1;"> -<script> -$(function(){ -$("#spsloader-913278546").prepend(chooseLoader("spsloader-913278546", "default", "", "#337ab7", "100px", "100px")); -}); -</script> -</div> -<br> -<p>customize it:</p> -<pre><code class="language-r">cssLoader(type = &quot;grid&quot;, height = &quot;150px&quot;, color = &quot;orange&quot;) -</code></pre> -<div id="spsloader-298435617" class="sps-cssloader" style="height: 150px; width: 150px; display: block; opacity: 1;"> -<script> -$(function(){ -$("#spsloader-298435617").prepend(chooseLoader("spsloader-298435617", "grid", "", "orange", "150px", "150px")); -}); -</script> -</div> -<br> -<p>Add to a button:</p> -<pre><code class="language-r">tags$button( -## `inline = TRUE` is important if you want loader and -## text in the same line. -cssLoader(is_icon = TRUE, inline = TRUE, color = &quot;#3a7bd5&quot;), -&quot;A button&quot; +Rmarkdown documents does not have a server, but you can still add some loaders.</p> +<h3 id="cssloader"><code>cssLoader</code></h3> +<h4 id="default-loaders">Default loaders</h4> +<p>There are 12 different default loaders: “circle,” “dual-ring,” “facebook,” “heart,” +“ring,” “roller,” “default,” “ellipsis,” “grid,” “hourglass,” “ripple,” “spinner.”</p> +<pre><code class="language-r">cssLoader(height = &quot;100px&quot;) +</code></pre> +<div id="spsloader-913278546" class="sps-cssloader" style="height: 100px; width: 100px; display: block; opacity: 1;"> +<script> + $(function(){ + $("#spsloader-913278546").prepend(chooseLoader("spsloader-913278546", "default", "", "#337ab7", "100px", "100px")); + }); +</script> +</div> +<br> +<p>customize it:</p> +<pre><code class="language-r">cssLoader(type = &quot;grid&quot;, height = &quot;150px&quot;, color = &quot;orange&quot;) +</code></pre> +<div id="spsloader-298435617" class="sps-cssloader" style="height: 150px; width: 150px; display: block; opacity: 1;"> +<script> + $(function(){ + $("#spsloader-298435617").prepend(chooseLoader("spsloader-298435617", "grid", "", "orange", "150px", "150px")); + }); +</script> +</div> +<br> +<p>Add to a button:</p> +<pre><code class="language-r">tags$button( + ## `inline = TRUE` is important if you want loader and + ## text in the same line. + cssLoader(is_icon = TRUE, inline = TRUE, color = &quot;#3a7bd5&quot;), + &quot;A button&quot; ) -</code></pre> -<button> -<i id="spsloader-934216857" class="sps-cssloader" style="height: 1.5rem; width: 1.5rem; display: inline-block; opacity: 1;"> -<script> -$(function(){ -$("#spsloader-934216857").prepend(chooseLoader("spsloader-934216857", "default", "", "#3a7bd5", "1.5rem", "1.5rem")); -}); -</script> -</i> +</code></pre> +<button> +<i id="spsloader-934216857" class="sps-cssloader" style="height: 1.5rem; width: 1.5rem; display: inline-block; opacity: 1;"> +<script> + $(function(){ + $("#spsloader-934216857").prepend(chooseLoader("spsloader-934216857", "default", "", "#3a7bd5", "1.5rem", "1.5rem")); + }); +</script> +</i> A button -</button> -<h4 id="your-own-loaders">Your own loaders</h4> -<p>You can choose a gif to be a your loader</p> -<pre><code class="language-r">cssLoader(type = &quot;gif&quot;, src = &quot;https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true&quot;, height = &quot;100px&quot;) -</code></pre> -<div id="spsloader-697124358" class="sps-cssloader" style="height: 100px; width: 100px; display: block; opacity: 1;"> -<script> -$(function(){ -$("#spsloader-697124358").prepend(chooseLoader("spsloader-697124358", "gif", "https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true", "#337ab7", "100px", "100px")); -}); -</script> -</div> -<pre><code class="language-r">cssLoader(type = &quot;gif&quot;, src = &quot;https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true&quot;, height = &quot;150px&quot;) -</code></pre> -<div id="spsloader-692571438" class="sps-cssloader" style="height: 150px; width: 150px; display: block; opacity: 1;"> -<script> -$(function(){ -$("#spsloader-692571438").prepend(chooseLoader("spsloader-692571438", "gif", "https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true", "#337ab7", "150px", "150px")); -}); -</script> -</div> -<h3 id="bstooltip-and-bstip"><code>bsTooltip</code> and <code>bsTip</code></h3> -<p>Add tooltips to the documents with <code>bsTooltip</code></p> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the left&quot;) %&gt;% -bsTooltip(&quot;Tooltip on the left&quot;, &quot;left&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip51201388"> +</button> +<h4 id="your-own-loaders">Your own loaders</h4> +<p>You can choose a gif to be a your loader</p> +<pre><code class="language-r">cssLoader(type = &quot;gif&quot;, src = &quot;https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true&quot;, height = &quot;100px&quot;) +</code></pre> +<div id="spsloader-697124358" class="sps-cssloader" style="height: 100px; width: 100px; display: block; opacity: 1;"> +<script> + $(function(){ + $("#spsloader-697124358").prepend(chooseLoader("spsloader-697124358", "gif", "https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true", "#337ab7", "100px", "100px")); + }); +</script> +</div> +<pre><code class="language-r">cssLoader(type = &quot;gif&quot;, src = &quot;https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true&quot;, height = &quot;150px&quot;) +</code></pre> +<div id="spsloader-692571438" class="sps-cssloader" style="height: 150px; width: 150px; display: block; opacity: 1;"> +<script> + $(function(){ + $("#spsloader-692571438").prepend(chooseLoader("spsloader-692571438", "gif", "https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true", "#337ab7", "150px", "150px")); + }); +</script> +</div> +<h3 id="bstooltip-and-bstip"><code>bsTooltip</code> and <code>bsTip</code></h3> +<p>Add tooltips to the documents with <code>bsTooltip</code></p> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the left&quot;) %&gt;% + bsTooltip(&quot;Tooltip on the left&quot;, &quot;left&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip51201388"> Tooltip on the left -<script> +<script> bsTooltip( -"bsTooltip51201388", "left", "Tooltip on the left", "black", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip51201388", "left", "Tooltip on the left", "black", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the top&quot;) %&gt;% -bsTooltip(&quot;Tooltip on the top&quot;, &quot;top&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip75760883"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the top&quot;) %&gt;% + bsTooltip(&quot;Tooltip on the top&quot;, &quot;top&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip75760883"> Tooltip on the top -<script> +<script> bsTooltip( -"bsTooltip75760883", "top", "Tooltip on the top", "black", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip75760883", "top", "Tooltip on the top", "black", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the right&quot;) %&gt;% -bsTooltip(&quot;Tooltip on the right&quot;, &quot;right&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip87272588"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the right&quot;) %&gt;% + bsTooltip(&quot;Tooltip on the right&quot;, &quot;right&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip87272588"> Tooltip on the right -<script> +<script> bsTooltip( -"bsTooltip87272588", "right", "Tooltip on the right", "black", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip87272588", "right", "Tooltip on the right", "black", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the bottom&quot;) %&gt;% -bsTooltip(&quot;Tooltip on the bottom&quot;, &quot;bottom&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip19999567"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;Tooltip on the bottom&quot;) %&gt;% + bsTooltip(&quot;Tooltip on the bottom&quot;, &quot;bottom&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip19999567"> Tooltip on the bottom -<script> +<script> bsTooltip( -"bsTooltip19999567", "bottom", "Tooltip on the bottom", "black", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip19999567", "bottom", "Tooltip on the bottom", "black", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<p>or use the higher leveler convenient function <code>bsTip</code></p> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;primary&quot;) %&gt;% -bsTip(&quot;primary&quot;, status = &quot;primary&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip41302842"> +</script> +</button> +<p>or use the higher leveler convenient function <code>bsTip</code></p> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;primary&quot;) %&gt;% + bsTip(&quot;primary&quot;, status = &quot;primary&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip41302842"> primary -<script> +<script> bsTooltip( -"bsTooltip41302842", "top", "primary", "#0275d8", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip41302842", "top", "primary", "#0275d8", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;info&quot;) %&gt;% -bsTip(&quot;info&quot;, status = &quot;info&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip17592348"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;info&quot;) %&gt;% + bsTip(&quot;info&quot;, status = &quot;info&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip17592348"> info -<script> +<script> bsTooltip( -"bsTooltip17592348", "top", "info", "#5bc0de", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip17592348", "top", "info", "#5bc0de", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;success&quot;) %&gt;% -bsTip(&quot;success&quot;, status = &quot;success&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip70458981"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;success&quot;) %&gt;% + bsTip(&quot;success&quot;, status = &quot;success&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip70458981"> success -<script> +<script> bsTooltip( -"bsTooltip70458981", "top", "success", "#5cb85c", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip70458981", "top", "success", "#5cb85c", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;warning&quot;) %&gt;% -bsTip(&quot;warning&quot;, status = &quot;warning&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip38241728"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;warning&quot;) %&gt;% + bsTip(&quot;warning&quot;, status = &quot;warning&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip38241728"> warning -<script> +<script> bsTooltip( -"bsTooltip38241728", "top", "warning", "#f0ad4e", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip38241728", "top", "warning", "#f0ad4e", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<pre><code class="language-r">actionButton(&quot;&quot;, &quot;danger&quot;) %&gt;% -bsTip(&quot;danger&quot;, status = &quot;danger&quot;) -</code></pre> -<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip58127777"> +</script> +</button> +<pre><code class="language-r">actionButton(&quot;&quot;, &quot;danger&quot;) %&gt;% + bsTip(&quot;danger&quot;, status = &quot;danger&quot;) +</code></pre> +<button id="" type="button" class="btn btn-default action-button" data-tipid="bsTooltip58127777"> danger -<script> +<script> bsTooltip( -"bsTooltip58127777", "top", "danger", "#d9534f", "white", -"12px", "hover focus", "400", "1", false + "bsTooltip58127777", "top", "danger", "#d9534f", "white", + "12px", "hover focus", "400", "1", false ) -</script> -</button> -<h3 id="titles-with-spstitle">Titles with <code>spsTitle</code></h3> -<p>You can use {spsComps} to add colorful titles in Rmarkdown</p> -<pre><code class="language-r">spsTitle(&quot;primary&quot;, status = &quot;primary&quot;) -</code></pre> -<h2 style="color: #0275d8; opacity: 1; ">primary</h2> -<pre><code class="language-r">spsTitle(&quot;info&quot;, status = &quot;info&quot;) -</code></pre> -<h2 style="color: #5bc0de; opacity: 1; ">info</h2> -<pre><code class="language-r">spsTitle(&quot;success&quot;, status = &quot;success&quot;) -</code></pre> -<h2 style="color: #5cb85c; opacity: 1; ">success</h2> -<pre><code class="language-r">spsTitle(&quot;warning&quot;, status = &quot;warning&quot;) -</code></pre> -<h2 style="color: #f0ad4e; opacity: 1; ">warning</h2> -<pre><code class="language-r">spsTitle(&quot;danger&quot;, status = &quot;danger&quot;) -</code></pre> -<h2 style="color: #d9534f; opacity: 1; ">danger</h2> -<br> -<p>Or you own colors</p> -<pre><code class="language-r">spsTitle(&quot;purple&quot;, other_color = &quot;purple&quot;) -</code></pre> -<h2 style="color: purple; opacity: 1; ">purple</h2> -<pre><code class="language-r">spsTitle(&quot;pink&quot;, other_color = &quot;pink&quot;) -</code></pre> -<h2 style="color: pink; opacity: 1; ">pink</h2> -<h3 id="add-horizontal-divider-lines-with-spshr">Add horizontal divider lines with <code>spsHr</code></h3> -<pre><code class="language-r">spsHr(&quot;info&quot;) -</code></pre> -<hr style="border: 0.5px solid #5bc0de; opacity: 1"/> -<pre><code class="language-r">spsHr(&quot;primary&quot;) -</code></pre> -<hr style="border: 0.5px solid #0275d8; opacity: 1"/> -<pre><code class="language-r">spsHr(&quot;success&quot;) -</code></pre> -<hr style="border: 0.5px solid #5cb85c; opacity: 1"/> -<pre><code class="language-r">spsHr(&quot;warning&quot;) -</code></pre> -<hr style="border: 0.5px solid #f0ad4e; opacity: 1"/> -<pre><code class="language-r">spsHr(&quot;danger&quot;) -</code></pre> -<hr style="border: 0.5px solid #d9534f; opacity: 1"/> -<h2 id="other-components">Other components</h2> -<p>Other components are either performed the best in a Shiny app or requires -a server. Please see the <a href="https://lezhang.shinyapps.io/spsComps/">demo</a></p>Sps: Server functions/sps/dev/spscomps/server/Mon, 01 Jan 0001 00:00:00 +0000/sps/dev/spscomps/server/ -<p>{spsComps} has some useful functions for exception catch, expression validation, -and more. Even though we say they are Shiny server functions, but in fact most +</script> +</button> +<h3 id="titles-with-spstitle">Titles with <code>spsTitle</code></h3> +<p>You can use {spsComps} to add colorful titles in Rmarkdown</p> +<pre><code class="language-r">spsTitle(&quot;primary&quot;, status = &quot;primary&quot;) +</code></pre> +<h2 style="color: #0275d8; opacity: 1; ">primary</h2> +<pre><code class="language-r">spsTitle(&quot;info&quot;, status = &quot;info&quot;) +</code></pre> +<h2 style="color: #5bc0de; opacity: 1; ">info</h2> +<pre><code class="language-r">spsTitle(&quot;success&quot;, status = &quot;success&quot;) +</code></pre> +<h2 style="color: #5cb85c; opacity: 1; ">success</h2> +<pre><code class="language-r">spsTitle(&quot;warning&quot;, status = &quot;warning&quot;) +</code></pre> +<h2 style="color: #f0ad4e; opacity: 1; ">warning</h2> +<pre><code class="language-r">spsTitle(&quot;danger&quot;, status = &quot;danger&quot;) +</code></pre> +<h2 style="color: #d9534f; opacity: 1; ">danger</h2> +<br> +<p>Or you own colors</p> +<pre><code class="language-r">spsTitle(&quot;purple&quot;, other_color = &quot;purple&quot;) +</code></pre> +<h2 style="color: purple; opacity: 1; ">purple</h2> +<pre><code class="language-r">spsTitle(&quot;pink&quot;, other_color = &quot;pink&quot;) +</code></pre> +<h2 style="color: pink; opacity: 1; ">pink</h2> +<h3 id="add-horizontal-divider-lines-with-spshr">Add horizontal divider lines with <code>spsHr</code></h3> +<pre><code class="language-r">spsHr(&quot;info&quot;) +</code></pre> +<hr style="border: 0.5px solid #5bc0de; opacity: 1"/> +<pre><code class="language-r">spsHr(&quot;primary&quot;) +</code></pre> +<hr style="border: 0.5px solid #0275d8; opacity: 1"/> +<pre><code class="language-r">spsHr(&quot;success&quot;) +</code></pre> +<hr style="border: 0.5px solid #5cb85c; opacity: 1"/> +<pre><code class="language-r">spsHr(&quot;warning&quot;) +</code></pre> +<hr style="border: 0.5px solid #f0ad4e; opacity: 1"/> +<pre><code class="language-r">spsHr(&quot;danger&quot;) +</code></pre> +<hr style="border: 0.5px solid #d9534f; opacity: 1"/> +<h2 id="other-components">Other components</h2> +<p>Other components are either performed the best in a Shiny app or requires +a server. Please see the <a href="https://lezhang.shinyapps.io/spsComps/">demo</a></p> + + + + + + Sps: Server functions + /sps/dev/spscomps/server/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/dev/spscomps/server/ + + + + <p>{spsComps} has some useful functions for exception catch, expression validation, +and more. Even though we say they are Shiny server functions, but in fact most of them can be run without a Shiny server. We have designed the functions to detect -whether there is a Shiny server, if not, they will work only in R console as well.</p> -<h2 id="load-package">load package</h2> -<pre><code class="language-r">library(spsComps) -</code></pre> -<pre><code>## Loading required package: shiny -</code></pre> -<pre><code>## Loading required package: spsUtil -</code></pre> -<pre><code class="language-r">library(magrittr) -</code></pre> -<h2 id="server-components">Server components</h2> -<h3 id="shinycatch"><code>shinyCatch</code></h3> -<h4 id="basic">basic</h4> -<p>The <code>shinyCatch</code> function is useful to capture exception. What we mean exception -can be <code>message</code>, <code>warning</code> or <code>error</code>. For example</p> -<pre><code class="language-r">shinyCatch({ -message(&quot;This is a message&quot;) -warning(&quot;This is a warning&quot;) -stop(&quot;This is an error&quot;) +whether there is a Shiny server, if not, they will work only in R console as well.</p> +<h2 id="load-package">load package</h2> +<pre><code class="language-r">library(spsComps) +</code></pre> +<pre><code>## Loading required package: shiny +</code></pre> +<pre><code>## Loading required package: spsUtil +</code></pre> +<pre><code class="language-r">library(magrittr) +</code></pre> +<h2 id="server-components">Server components</h2> +<h3 id="shinycatch"><code>shinyCatch</code></h3> +<h4 id="basic">basic</h4> +<p>The <code>shinyCatch</code> function is useful to capture exception. What we mean exception +can be <code>message</code>, <code>warning</code> or <code>error</code>. For example</p> +<pre><code class="language-r">shinyCatch({ + message(&quot;This is a message&quot;) + warning(&quot;This is a warning&quot;) + stop(&quot;This is an error&quot;) }) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 This is a message -## +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 This is a message +## ## [SPS-WARNING] 2021-04-14 17:31:28 This is a warning ## [SPS-ERROR] 2021-04-14 17:31:28 This is an error -</code></pre> -<pre><code>## NULL -</code></pre> -<p>You can see all 3 levels are captured inside the [SPS-XX] log on your console. If you run this +</code></pre> +<pre><code>## NULL +</code></pre> +<p>You can see all 3 levels are captured inside the [SPS-XX] log on your console. If you run this in your Shiny app, a pop-up message with the corresponding log level message will -be displayed in in app, like following:</p> -<p><img src="../shinycatch.png" alt="shinycatch"></p> -<p>So the message on both UI and console is called <strong>dual-end logging</strong> in SPS.</p> -<h4 id="server-only">Server only</h4> -<p>Of course, if you do not want users to see the message, you can hide it by -<code>shiny = FALSE</code>, but the message will be still logged on R console. -Run the following on your own computer and watch the difference.</p> -<pre><code class="language-r">library(shiny) +be displayed in in app, like following:</p> +<p><img src="../shinycatch.png" alt="shinycatch"></p> +<p>So the message on both UI and console is called <strong>dual-end logging</strong> in SPS.</p> +<h4 id="server-only">Server only</h4> +<p>Of course, if you do not want users to see the message, you can hide it by +<code>shiny = FALSE</code>, but the message will be still logged on R console. +Run the following on your own computer and watch the difference.</p> +<pre><code class="language-r">library(shiny) + ui &lt;- fluidPage( -spsDepend(&quot;toastr&quot;) + spsDepend(&quot;toastr&quot;) ) + server &lt;- function(input, output, session) { -shinyCatch({ -stop(&quot;This is an error&quot;) -}, shiny = FALSE) + shinyCatch({ + stop(&quot;This is an error&quot;) + }, shiny = FALSE) } + shinyApp(ui, server) -</code></pre> -<h4 id="get-return">get return</h4> -<p><code>shinyCatch</code> is able to return you values if your expression has any. Imagine we -have a function <code>addNum</code> that gives message, warning or error depeend on the input.</p> -<pre><code class="language-r">addNum &lt;- function(num){ -if (num &gt; 0) {message(num)} -else if (num == 0) {warning(&quot;Num is 0&quot;)} -else {stop(&quot;less than 0&quot;)} -return(num + num) +</code></pre> +<h4 id="get-return">get return</h4> +<p><code>shinyCatch</code> is able to return you values if your expression has any. Imagine we +have a function <code>addNum</code> that gives message, warning or error depeend on the input.</p> +<pre><code class="language-r">addNum &lt;- function(num){ + if (num &gt; 0) {message(num)} + else if (num == 0) {warning(&quot;Num is 0&quot;)} + else {stop(&quot;less than 0&quot;)} + return(num + num) } + value_a &lt;- shinyCatch({ -addNum(1) + addNum(1) }) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 1 -</code></pre> -<pre><code class="language-r">value_a -</code></pre> -<pre><code>## [1] 2 -</code></pre> -<pre><code class="language-r">value_b &lt;- shinyCatch({ -addNum(0) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 1 +</code></pre> +<pre><code class="language-r">value_a +</code></pre> +<pre><code>## [1] 2 +</code></pre> +<pre><code class="language-r">value_b &lt;- shinyCatch({ + addNum(0) }) -</code></pre> -<pre><code>## [SPS-WARNING] 2021-04-14 17:31:28 Num is 0 -</code></pre> -<pre><code class="language-r">value_b -</code></pre> -<pre><code>## [1] 0 -</code></pre> -<pre><code class="language-r">value_c &lt;- shinyCatch({ -addNum(-1) +</code></pre> +<pre><code>## [SPS-WARNING] 2021-04-14 17:31:28 Num is 0 +</code></pre> +<pre><code class="language-r">value_b +</code></pre> +<pre><code>## [1] 0 +</code></pre> +<pre><code class="language-r">value_c &lt;- shinyCatch({ + addNum(-1) }) -</code></pre> -<pre><code>## [SPS-ERROR] 2021-04-14 17:31:28 less than 0 -</code></pre> -<pre><code class="language-r">value_c -</code></pre> -<pre><code>## NULL -</code></pre> -<p>You can see at <code>message</code> and <code>warning</code> level, the expected value returned, and -at <code>error</code> level, the return is <code>NULL</code>. So the following code <code>value_c</code> still runs -and is not blocked by the <code>error</code> occurred in <code>shinyCatch</code>.</p> -<h4 id="blocking-level">Blocking level</h4> -<p>More often, if there is an error, we do want take the log in R console, inform the Shinyapp user -and then stop the following code. In this case, we need to specify the <code>blocking_level</code>. So, -default is <code>&quot;none&quot;</code>, do not block and return <code>NULL</code> if there is an error, and you can -choose <code>&quot;error&quot;</code>, <code>&quot;warning&quot;</code> or <code>&quot;message&quot;</code>.</p> -<ul> -<li><strong>error</strong>: block downstream if the first <code>error</code> detected in <code>shinyCatch</code></li> -<li><strong>warning</strong>: block downstream if the first <code>error</code> or <code>warning</code> detected in <code>shinyCatch</code></li> -<li><strong>message</strong>: block downstream if the first <code>error</code>, <code>warning</code> or <code>message</code> detected in <code>shinyCatch</code></li> -</ul> -<p>You can see the stringency becomes tighter: message &gt; warning &gt; error</p> -<p><b class="text-primary">Blocking code will generate error, in order to have the Rmd rendered, we wrap the expression in <code>try</code> </b></p> -<pre><code class="language-r">try({ -shinyCatch({ -stop(&quot;error level is the most commonly used level&quot;) -}, blocking_level = &quot;error&quot;) -print(&quot;This will not be evaluated&quot;) +</code></pre> +<pre><code>## [SPS-ERROR] 2021-04-14 17:31:28 less than 0 +</code></pre> +<pre><code class="language-r">value_c +</code></pre> +<pre><code>## NULL +</code></pre> +<p>You can see at <code>message</code> and <code>warning</code> level, the expected value returned, and +at <code>error</code> level, the return is <code>NULL</code>. So the following code <code>value_c</code> still runs +and is not blocked by the <code>error</code> occurred in <code>shinyCatch</code>.</p> +<h4 id="blocking-level">Blocking level</h4> +<p>More often, if there is an error, we do want take the log in R console, inform the Shinyapp user +and then stop the following code. In this case, we need to specify the <code>blocking_level</code>. So, +default is <code>&quot;none&quot;</code>, do not block and return <code>NULL</code> if there is an error, and you can +choose <code>&quot;error&quot;</code>, <code>&quot;warning&quot;</code> or <code>&quot;message&quot;</code>.</p> +<ul> +<li><strong>error</strong>: block downstream if the first <code>error</code> detected in <code>shinyCatch</code></li> +<li><strong>warning</strong>: block downstream if the first <code>error</code> or <code>warning</code> detected in <code>shinyCatch</code></li> +<li><strong>message</strong>: block downstream if the first <code>error</code>, <code>warning</code> or <code>message</code> detected in <code>shinyCatch</code></li> +</ul> +<p>You can see the stringency becomes tighter: message &gt; warning &gt; error</p> +<p><b class="text-primary">Blocking code will generate error, in order to have the Rmd rendered, we wrap the expression in <code>try</code> </b></p> +<pre><code class="language-r">try({ + shinyCatch({ + stop(&quot;error level is the most commonly used level&quot;) + }, blocking_level = &quot;error&quot;) + print(&quot;This will not be evaluated&quot;) }) -</code></pre> -<pre><code>## [SPS-ERROR] 2021-04-14 17:31:28 error level is the most commonly used level -## Error : -</code></pre> -<pre><code class="language-r">try({ -shinyCatch({ -message(&quot;error level is the most commonly used level&quot;) -}, blocking_level = &quot;message&quot;) -print(&quot;This will not be evaluated either&quot;) +</code></pre> +<pre><code>## [SPS-ERROR] 2021-04-14 17:31:28 error level is the most commonly used level +## Error : +</code></pre> +<pre><code class="language-r">try({ + shinyCatch({ + message(&quot;error level is the most commonly used level&quot;) + }, blocking_level = &quot;message&quot;) + print(&quot;This will not be evaluated either&quot;) }) -</code></pre> -<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 error level is the most commonly used level -## -## Error : -</code></pre> -<p>You can see the following <code>print</code> in both cases are not got evaluated.</p> -<h4 id="block-reative">Block reative</h4> -<p>The most useful case for <code>shinyCatch</code> is to use it in the <a href="https://shiny.rstudio.com/tutorial/written-tutorial/lesson6/">Shiny reactive</a> -context. Most errors in shiny::reactive, shiny::observer, shiny::observeEvent, -or shiny::renderXXX series function will <strong>crash</strong> the app. With <code>shinyCatch</code>, it -will not. It &ldquo;dual-logs&rdquo; the error and stop downstream code.</p> -<p><b class="text-primary">The following example use <code>shiny::reactiveConsole()</code> to mock a Shiny server session</b></p> -<pre><code class="language-r">shiny::reactiveConsole(TRUE) +</code></pre> +<pre><code>## [SPS-INFO] 2021-04-14 17:31:28 error level is the most commonly used level +## +## Error : +</code></pre> +<p>You can see the following <code>print</code> in both cases are not got evaluated.</p> +<h4 id="block-reative">Block reative</h4> +<p>The most useful case for <code>shinyCatch</code> is to use it in the <a href="https://shiny.rstudio.com/tutorial/written-tutorial/lesson6/">Shiny reactive</a> +context. Most errors in shiny::reactive, shiny::observer, shiny::observeEvent, +or shiny::renderXXX series function will <strong>crash</strong> the app. With <code>shinyCatch</code>, it +will not. It &ldquo;dual-logs&rdquo; the error and stop downstream code.</p> +<p><b class="text-primary">The following example use <code>shiny::reactiveConsole()</code> to mock a Shiny server session</b></p> +<pre><code class="language-r">shiny::reactiveConsole(TRUE) y &lt;- observe({ -stop(&quot;an error from a function&quot;) -print(&quot;some other process&quot;) + stop(&quot;an error from a function&quot;) + print(&quot;some other process&quot;) }) -</code></pre> -<pre><code>## Warning: Error in &lt;observer&gt;: The value of x is -## 38: stop -## 37: &lt;observer&gt; [#2] -## 35: contextFunc -## 34: env$runWith -## 27: ctx$run -## 26: run -## 7: flushCallback -## 6: FUN -## 5: lapply -## 4: ctx$executeFlushCallbacks -## 3: .getReactiveEnvironment()$flush -## 2: flushReact -## 1: &lt;Anonymous&gt; -</code></pre> -<p>It crashes the app. However, if you use <code>shinyCatch</code></p> -<pre><code class="language-r">shiny::reactiveConsole(TRUE) +</code></pre> +<pre><code>## Warning: Error in &lt;observer&gt;: The value of x is +## 38: stop +## 37: &lt;observer&gt; [#2] +## 35: contextFunc +## 34: env$runWith +## 27: ctx$run +## 26: run +## 7: flushCallback +## 6: FUN +## 5: lapply +## 4: ctx$executeFlushCallbacks +## 3: .getReactiveEnvironment()$flush +## 2: flushReact +## 1: &lt;Anonymous&gt; +</code></pre> +<p>It crashes the app. However, if you use <code>shinyCatch</code></p> +<pre><code class="language-r">shiny::reactiveConsole(TRUE) y &lt;- observe({ -shinyCatch({ -stop(&quot;an error from a function&quot;) -}, blocking_level = &quot;error&quot;) -print(&quot;some other process&quot;) + shinyCatch({ + stop(&quot;an error from a function&quot;) + }, blocking_level = &quot;error&quot;) + print(&quot;some other process&quot;) }) -</code></pre> -<pre><code>## [SPS-ERROR] 2021-03-02 22:13:05 an error from a function -</code></pre> -<p>It only logs the error and prevent the downstream <code>print</code> to run. Now try following -real Shiny apps and watch the difference:</p> -<pre><code class="language-r"># with shinyCatch +</code></pre> +<pre><code>## [SPS-ERROR] 2021-03-02 22:13:05 an error from a function +</code></pre> +<p>It only logs the error and prevent the downstream <code>print</code> to run. Now try following +real Shiny apps and watch the difference:</p> +<pre><code class="language-r"># with shinyCatch library(shiny) server &lt;- function(input, output, session) { -observe({ -shinyCatch({ -stop(&quot;an error from a function&quot;) -}, blocking_level = &quot;error&quot;) -print(&quot;some other process&quot;) -}) + observe({ + shinyCatch({ + stop(&quot;an error from a function&quot;) + }, blocking_level = &quot;error&quot;) + print(&quot;some other process&quot;) + }) } shinyApp(fluidPage(spsDepend(&quot;toastr&quot;)), server) -</code></pre> -<pre><code class="language-r"># without shinyCatch +</code></pre> +<pre><code class="language-r"># without shinyCatch library(shiny) server &lt;- function(input, output, session) { -observe({ -stop(&quot;an error from a function&quot;) -print(&quot;some other process&quot;) -}) + observe({ + stop(&quot;an error from a function&quot;) + print(&quot;some other process&quot;) + }) } shinyApp(fluidPage(spsDepend(&quot;toastr&quot;)), server) -</code></pre> -<h3 id="spsvalidate"><code>spsValidate</code></h3> -<p>In data analysis, it is important we do some validations before the downstream +</code></pre> +<h3 id="spsvalidate"><code>spsValidate</code></h3> +<p>In data analysis, it is important we do some validations before the downstream process, like make a plot. It is epecially the case in Shiny apps. We cannot predict what the user inputs will be, like what kind of data they will use. -Similar to <code>shinyCatch</code>, <code>spsValidate</code> is able to catch exceptions but more -useful to handle validations. In addtion to <code>shinyCatch</code> functionalities, it -will give users a success message if the expression goes through and return <code>TRUE</code> -(<code>shinyCatch</code> returns the final expression value).</p> -<pre><code class="language-r">shiny::reactiveConsole(TRUE) +Similar to <code>shinyCatch</code>, <code>spsValidate</code> is able to catch exceptions but more +useful to handle validations. In addtion to <code>shinyCatch</code> functionalities, it +will give users a success message if the expression goes through and return <code>TRUE</code> +(<code>shinyCatch</code> returns the final expression value).</p> +<pre><code class="language-r">shiny::reactiveConsole(TRUE) x &lt;- reactiveVal(10) + y &lt;- observe({ -spsValidate({ -# have multiple validations in one expression -if (x() == 1) stop(&quot;cannot be 1&quot;) -if (x() == 0) stop(&quot;cannot be 0&quot;) -if (x() &lt; 0) stop(&quot;less than 0&quot;) -}) -message(&quot;The value of x is &quot;, x()) + spsValidate({ + # have multiple validations in one expression + if (x() == 1) stop(&quot;cannot be 1&quot;) + if (x() == 0) stop(&quot;cannot be 0&quot;) + if (x() &lt; 0) stop(&quot;less than 0&quot;) + }) + message(&quot;The value of x is &quot;, x()) }) x(0) x(-10) -</code></pre> -<pre><code>## The value of x is 10 +</code></pre> +<pre><code>## The value of x is 10 ## [ ERROR] 2021-03-02 22:36:16 cannot be 0 ## [ ERROR] 2021-03-02 22:36:16 less than 0 -</code></pre> -<p>Try this real Shiny app:</p> -<pre><code class="language-r">library(shiny) +</code></pre> +<p>Try this real Shiny app:</p> +<pre><code class="language-r">library(shiny) ui &lt;- fluidPage( -spsDepend(&quot;toastr&quot;), -shiny::sliderInput( -&quot;num&quot;, &quot;change number&quot;, -min = -1, max = 2, value = 2, step = 1 -) + spsDepend(&quot;toastr&quot;), + shiny::sliderInput( + &quot;num&quot;, &quot;change number&quot;, + min = -1, max = 2, value = 2, step = 1 + ) ) server &lt;- function(input, output, session) { -x &lt;- reactive(as.numeric(input$num)) -y &lt;- observe({ -spsValidate(vd_name = &quot;check numbers&quot;, verbose = TRUE, { -# have multiple validations in one expression -if (x() == 1) stop(&quot;cannot be 1&quot;) -if (x() == 0) stop(&quot;cannot be 0&quot;) -if (x() &lt; 0) stop(&quot;less than 0&quot;) -}) -message(&quot;The value of x is &quot;, x()) -}) + x &lt;- reactive(as.numeric(input$num)) + + y &lt;- observe({ + spsValidate(vd_name = &quot;check numbers&quot;, verbose = TRUE, { + # have multiple validations in one expression + if (x() == 1) stop(&quot;cannot be 1&quot;) + if (x() == 0) stop(&quot;cannot be 0&quot;) + if (x() &lt; 0) stop(&quot;less than 0&quot;) + }) + message(&quot;The value of x is &quot;, x()) + }) } shinyApp(ui, server) -</code></pre> -<p>You should see the success message like this:</p> -<p><img src="../spsvalidate.png" alt="spsvalidate"></p> -<h3 id="shinycheckpkg"><code>shinyCheckPkg</code></h3> -<p>Sometimes we want the app behave differently if users have certain packages installed. +</code></pre> +<p>You should see the success message like this:</p> +<p><img src="../spsvalidate.png" alt="spsvalidate"></p> +<h3 id="shinycheckpkg"><code>shinyCheckPkg</code></h3> +<p>Sometimes we want the app behave differently if users have certain packages installed. For example, if some packages are installed, we open up additional tabs on -UI to allow more features. This can be done with the <code>shinyCheckPkg</code> function. +UI to allow more features. This can be done with the <code>shinyCheckPkg</code> function. This function has to run inside Shiny server, an alternative version to use -without Shiny is from the <a href="../../spsutil">spsUtil</a> package, <code>spsUtil::checkNameSpace</code></p> -<p>Use it in Shiny server, specify the packages you want to check by different sources, -like CRAN, Bioconductor, or github.</p> -<pre><code class="language-r">shinyCheckPkg(session, cran_pkg = c(&quot;pkg1&quot;, &quot;pkg2&quot;), bioc_pkg = &quot;bioxxx&quot;, github = &quot;user1/pkg1&quot;) -</code></pre> -<p>It will return <code>TRUE</code> if all packages are installed, otherwise <code>FALSE</code></p> -<p>Now try this real example. We check if the <code>ggplot99</code> package is installed, if -yes we make a plot. It also combines the <code>spsValidate</code> function. You can have -a better idea how these functions work.</p> -<pre><code class="language-r">library(shiny) +without Shiny is from the <a href="../../spsutil">spsUtil</a> package, <code>spsUtil::checkNameSpace</code></p> +<p>Use it in Shiny server, specify the packages you want to check by different sources, +like CRAN, Bioconductor, or github.</p> +<pre><code class="language-r">shinyCheckPkg(session, cran_pkg = c(&quot;pkg1&quot;, &quot;pkg2&quot;), bioc_pkg = &quot;bioxxx&quot;, github = &quot;user1/pkg1&quot;) +</code></pre> +<p>It will return <code>TRUE</code> if all packages are installed, otherwise <code>FALSE</code></p> +<p>Now try this real example. We check if the <code>ggplot99</code> package is installed, if +yes we make a plot. It also combines the <code>spsValidate</code> function. You can have +a better idea how these functions work.</p> +<pre><code class="language-r">library(shiny) + ui &lt;- fluidPage( -tags$label('Check if package &quot;pkg1&quot;, &quot;pkg2&quot;, &quot;bioxxx&quot;, -github package &quot;user1/pkg1&quot; are installed'), br(), -actionButton(&quot;check_random_pkg&quot;, &quot;check random_pkg&quot;), -br(), spsHr(), -tags$label('We can combine `spsValidate` to block server code to prevent -crash if some packages are not installed.'), br(), -tags$label('If &quot;shiny&quot; is installed, make a plot.'), br(), -actionButton(&quot;check_shiny&quot;, &quot;check shiny&quot;), br(), -tags$label('If &quot;ggplot99&quot; is installed, make a plot.'), br(), -actionButton(&quot;check_gg99&quot;, &quot;check ggplot99&quot;), br(), -plotOutput(&quot;plot_pkg&quot;) + tags$label('Check if package &quot;pkg1&quot;, &quot;pkg2&quot;, &quot;bioxxx&quot;, +github package &quot;user1/pkg1&quot; are installed'), br(), + actionButton(&quot;check_random_pkg&quot;, &quot;check random_pkg&quot;), + br(), spsHr(), + tags$label('We can combine `spsValidate` to block server code to prevent +crash if some packages are not installed.'), br(), + tags$label('If &quot;shiny&quot; is installed, make a plot.'), br(), + actionButton(&quot;check_shiny&quot;, &quot;check shiny&quot;), br(), + tags$label('If &quot;ggplot99&quot; is installed, make a plot.'), br(), + actionButton(&quot;check_gg99&quot;, &quot;check ggplot99&quot;), br(), + plotOutput(&quot;plot_pkg&quot;) ) + server &lt;- function(input, output, session) { -observeEvent(input$check_random_pkg, { -shinyCheckPkg(session, cran_pkg = c(&quot;pkg1&quot;, &quot;pkg2&quot;), bioc_pkg = &quot;bioxxx&quot;, github = &quot;user1/pkg1&quot;) -}) -observeEvent(input$check_shiny, { -spsValidate(verbose = FALSE, { -if(!shinyCheckPkg(session, cran_pkg = c(&quot;shiny&quot;))) stop(&quot;Install packages&quot;) -}) -output$plot_pkg &lt;- renderPlot(plot(1)) -}) -observeEvent(input$check_gg99, { -spsValidate({ -if(!shinyCheckPkg(session, cran_pkg = c(&quot;ggplot99&quot;))) stop(&quot;Install packages&quot;) -}) -output$plot_pkg &lt;- renderPlot(plot(99)) -}) + observeEvent(input$check_random_pkg, { + shinyCheckPkg(session, cran_pkg = c(&quot;pkg1&quot;, &quot;pkg2&quot;), bioc_pkg = &quot;bioxxx&quot;, github = &quot;user1/pkg1&quot;) + }) + observeEvent(input$check_shiny, { + spsValidate(verbose = FALSE, { + if(!shinyCheckPkg(session, cran_pkg = c(&quot;shiny&quot;))) stop(&quot;Install packages&quot;) + }) + output$plot_pkg &lt;- renderPlot(plot(1)) + }) + observeEvent(input$check_gg99, { + spsValidate({ + if(!shinyCheckPkg(session, cran_pkg = c(&quot;ggplot99&quot;))) stop(&quot;Install packages&quot;) + }) + output$plot_pkg &lt;- renderPlot(plot(99)) + }) } + shinyApp(ui, server) -</code></pre> -<p>You should see something like this if there is any missing package:</p> -<p><img src="../shinycheckpkg.png" alt="shinycheckpkg"></p> \ No newline at end of file +</code></pre> +<p>You should see something like this if there is any missing package:</p> +<p><img src="../shinycheckpkg.png" alt="shinycheckpkg"></p> + + + + + + diff --git a/public/sps/dev/spscomps/server/index.html b/public/sps/dev/spscomps/server/index.html index 0319d80bc..8a187394f 100644 --- a/public/sps/dev/spscomps/server/index.html +++ b/public/sps/dev/spscomps/server/index.html @@ -1,83 +1,1101 @@ -Server functions | sysPipe

    Server functions

    {spsComps} has some useful functions for exception catch, expression validation, -and more. Even though we say they are Shiny server functions, but in fact most + + + + + + + + + + + + + + + + + + + +Server functions | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Server functions

    + + +

    {spsComps} has some useful functions for exception catch, expression validation, +and more. Even though we say they are Shiny server functions, but in fact most of them can be run without a Shiny server. We have designed the functions to detect -whether there is a Shiny server, if not, they will work only in R console as well.

    load package

    library(spsComps)
    -
    ## Loading required package: shiny
    -
    ## Loading required package: spsUtil
    -
    library(magrittr)
    -

    Server components

    shinyCatch

    basic

    The shinyCatch function is useful to capture exception. What we mean exception -can be message, warning or error. For example

    shinyCatch({
    +whether there is a Shiny server, if not, they will work only in R console as well.

    +

    load package

    +
    library(spsComps)
    +
    +
    ## Loading required package: shiny
    +
    +
    ## Loading required package: spsUtil
    +
    +
    library(magrittr)
    +
    +

    Server components

    +

    shinyCatch

    +

    basic

    +

    The shinyCatch function is useful to capture exception. What we mean exception +can be message, warning or error. For example

    +
    shinyCatch({
       message("This is a message")
       warning("This is a warning")
       stop("This is an error")
     })
    -
    ## [SPS-INFO] 2021-04-14 17:31:28 This is a message
    +
    +
    ## [SPS-INFO] 2021-04-14 17:31:28 This is a message
     ## 
     ## [SPS-WARNING] 2021-04-14 17:31:28 This is a warning
     ## [SPS-ERROR] 2021-04-14 17:31:28 This is an error
    -
    ## NULL
    -

    You can see all 3 levels are captured inside the [SPS-XX] log on your console. If you run this +

    +
    ## NULL
    +
    +

    You can see all 3 levels are captured inside the [SPS-XX] log on your console. If you run this in your Shiny app, a pop-up message with the corresponding log level message will -be displayed in in app, like following:

    shinycatch

    So the message on both UI and console is called dual-end logging in SPS.

    Server only

    Of course, if you do not want users to see the message, you can hide it by +be displayed in in app, like following:

    +

    shinycatch

    +

    So the message on both UI and console is called dual-end logging in SPS.

    +

    Server only

    +

    Of course, if you do not want users to see the message, you can hide it by shiny = FALSE, but the message will be still logged on R console. -Run the following on your own computer and watch the difference.

    library(shiny)
    +Run the following on your own computer and watch the difference.

    +
    library(shiny)
     
     ui <- fluidPage(
       spsDepend("toastr")
    @@ -90,8 +1108,11 @@
     }
     
     shinyApp(ui, server)
    -

    get return

    shinyCatch is able to return you values if your expression has any. Imagine we -have a function addNum that gives message, warning or error depeend on the input.

    addNum <- function(num){
    +
    +

    get return

    +

    shinyCatch is able to return you values if your expression has any. Imagine we +have a function addNum that gives message, warning or error depeend on the input.

    +
    addNum <- function(num){
       if (num > 0) {message(num)}
       else if (num == 0) {warning("Num is 0")}
       else {stop("less than 0")}
    @@ -101,52 +1122,83 @@
     value_a <- shinyCatch({
       addNum(1)
     })
    -
    ## [SPS-INFO] 2021-04-14 17:31:28 1
    -
    value_a
    -
    ## [1] 2
    -
    value_b <- shinyCatch({
    +
    +
    ## [SPS-INFO] 2021-04-14 17:31:28 1
    +
    +
    value_a
    +
    +
    ## [1] 2
    +
    +
    value_b <- shinyCatch({
       addNum(0)
     })
    -
    ## [SPS-WARNING] 2021-04-14 17:31:28 Num is 0
    -
    value_b
    -
    ## [1] 0
    -
    value_c <- shinyCatch({
    +
    +
    ## [SPS-WARNING] 2021-04-14 17:31:28 Num is 0
    +
    +
    value_b
    +
    +
    ## [1] 0
    +
    +
    value_c <- shinyCatch({
       addNum(-1)
     })
    -
    ## [SPS-ERROR] 2021-04-14 17:31:28 less than 0
    -
    value_c
    -
    ## NULL
    -

    You can see at message and warning level, the expected value returned, and +

    +
    ## [SPS-ERROR] 2021-04-14 17:31:28 less than 0
    +
    +
    value_c
    +
    +
    ## NULL
    +
    +

    You can see at message and warning level, the expected value returned, and at error level, the return is NULL. So the following code value_c still runs -and is not blocked by the error occurred in shinyCatch.

    Blocking level

    More often, if there is an error, we do want take the log in R console, inform the Shinyapp user +and is not blocked by the error occurred in shinyCatch.

    +

    Blocking level

    +

    More often, if there is an error, we do want take the log in R console, inform the Shinyapp user and then stop the following code. In this case, we need to specify the blocking_level. So, -default is "none", do not block and return NULL if there is an error, and you can -choose "error", "warning" or "message".

    • error: block downstream if the first error detected in shinyCatch
    • warning: block downstream if the first error or warning detected in shinyCatch
    • message: block downstream if the first error, warning or message detected in shinyCatch

    You can see the stringency becomes tighter: message > warning > error

    Blocking code will generate error, in order to have the Rmd rendered, we wrap the expression in try

    try({
    +default is "none", do not block and return NULL if there is an error, and you can
    +choose "error", "warning" or "message".

    +
      +
    • error: block downstream if the first error detected in shinyCatch
    • +
    • warning: block downstream if the first error or warning detected in shinyCatch
    • +
    • message: block downstream if the first error, warning or message detected in shinyCatch
    • +
    +

    You can see the stringency becomes tighter: message > warning > error

    +

    Blocking code will generate error, in order to have the Rmd rendered, we wrap the expression in try

    +
    try({
       shinyCatch({
         stop("error level is the most commonly used level")
       }, blocking_level = "error")
       print("This will not be evaluated")
     })
    -
    ## [SPS-ERROR] 2021-04-14 17:31:28 error level is the most commonly used level
    +
    +
    ## [SPS-ERROR] 2021-04-14 17:31:28 error level is the most commonly used level
     ## Error : 
    -
    try({
    +
    +
    try({
       shinyCatch({
         message("error level is the most commonly used level")
       }, blocking_level = "message")
       print("This will not be evaluated either")
     })
    -
    ## [SPS-INFO] 2021-04-14 17:31:28 error level is the most commonly used level
    +
    +
    ## [SPS-INFO] 2021-04-14 17:31:28 error level is the most commonly used level
     ## 
     ## Error : 
    -

    You can see the following print in both cases are not got evaluated.

    Block reative

    The most useful case for shinyCatch is to use it in the Shiny reactive -context. Most errors in shiny::reactive, shiny::observer, shiny::observeEvent, +

    +

    You can see the following print in both cases are not got evaluated.

    +

    Block reative

    +

    The most useful case for shinyCatch is to use it in the Shiny reactive +context. Most errors in shiny::reactive, shiny::observer, shiny::observeEvent, or shiny::renderXXX series function will crash the app. With shinyCatch, it -will not. It “dual-logs” the error and stop downstream code.

    The following example use shiny::reactiveConsole() to mock a Shiny server session

    shiny::reactiveConsole(TRUE)
    +will not. It “dual-logs” the error and stop downstream code.

    +

    The following example use shiny::reactiveConsole() to mock a Shiny server session

    +
    shiny::reactiveConsole(TRUE)
     y <- observe({
       stop("an error from a function")
       print("some other process")
     })
    -
    ## Warning: Error in <observer>: The value of x is 
    +
    +
    ## Warning: Error in <observer>: The value of x is 
     ##   38: stop
     ##   37: <observer> [#2]
     ##   35: contextFunc
    @@ -160,16 +1212,21 @@
     ##    3: .getReactiveEnvironment()$flush
     ##    2: flushReact
     ##    1: <Anonymous>
    -

    It crashes the app. However, if you use shinyCatch

    shiny::reactiveConsole(TRUE)
    +
    +

    It crashes the app. However, if you use shinyCatch

    +
    shiny::reactiveConsole(TRUE)
     y <- observe({
       shinyCatch({
         stop("an error from a function")
       }, blocking_level = "error")
       print("some other process")
     })
    -
    ## [SPS-ERROR] 2021-03-02 22:13:05 an error from a function
    -

    It only logs the error and prevent the downstream print to run. Now try following -real Shiny apps and watch the difference:

    # with shinyCatch
    +
    +
    ## [SPS-ERROR] 2021-03-02 22:13:05 an error from a function
    +
    +

    It only logs the error and prevent the downstream print to run. Now try following +real Shiny apps and watch the difference:

    +
    # with shinyCatch
     library(shiny)
     server <- function(input, output, session) {
       observe({
    @@ -180,7 +1237,8 @@
       })
     }
     shinyApp(fluidPage(spsDepend("toastr")), server)
    -
    # without shinyCatch
    +
    +
    # without shinyCatch
     library(shiny)
     server <- function(input, output, session) {
       observe({
    @@ -189,13 +1247,16 @@
       })
     }
     shinyApp(fluidPage(spsDepend("toastr")), server)
    -

    spsValidate

    In data analysis, it is important we do some validations before the downstream +

    +

    spsValidate

    +

    In data analysis, it is important we do some validations before the downstream process, like make a plot. It is epecially the case in Shiny apps. We cannot predict what the user inputs will be, like what kind of data they will use. Similar to shinyCatch, spsValidate is able to catch exceptions but more useful to handle validations. In addtion to shinyCatch functionalities, it will give users a success message if the expression goes through and return TRUE -(shinyCatch returns the final expression value).

    shiny::reactiveConsole(TRUE)
    +(shinyCatch returns the final expression value).

    +
    shiny::reactiveConsole(TRUE)
     x <- reactiveVal(10)
     
     y <- observe({
    @@ -209,10 +1270,13 @@
     })
     x(0)
     x(-10)
    -
    ## The value of x is 10
    +
    +
    ## The value of x is 10
     ## [ ERROR] 2021-03-02 22:36:16 cannot be 0
     ## [ ERROR] 2021-03-02 22:36:16 less than 0
    -

    Try this real Shiny app:

    library(shiny)
    +
    +

    Try this real Shiny app:

    +
    library(shiny)
     ui <- fluidPage(
       spsDepend("toastr"),
       shiny::sliderInput(
    @@ -234,15 +1298,24 @@
       })
     }
     shinyApp(ui, server)
    -

    You should see the success message like this:

    spsvalidate

    shinyCheckPkg

    Sometimes we want the app behave differently if users have certain packages installed. +

    +

    You should see the success message like this:

    +

    spsvalidate

    +

    shinyCheckPkg

    +

    Sometimes we want the app behave differently if users have certain packages installed. For example, if some packages are installed, we open up additional tabs on UI to allow more features. This can be done with the shinyCheckPkg function. This function has to run inside Shiny server, an alternative version to use -without Shiny is from the spsUtil package, spsUtil::checkNameSpace

    Use it in Shiny server, specify the packages you want to check by different sources, -like CRAN, Bioconductor, or github.

    shinyCheckPkg(session, cran_pkg = c("pkg1", "pkg2"), bioc_pkg = "bioxxx", github = "user1/pkg1")
    -

    It will return TRUE if all packages are installed, otherwise FALSE

    Now try this real example. We check if the ggplot99 package is installed, if +without Shiny is from the spsUtil package, spsUtil::checkNameSpace

    +

    Use it in Shiny server, specify the packages you want to check by different sources, +like CRAN, Bioconductor, or github.

    +
    shinyCheckPkg(session, cran_pkg = c("pkg1", "pkg2"), bioc_pkg = "bioxxx", github = "user1/pkg1")
    +
    +

    It will return TRUE if all packages are installed, otherwise FALSE

    +

    Now try this real example. We check if the ggplot99 package is installed, if yes we make a plot. It also combines the spsValidate function. You can have -a better idea how these functions work.

    library(shiny)
    +a better idea how these functions work.

    +
    library(shiny)
     
     ui <- fluidPage(
       tags$label('Check if package "pkg1", "pkg2", "bioxxx",
    @@ -277,9 +1350,106 @@
     }
     
     shinyApp(ui, server)
    -

    You should see something like this if there is any missing package:

    shinycheckpkg

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/spscomps/ui/index.html b/public/sps/dev/spscomps/ui/index.html index 30a371290..9c76e782a 100644 --- a/public/sps/dev/spscomps/ui/index.html +++ b/public/sps/dev/spscomps/ui/index.html @@ -1,68 +1,1230 @@ -UI components | sysPipe

    UI components

    For most of the UI components, you can view them in the online Shiny demo{blk}. + + + + + + + + + + + + + + + + + + + +UI components | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    UI components

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

    For most of the UI components, you can view them in the online Shiny demo{blk}. Most but not all UI components work in a Rmarkdown document. Here we demostrate how you could use some of them in a Rmarkdown doc. The source code of this -document is on Github{blk}.

    load package

    To start to use spsComps, load it in your Shiny app file or Rmarkdown file

    library(spsComps)
    -
    ## Loading required package: shiny
    -
    library(magrittr)
    -

    So you can see it depends on shiny and spsUtil. When you load it, there is no -need to additionally load shiny or spsUtil.

    spsGoTop

    A go top button.

    spsGoTop()
    -

    It will not be display inline of the Rmd, just simply call it and maybe change the +document is on Github{blk}.

    +

    load package

    +

    To start to use spsComps, load it in your Shiny app file or Rmarkdown file

    +
    library(spsComps)
    +
    +
    ## Loading required package: shiny
    +
    +
    library(magrittr)
    +
    +

    So you can see it depends on shiny and spsUtil. When you load it, there is no +need to additionally load shiny or spsUtil.

    +

    spsGoTop

    +

    A go top button.

    +
    spsGoTop()
    +
    +
    + + + + + + +
    +

    It will not be display inline of the Rmd, just simply call it and maybe change the style as you want. By default, a “go to top” button will be created on the bottom-right -corner. Now scroll this page, and you should see it (the rocket button).

    texts <- c("p1", "p2", "", "p4", "p5")
    +corner. Now scroll this page, and you should see it (the rocket button).

    + +
    texts <- c("p1", "p2", "", "p4", "p5")
     hrefs <- c("https://github.com/lz100/spsComps/blob/master/img/1.jpg?raw=true",
                "https://github.com/lz100/spsComps/blob/master/img/2.jpg?raw=true",
                "",
    @@ -78,34 +1240,149 @@
       enlarge = TRUE,
       enlarge_method = "modal"
     )
    -

    You can show a gallery of plots you make in the Rmd and when people click it, -it will be enlarged. You can also specify a link for each image.

    Logos

    hexLogo(
    +
    + +

    You can show a gallery of plots you make in the Rmd and when people click it, +it will be enlarged. You can also specify a link for each image.

    +

    Logos

    + +
    hexLogo(
         "logo", "Logo",
         hex_img = "https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg",
         hex_link = "https://www.google.com",
         footer = "Footer",
         footer_link = "https://www.google.com"
     )
    -

    a panel of logos with hexPanel

    hexPanel(
    +
    + +

    a panel of logos with hexPanel

    +
    hexPanel(
         "demo1", "" ,
         rep("https://live.staticflickr.com/7875/46106952034_954b8775fa_b.jpg", 2)
     )
    -

    Buttons

    Some colorful buttons hrefTab

    hrefTab(
    +
    +
    +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    +

    Buttons

    +

    Some colorful buttons hrefTab

    +
    hrefTab(
         title = "Different background and text colors",
         label_texts = c("Go top", "Disabled", "Email me"),
         hrefs = c("#", "", "mailto:xxx@abc.com"),
         bg_colors = c("green", "#eee", "orange"),
         text_colors = c("#caffc1", "black", "blue")
     )
    -

    Different background and text colors

    A table colorful buttons hrefTable

    hrefTable(
    +
    +
    +

    Different background and text colors

    + +
    +

    A table colorful buttons hrefTable

    +
    hrefTable(
         title = "Change button color and text color",
         item_titles = c("workflow 1", "No links"),
         item_labels = list(c("tab 1"), c("tab 3", "tab 4")),
    @@ -114,8 +1391,44 @@
         item_text_colors =  list(c("black"), c("yellow", "green")),
         style = "display: table;"
     )
    -
    Change button color and text color
    CategoryOptions
    workflow 1tab 1
    No linkstab 3 -tab 4
    hrefTable(
    +
    + + + + + + + + + + + + + + + + + +
    Change button color and text color
    CategoryOptions
    workflow 1 + tab 1 +
    No links + tab 3 + + tab 4 +
    +
    hrefTable(
         title = "Change row name colors and width",
         item_titles = c("Green", "Red", "Orange"),
         item_labels = list(c("tab 1"), c("tab 3", "tab 4"), c("tab 5", "tab 6", "tab 7")),
    @@ -127,119 +1440,515 @@
         item_title_colors = c("green", "red", "orange"),
         style = "display: table;"
     )
    -
    Change row name colors and width
    CategoryOptions
    Greentab 1
    Redtab 3 -tab 4
    Orangetab 5 -tab 6 -tab 7

    The table caption is on top in Shiny but on bottom in Rmd. You may also want to -add the style = "display: table;" in Rmd to make the table occupy full length of -the document in R markdown.

    Animations

    animateUI

    Add animations to existing components with animateUI

    To buttons

    tags$button(id = "btn1", "random button")
    -

    animateUI("btn1", animation = "ring")
    -

    To some text

    p(id = "mytext", class = "text-red", "some move text")
    -

    some move text

    animateUI("mytext", animation = "horizontal", speed = "fast")
    -

    On hover, move mouse on the red thumb

    tags$button(
    +
    + + + + + + + + + + + + + + + + + + + + + +
    Change row name colors and width
    CategoryOptions
    Green + tab 1 +
    Red + tab 3 + + tab 4 +
    Orange + tab 5 + + tab 6 + + tab 7 +
    +

    The table caption is on top in Shiny but on bottom in Rmd. You may also want to +add the style = "display: table;" in Rmd to make the table occupy full length of +the document in R markdown.

    +

    Animations

    +

    animateUI

    +

    Add animations to existing components with animateUI

    +

    To buttons

    +
    tags$button(id = "btn1", "random button")
    +
    +

    +
    animateUI("btn1", animation = "ring")
    +
    + +

    To some text

    +
    p(id = "mytext", class = "text-red", "some move text")
    +
    +

    some move text

    +
    animateUI("mytext", animation = "horizontal", speed = "fast")
    +
    + +

    On hover, move mouse on the red thumb

    +
    tags$button(
       id = "btn2",
       icon(id = "myicon", "thumbs-o-up"),
       style = "color: red; boarder: initial; border-color: transparent;"
     )
    -
    animateUI("btn2", animation = "bounce", speed = "fast", hover = TRUE)
    -

    Inline animation

    You can add animations to inline Rmarkdown text by giving it a HTML tag and id, like -following:

    some text some text <span id="some-text" style="display: inline-block">some text</span> some text some text
    -

    some text some text some text some text some text

    animateUI(selector = "some-text", animation = "ring")
    -

    Most animations required the target tag to have CSS display “block” or “inline-block”, -you can append this by adding style="display: inline-block" to the tag as shown above -or check examples below.


    animateAppend

    Add animations with pipe %>% by animateAppend

    icon("home") %>%
    +
    + +
    animateUI("btn2", animation = "bounce", speed = "fast", hover = TRUE)
    +
    + +

    Inline animation

    +

    You can add animations to inline Rmarkdown text by giving it a HTML tag and id, like +following:

    +
    some text some text <span id="some-text" style="display: inline-block">some text</span> some text some text
    +
    +

    some text some text some text some text some text

    +
    animateUI(selector = "some-text", animation = "ring")
    +
    + +

    Most animations required the target tag to have CSS display “block” or “inline-block”, +you can append this by adding style="display: inline-block" to the tag as shown above +or check examples below.

    +
    +

    animateAppend

    +

    Add animations with pipe %>% by animateAppend

    +
    icon("home") %>%
       animateAppend("ring")
    -

    tags$p("Append animation", class = "text-primary", style="display: inline-block") %>%
    +
    +

    +
    tags$p("Append animation", class = "text-primary", style="display: inline-block") %>%
       animateAppend("pulse")
    -

    Append animation


    animateAppendNested

    Apply multiple animations to the same component

    tags$b("Nested animations", class = "text-primary") %>%
    +
    +

    Append animation

    +
    +

    animateAppendNested

    +

    Apply multiple animations to the same component

    +
    tags$b("Nested animations", class = "text-primary") %>%
       animateAppendNested("ring") %>%
       animateAppendNested("pulse") %>%
       animateAppendNested("passing")
    -
    Nested animations
    tags$b("Nested animations display changed", class = "text-primary") %>%
    +
    +
    +
    +
    +Nested animations +
    +
    +
    +
    tags$b("Nested animations display changed", class = "text-primary") %>%
       animateAppendNested("ring") %>%
       animateAppendNested("pulse", display = "block", style = "width: 30%")
    -
    Nested animations display changed

    animateIcon

    Here is a convenient function that allows you to create font-awesome icons with +

    +
    +
    +Nested animations display changed +
    +
    +
    +

    animateIcon

    +

    Here is a convenient function that allows you to create font-awesome icons with animations and customize, color, size, etc, an enhanced version of original -shiny::icon and can also be used in Rmarkdown.

    Default

    Default is the same as original icon

    animateIcon("home")
    -

    Animation and color

    animateIcon(name = "home", animation = "horizontal", speed = "slow", color ="red")
    -

    Add to a button

    tags$button(animateIcon("spinner", "spin", "fast"), "A button")
    -

    on hover

    animateIcon(name = "wrench", animation = "wrench", hover = TRUE, color ="green")
    -

    Change size

    animateIcon("home", size = "xs")
    -

    animateIcon("home", size = "sm")
    -

    animateIcon("home", size = "lg")
    -

    animateIcon("home", size = "2x")
    -

    animateIcon("home", size = "3x")
    -

    animateIcon("home", size = "5x")
    -

    animateIcon("home", size = "7x")
    -

    animateIcon("home", size = "10x")
    -


    Loaders

    Add loaders to indicate busy status. Most cases, loaders are added by a backend +shiny::icon and can also be used in Rmarkdown.

    +

    Default

    +

    Default is the same as original icon

    +
    animateIcon("home")
    +
    +

    +

    Animation and color

    +
    animateIcon(name = "home", animation = "horizontal", speed = "slow", color ="red")
    +
    +

    +

    Add to a button

    +
    tags$button(animateIcon("spinner", "spin", "fast"), "A button")
    +
    + +

    on hover

    +
    animateIcon(name = "wrench", animation = "wrench", hover = TRUE, color ="green")
    +
    +

    +

    Change size

    +
    animateIcon("home", size = "xs")
    +
    +

    +
    animateIcon("home", size = "sm")
    +
    +

    +
    animateIcon("home", size = "lg")
    +
    +

    +
    animateIcon("home", size = "2x")
    +
    +

    +
    animateIcon("home", size = "3x")
    +
    +

    +
    animateIcon("home", size = "5x")
    +
    +

    +
    animateIcon("home", size = "7x")
    +
    +

    +
    animateIcon("home", size = "10x")
    +
    +

    +
    +

    Loaders

    +

    Add loaders to indicate busy status. Most cases, loaders are added by a backend server to show the busy processing status and are removed when the process is done. -Rmarkdown documents does not have a server, but you can still add some loaders.

    cssLoader

    Default loaders

    There are 12 different default loaders: “circle,” “dual-ring,” “facebook,” “heart,” -“ring,” “roller,” “default,” “ellipsis,” “grid,” “hourglass,” “ripple,” “spinner.”

    cssLoader(height = "100px")
    -

    customize it:

    cssLoader(type = "grid", height = "150px", color = "orange")
    -

    Add to a button:

    tags$button(
    +Rmarkdown documents does not have a server, but you can still add some loaders.

    +

    cssLoader

    +

    Default loaders

    +

    There are 12 different default loaders: “circle,” “dual-ring,” “facebook,” “heart,” +“ring,” “roller,” “default,” “ellipsis,” “grid,” “hourglass,” “ripple,” “spinner.”

    +
    cssLoader(height = "100px")
    +
    +
    + +
    +
    +

    customize it:

    +
    cssLoader(type = "grid", height = "150px", color = "orange")
    +
    +
    + +
    +
    +

    Add to a button:

    +
    tags$button(
       ## `inline = TRUE` is important if you want loader and
       ## text in the same line.
       cssLoader(is_icon = TRUE, inline = TRUE, color = "#3a7bd5"),
       "A button"
     )
    -

    Your own loaders

    You can choose a gif to be a your loader

    cssLoader(type = "gif", src = "https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true", height = "100px")
    -
    cssLoader(type = "gif", src = "https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true", height = "150px")
    -

    bsTooltip and bsTip

    Add tooltips to the documents with bsTooltip

    actionButton("", "Tooltip on the left") %>%
    +
    + +

    Your own loaders

    +

    You can choose a gif to be a your loader

    +
    cssLoader(type = "gif", src = "https://github.com/lz100/spsComps/blob/master/examples/demo/www/spinner.gif?raw=true", height = "100px")
    +
    +
    + +
    +
    cssLoader(type = "gif", src = "https://github.com/lz100/spsComps/blob/master/examples/demo/www/bean_eater.gif?raw=true", height = "150px")
    +
    +
    + +
    +

    bsTooltip and bsTip

    +

    Add tooltips to the documents with bsTooltip

    +
    actionButton("", "Tooltip on the left") %>%
      bsTooltip("Tooltip on the left", "left")
    -
    +
    actionButton("", "Tooltip on the top") %>%
    +
    +
    +
    actionButton("", "Tooltip on the top") %>%
      bsTooltip("Tooltip on the top", "top")
    -
    +
    actionButton("", "Tooltip on the right") %>%
    +
    +
    +
    actionButton("", "Tooltip on the right") %>%
      bsTooltip("Tooltip on the right", "right")
    -
    +
    actionButton("", "Tooltip on the bottom") %>%
    +
    +
    +
    actionButton("", "Tooltip on the bottom") %>%
      bsTooltip("Tooltip on the bottom", "bottom")
    -
    +

    or use the higher leveler convenient function bsTip

    actionButton("", "primary") %>%
    +
    +
    +

    or use the higher leveler convenient function bsTip

    +
    actionButton("", "primary") %>%
       bsTip("primary", status = "primary")
    -
    +
    actionButton("", "info") %>%
    +
    +
    +
    actionButton("", "info") %>%
       bsTip("info", status = "info")
    -
    +
    actionButton("", "success") %>%
    +
    +
    +
    actionButton("", "success") %>%
       bsTip("success", status = "success")
    -
    +
    actionButton("", "warning") %>%
    +
    +
    +
    actionButton("", "warning") %>%
       bsTip("warning", status = "warning")
    -
    +
    actionButton("", "danger") %>%
    +
    +
    +
    actionButton("", "danger") %>%
       bsTip("danger", status = "danger")
    -
    +

    Titles with spsTitle

    You can use {spsComps} to add colorful titles in Rmarkdown

    spsTitle("primary", status = "primary")
    -

    primary

    spsTitle("info", status = "info")
    -

    info

    spsTitle("success", status = "success")
    -

    success

    spsTitle("warning", status = "warning")
    -

    warning

    spsTitle("danger", status = "danger")
    -

    danger


    Or you own colors

    spsTitle("purple", other_color = "purple")
    -

    purple

    spsTitle("pink", other_color = "pink")
    -

    pink

    Add horizontal divider lines with spsHr

    spsHr("info")
    -

    spsHr("primary")
    -

    spsHr("success")
    -

    spsHr("warning")
    -

    spsHr("danger")
    -

    Other components

    Other components are either performed the best in a Shiny app or requires -a server. Please see the demo

    + +

    Titles with spsTitle

    +

    You can use {spsComps} to add colorful titles in Rmarkdown

    +
    spsTitle("primary", status = "primary")
    +
    +

    primary

    +
    spsTitle("info", status = "info")
    +
    +

    info

    +
    spsTitle("success", status = "success")
    +
    +

    success

    +
    spsTitle("warning", status = "warning")
    +
    +

    warning

    +
    spsTitle("danger", status = "danger")
    +
    +

    danger

    +
    +

    Or you own colors

    +
    spsTitle("purple", other_color = "purple")
    +
    +

    purple

    +
    spsTitle("pink", other_color = "pink")
    +
    +

    pink

    +

    Add horizontal divider lines with spsHr

    +
    spsHr("info")
    +
    +
    +
    spsHr("primary")
    +
    +
    +
    spsHr("success")
    +
    +
    +
    spsHr("warning")
    +
    +
    +
    spsHr("danger")
    +
    +
    +

    Other components

    +

    Other components are either performed the best in a Shiny app or requires +a server. Please see the demo

    + + + +
    Last modified 2021-05-17: spscomps update no_render (29aa189e) +
    +
    + + +
    + + + +
    +
    + + + + +
    + + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/dev/spsutil/index.html b/public/sps/dev/spsutil/index.html index 0fddbddb1..c78969490 100644 --- a/public/sps/dev/spsutil/index.html +++ b/public/sps/dev/spsutil/index.html @@ -1,124 +1,1189 @@ -spsUtil | sysPipe + + + + + + + + + + + + + + + + + +spsUtil | sysPipe + + + + + + + + + + + + + + +

    spsUtil


    SPS framework come with a plenty of useful general R utility functions, like -pretty logging, package namespace checking, URL checking, and more.

    Since SPS 1.1, these functions are separated into a supporting package called -spsUtil (systemPipeShiny Utility). You can install it from CRAN.

    Installation

    Read the developer tools main page, not repeating here.

    Functions reference manual

    In documents, we only highlight some important functions. Please read -the reference manuals for details of every function.

    Function highlights

    library(spsUtil)
    -

    logging with msg

    basic

    Often times in an R function, we want to use some text to inform users the +Functions reference manual In documents, we only highlight some important functions. Please read the reference manuals for details of every function."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

    spsUtil

    + + +
    +

    SPS framework come with a plenty of useful general R utility functions, like +pretty logging, package namespace checking, URL checking, and more.

    +

    Since SPS 1.1, these functions are separated into a supporting package called +spsUtil (systemPipeShiny Utility). You can install it from CRAN.

    +

    Installation

    +

    Read the developer tools main page, not repeating here.

    +

    Functions reference manual

    +

    In documents, we only highlight some important functions. Please read +the reference manuals for details of every function.

    +

    Function highlights

    +
    library(spsUtil)
    +
    +

    logging with msg

    +

    basic

    +

    Often times in an R function, we want to use some text to inform users the status and message. We can use functions like message, warning, stop to generate different -levels of information.

    {spsUtil} provides some more informative and prettier ways to generate these kind of messages.

    msg("my message")
    -
    ## [INFO] 2021-04-12 11:49:35 my message
    -

    You can see it starts with a level information, then a time stamp, and follows the +levels of information.

    +

    {spsUtil} provides some more informative and prettier ways to generate these kind of messages.

    +
    msg("my message")
    +
    +
    ## [INFO] 2021-04-12 11:49:35 my message
    +
    +

    You can see it starts with a level information, then a time stamp, and follows the actual message. By default, it uses the INFO level, and you can change to whatever -level you want. However, there are 3 keywords that have special meaning.

    Levels

    • INFO: equals message method in native R
    • WARNING: generates warnings the same as warning function
    • ERROR: generates error the same as stop function and will prevent downstream -code get evaluated.

    If the level is other than these 3, there is no special meaning in R, just cat -the message out.

    msg("I am info", level = "INFO")
    -
    ## [INFO] 2021-04-12 11:49:35 I am info
    -
    msg("I am warning", level = "warning") # not case sensitive
    -
    ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning
    -
    msg("I am error", level = "ERROR")
    -
    ## Error: 
    +level you want. However, there are 3 keywords that have special meaning.

    +

    Levels

    +
      +
    • INFO: equals message method in native R
    • +
    • WARNING: generates warnings the same as warning function
    • +
    • ERROR: generates error the same as stop function and will prevent downstream +code get evaluated.
    • +
    +

    If the level is other than these 3, there is no special meaning in R, just cat +the message out.

    +
    msg("I am info", level = "INFO")
    +
    +
    ## [INFO] 2021-04-12 11:49:35 I am info
    +
    +
    msg("I am warning", level = "warning") # not case sensitive
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning
    +
    +
    msg("I am error", level = "ERROR")
    +
    +
    ## Error: 
     [ERROR] 2021-04-12 11:49:35 I am error
    -
    msg("I am random level", level = "MY LEVEL")
    -
    ## [MY LEVEL] 2021-04-12 11:49:35 I am random level
    -

    Prefix

    For the 3 key levels, you can specify the prefix in front of the level text to -over write the default level text INFO, WARNING, or ERROR

    msg("I am info", level = "INFO", info_text = "NEW-INFO")
    -
    ## [NEW-INFO] 2021-04-12 11:49:35 I am info
    -
    msg("I am warning", level = "warning", warning_text = "MY-WARNING")
    -
    ## Warning: [MY-WARNING] 2021-04-12 11:49:35 I am warning
    -
    msg("I am error", level = "ERROR", error_text = "STOP")
    -
    ## Error: 
    +
    +
    msg("I am random level", level = "MY LEVEL")
    +
    +
    ## [MY LEVEL] 2021-04-12 11:49:35 I am random level
    +
    +

    Prefix

    +

    For the 3 key levels, you can specify the prefix in front of the level text to +over write the default level text INFO, WARNING, or ERROR

    +
    msg("I am info", level = "INFO", info_text = "NEW-INFO")
    +
    +
    ## [NEW-INFO] 2021-04-12 11:49:35 I am info
    +
    +
    msg("I am warning", level = "warning", warning_text = "MY-WARNING")
    +
    +
    ## Warning: [MY-WARNING] 2021-04-12 11:49:35 I am warning
    +
    +
    msg("I am error", level = "ERROR", error_text = "STOP")
    +
    +
    ## Error: 
     [STOP] 2021-04-12 11:49:35 I am error
    -

    Colors

    Colors are automatically enabled if it is supported. If you try all code above in +

    +

    Colors

    +

    Colors are automatically enabled if it is supported. If you try all code above in your terminal or Rstudio, they all have colors. In Rmd, to enable the color, -you need to add the following code chunk. You also need to install the fansi package.

    ```{r echo=FALSE, results='asis'} 
    +you need to add the following code chunk. You also need to install the fansi package.

    +
    ```{r echo=FALSE, results='asis'} 
     options(crayon.enabled = TRUE)
     old_hooks <- fansi::set_knit_hooks(knitr::knit_hooks, which = c("output", "message", "error", "warning"))
     ```
    -
    msg("I am info", level = "INFO", info_text = "NEW-INFO")
    -
    ## [NEW-INFO] 2021-04-12 11:49:35 I am info
    -

    The 3 key levels has default colors:

    • INFO: blue
    • WARNING: orange
    • ERROR: red

    You can specify colors for your own levels

    msg("I am warning", level = "warning") ## not super orange in Rmd translation -_-=
    -
    ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning
    -
    msg("I am error", level = "error")
    -
    ## Error: 
    -[ERROR] 2021-04-12 11:49:35 I am error
    -
    msg("oh yeah", level = "SUCCESS", .other_color = "green")
    -
    ## [SUCCESS] 2021-04-12 11:49:35 oh yeah
    -
    msg("oh no", level = "FAIL", .other_color = "purple")
    -
    ## [FAIL] 2021-04-12 11:49:35 oh no
    -

    Wrapper

    You can use this logging function in your own projects by wrapping it inside a +

    + +
    msg("I am info", level = "INFO", info_text = "NEW-INFO")
    +
    +
    ## [NEW-INFO] 2021-04-12 11:49:35 I am info
    +
    +

    The 3 key levels has default colors:

    +
      +
    • INFO: blue
    • +
    • WARNING: orange
    • +
    • ERROR: red
    • +
    +

    You can specify colors for your own levels

    +
    msg("I am warning", level = "warning") ## not super orange in Rmd translation -_-=
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:35 I am warning
    +
    +
    msg("I am error", level = "error")
    +
    +
    ## Error: 
    +[ERROR] 2021-04-12 11:49:35 I am error
    +
    +
    msg("oh yeah", level = "SUCCESS", .other_color = "green")
    +
    +
    ## [SUCCESS] 2021-04-12 11:49:35 oh yeah
    +
    +
    msg("oh no", level = "FAIL", .other_color = "purple")
    +
    +
    ## [FAIL] 2021-04-12 11:49:35 oh no
    +
    +

    Wrapper

    +

    You can use this logging function in your own projects by wrapping it inside a upper level function, like what we do for spsinfo, spswarn, spserror. They -have SPS- prefix added, and have some SPS global settings appended.

    spsOption('use_crayon', TRUE)
    +have SPS- prefix added, and have some SPS global settings appended.

    +
    spsOption('use_crayon', TRUE)
     spsinfo("info", verbose = TRUE) ## default `verbose` mute the message
    -
    ## [SPS-INFO] 2021-04-12 11:49:35 info
    -
    spswarn("warning")
    -
    ## Warning: [SPS-WARNING] 2021-04-12 11:49:35 warning
    -
    spserror("stop")
    -
    ## Error: 
    -[SPS-ERROR] 2021-04-12 11:49:35 stop
    -

    To create a simple one for project is very easy. Assume your project is named “My Project”. -You can create logging as:

    mpInfo <- function(text){
    +
    +
    ## [SPS-INFO] 2021-04-12 11:49:35 info
    +
    +
    spswarn("warning")
    +
    +
    ## Warning: [SPS-WARNING] 2021-04-12 11:49:35 warning
    +
    +
    spserror("stop")
    +
    +
    ## Error: 
    +[SPS-ERROR] 2021-04-12 11:49:35 stop
    +
    +

    To create a simple one for project is very easy. Assume your project is named “My Project”. +You can create logging as:

    +
    mpInfo <- function(text){
       spsUtil::msg(text, info_text = "MP-INFO")
     }
     mpWarn <- function(text){
    @@ -128,15 +1193,23 @@
       spsUtil::msg(text, level = "error", error_text = "MP-ERROR")
     }
     mpInfo("info")
    -
    ## [MP-INFO] 2021-04-12 11:49:35 info
    -
    mpWarn("warning")
    -
    ## Warning: [MP-WARNING] 2021-04-12 11:49:35 warning
    -
    mpErr("error")
    -
    ## Error: 
    -[MP-ERROR] 2021-04-12 11:49:35 error
    -

    mute message with quiet

    In R, you can easily mute message and warnings with suppressMessages(), and +

    +
    ## [MP-INFO] 2021-04-12 11:49:35 info
    +
    +
    mpWarn("warning")
    +
    +
    ## Warning: [MP-WARNING] 2021-04-12 11:49:35 warning
    +
    +
    mpErr("error")
    +
    +
    ## Error: 
    +[MP-ERROR] 2021-04-12 11:49:35 error
    +
    +

    mute message with quiet

    +

    In R, you can easily mute message and warnings with suppressMessages(), and suppressWarnings(), but not so easy with print or cat methods. spsUtil::quiet -enables you to mute all these methods or choose what to mute.

    {
    +enables you to mute all these methods or choose what to mute.

    +
    {
     # muted
     quiet(warning(123))
     quiet(message(123))
    @@ -152,10 +1225,13 @@
     ## 123
     ## [1] 123
     ## 123
    -

    check “empty” values with emptyIsFalse

    In R, values like NA, "", NULL, length(0) is not very meaningful in +

    +

    check “empty” values with emptyIsFalse

    +

    In R, values like NA, "", NULL, length(0) is not very meaningful in condition judgment and will give you errors. Yet, R does not have a native method to handle these “empty” values in if like other languages. They are -meaningful in other ways, but in conditions, we may want to turn them to FALSE.

    if("") TRUE else FALSE
    +meaningful in other ways, but in conditions, we may want to turn them to FALSE.

    +
    if("") TRUE else FALSE
     ## Error in if ("") TRUE else FALSE: argument is not interpretable as logical
     if(NULL) TRUE else FALSE
     ## Error in if (NULL) TRUE else FALSE: argument is of length zero
    @@ -163,8 +1239,10 @@
     ## Error in if (character(0)) TRUE else FALSE: argument is of length zero
     if(NA) TRUE else FALSE
     ## Error in if (NA) TRUE else FALSE: missing value where TRUE/FALSE needed
    -

    You can see they all give errors. In other languages (javascript in this example), -these values are often treated as FALSE.

    if (NaN) true; else false
    +
    +

    You can see they all give errors. In other languages (javascript in this example), +these values are often treated as FALSE.

    +
    if (NaN) true; else false
     //> false
     if (undefined) true; else false
     //> false
    @@ -172,11 +1250,20 @@
     //> false
     if (null) true; else false
     //> false
    -

    This is how emptyIsFalse -work. If the input is one of these values, return FALSE, else TRUE

    if(emptyIsFalse("")) TRUE else FALSE
    +
    + +

    This is how emptyIsFalse +work. If the input is one of these values, return FALSE, else TRUE

    +
    if(emptyIsFalse("")) TRUE else FALSE
     ## [1] FALSE
     if(emptyIsFalse(NULL)) TRUE else FALSE
     ## [1] FALSE
    @@ -184,29 +1271,43 @@
     ## [1] FALSE
     if(emptyIsFalse(NA)) TRUE else FALSE
     ## [1] FALSE
    -

    check missing packages checkNameSpace

    In our functions, sometimes we want to have the users to install certain packages +

    +

    check missing packages checkNameSpace

    +

    In our functions, sometimes we want to have the users to install certain packages to enable more functionalities, like the DESeq2::lfcShrink function. Or like in a Rmd source code, before other people can rerender the document, they must install certain packages. checkNameSpace checks all required packages and returns -the missing names.

    checkNameSpace("random_pkg")
    -
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
    +the missing names.

    +
    checkNameSpace("random_pkg")
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
     ## CRAN: random_pkg
    -
    ## [1] "random_pkg"
    -

    You can add it to your function to or on the top of your Rmd document to inform -your users the missing packages and where to install.

    pkgs <- list(
    +
    +
    ## [1] "random_pkg"
    +
    +

    You can add it to your function to or on the top of your Rmd document to inform +your users the missing packages and where to install.

    +
    pkgs <- list(
       CRAN = c("pkg1", "pkg2"),
       Bioconductor = c("bio_pkg1", "bio_pkg2")
     )
     
     missing_pkg <- checkNameSpace(pkgs[[1]], from =  names(pkgs)[1])
    -
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
     ## CRAN: pkg1,pkg2
    -
    missing_pkg <- c(missing_pkg, checkNameSpace(pkgs[[2]], from =  names(pkgs)[2]))
    -
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
    +
    +
    missing_pkg <- c(missing_pkg, checkNameSpace(pkgs[[2]], from =  names(pkgs)[2]))
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:35 These packages are missing from
     ## Bioconductor: bio_pkg1,bio_pkg2
    -
    if(emptyIsFalse(missing_pkg)) stop("Install packages")
    -
    ## Error in eval(expr, envir, enclos): Install packages
    -

    Or write your custom warning message:

    {
    +
    +
    if(emptyIsFalse(missing_pkg)) stop("Install packages")
    +
    +
    ## Error in eval(expr, envir, enclos): Install packages
    +
    +

    Or write your custom warning message:

    +
    {
     missing_pkg <- mapply(function(pkg, from) {
       checkNameSpace(pkg, quietly = TRUE, from)
     }, pkg = pkgs, from = names(pkgs), SIMPLIFY = FALSE)
    @@ -226,20 +1327,124 @@
     )
     if(emptyIsFalse(unlist(missing_pkg))) stop("Install packages")
     }
    -
    ## Use `install.packages(c('pkg1','pkg2'))` to install CRAN packages
    +
    +
    ## Use `install.packages(c('pkg1','pkg2'))` to install CRAN packages
     ## Use `BiocManager::install(c('bio_pkg1','bio_pkg2'))` to install Bioconductor packages
    -
    ## Error in eval(expr, envir, enclos): Install packages
    -

    check a URL is reachable with checkUrl

    Useful if you need make some big HTTP requests.

    checkUrl("https://google.com")
    -
    ## [1] TRUE
    -
    checkUrl("https://randomwebsite123.com", timeout = 1)
    -
    ## Warning: [WARNING] 2021-04-12 11:49:37 Bad url https://
    +
    +
    ## Error in eval(expr, envir, enclos): Install packages
    +
    +

    check a URL is reachable with checkUrl

    +

    Useful if you need make some big HTTP requests.

    +
    checkUrl("https://google.com")
    +
    +
    ## [1] TRUE
    +
    +
    checkUrl("https://randomwebsite123.com", timeout = 1)
    +
    +
    ## Warning: [WARNING] 2021-04-12 11:49:37 Bad url https://
     ## randomwebsite123.com
    -
    ## Warning: [WARNING] 2021-04-12 11:49:37 Timeout was reached:
    -

    [randomwebsite123.com] Connection timed out after 1001 milliseconds

    -

    ## [1] FALSE
    -
    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/index.html b/public/sps/index.html index 133285cea..bc2e534fd 100644 --- a/public/sps/index.html +++ b/public/sps/index.html @@ -1,61 +1,1042 @@ -systemPipeShiny Documentation | sysPipe

    systemPipeShiny Documentation

    systemPipeShiny -(SPS) extends the widely used systemPipeR + + + + + + + + + + + + + + + + + + + + +systemPipeShiny Documentation | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    systemPipeShiny Documentation

    + + + + + + + +

    systemPipeShiny +(SPS) extends the widely used systemPipeR (SPR) workflow -environment with a versatile graphical user interface provided by a Shiny +environment with a versatile graphical user interface provided by a Shiny App. This allows non-R users, such as experimentalists, to run many systemPipeR’s workflow designs, control, and visualization functionalities interactively without requiring knowledge of R. @@ -65,18 +1046,348 @@ deployments that can be accessed remotely as a public web service for using SPR’s functionalities with community and/or private data. The framework can integrate many core packages from the R/Bioconductor ecosystem. Examples of -SPS' current functionalities include:

    • A default interactive workflow module to +SPS' current functionalities include:

      +
        +
      • A default interactive workflow module to create experimental designs, visualize and customize workflow topologies with previews, and -programming free workflow execution within the application.
      • An interactive module with extensive plot options to visualize downstream analysis of a RNA-Seq workflow.
      • A quick ggplot module to make all variety of scientific plots from any user defined -tabular data.
      • An extendable set of visualization functionalities makes it easy to design -custom Shiny Apps under SPS framework without any knowledge of Shiny.
      • A ‘Canvas Workbench’ to manage complex visual results. It allows users to +programming free workflow execution within the application.
      • +
      • An interactive module with extensive plot options to visualize downstream analysis of a RNA-Seq workflow.
      • +
      • A quick ggplot module to make all variety of scientific plots from any user defined +tabular data.
      • +
      • An extendable set of visualization functionalities makes it easy to design +custom Shiny Apps under SPS framework without any knowledge of Shiny.
      • +
      • A ‘Canvas Workbench’ to manage complex visual results. It allows users to organize and to compare plots in an efficient manner combined -with a session screenshot feature to edit scientific and publishable figures.
      • Three other supporting packages to help all users from beginners and advanced developers -to extend under current SPS framework or on their own visualization apps.

      Demo

      View our online demo app:

      Type and linkoption changednotes
      Default full installation{blk}See installationfull app
      Minimum installation{blk}See installationno modules installed
      Login enabled{blk}login_screen = TRUE; login_theme = "empty"no modules installed
      Login and login themes{blk}login_screen = TRUE; login_theme = "random"no modules installed
      App admin page{blk}admin_page = TRUEor simply add “?admin” to the end of URL of demos

      For the login required demos, the app account name is “user” password “user”.

      For the admin panel login, account name “admin”, password “admin”.

      Please DO NOT delete or change password when you are using the admin features. +with a session screenshot feature to edit scientific and publishable figures.

    • +
    • Three other supporting packages to help all users from beginners and advanced developers +to extend under current SPS framework or on their own visualization apps.
    • +
    +

    Demo

    +

    View our online demo app:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Type and linkoption changednotes
    Default full installation{blk}See installationfull app
    Minimum installation{blk}See installationno modules installed
    Login enabled{blk}login_screen = TRUE; login_theme = "empty"no modules installed
    Login and login themes{blk}login_screen = TRUE; login_theme = "random"no modules installed
    App admin page{blk}admin_page = TRUEor simply add “?admin” to the end of URL of demos
    +

    For the login required demos, the app account name is “user” password “user”.

    +

    For the admin panel login, account name “admin”, password “admin”.

    +

    Please DO NOT delete or change password when you are using the admin features. shinyapp.io will reset the app once a while, but this will affect other people -who are trying the demo simultaneously.

    Other packages in systemPipeShiny

    PackageDescriptionDocumentsFunction referenceDemo
    systemPipeShiny{blk}SPS main packagewebsitelinkdemo{blk}
    spsComps{blk}SPS UI and server componentswebsitelinkdemo{blk}
    drawer{blk}SPS interactive image editing toolwebsitelinkdemo{blk}
    spsUtil{blk}SPS utility functionswebsitelinkNA
    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/index.xml b/public/sps/index.xml index acb75c315..fd0bf8f45 100644 --- a/public/sps/index.xml +++ b/public/sps/index.xml @@ -1 +1,17 @@ -sysPipe – systemPipeShiny Documentation/sps/Recent content in systemPipeShiny Documentation on sysPipeHugo -- gohugo.io \ No newline at end of file + + + sysPipe – systemPipeShiny Documentation + /sps/ + Recent content in systemPipeShiny Documentation on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/public/sps/install/index.html b/public/sps/install/index.html index 8e31da8bf..2dcf09bbb 100644 --- a/public/sps/install/index.html +++ b/public/sps/install/index.html @@ -1,93 +1,1174 @@ -Installation | sysPipe + + + + + + + + + + + + + + + + + +Installation | sysPipe + + + + + + + + + + + + + + +

    Installation

    Full

    if (!requireNamespace("BiocManager", quietly=TRUE))
    +if (!requireNamespace("BiocManager", quietly=TRUE)) install.packages("BiocManager") BiocManager::install("systemPipeShiny")  By the minimum installation, all the 3 core modules are not installed."/>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  
    +  
    +    
    + + + +
    +
    +
    +
    +
    + + + + + +
    + + + + +
    + + + + +
    + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
    + + + + + + + + + +
    +
    + + + + + + +
    +

    Installation

    + + +

    Full

    +
    if (!requireNamespace("BiocManager", quietly=TRUE))
         install.packages("BiocManager")
     BiocManager::install("systemPipeShiny", dependencies=TRUE)
     
    -

    This will install all required packages including suggested packages that +

    +

    This will install all required packages including suggested packages that are required by the core modules. Be aware, it will take quite some time if you are installing on Linux where only source installation is available. Windows and Mac -binary installations will be much faster.

    Minimum

    To install the package, please use the BiocManager::install command:

    if (!requireNamespace("BiocManager", quietly=TRUE))
    +binary installations will be much faster.

    +

    Minimum

    +

    To install the package, please use the BiocManager::install command:

    +
    if (!requireNamespace("BiocManager", quietly=TRUE))
         install.packages("BiocManager")
     BiocManager::install("systemPipeShiny")
     
    -

    By the minimum installation, all the 3 core modules are not installed. You +

    +

    By the minimum installation, all the 3 core modules are not installed. You can still start the app, and When you start the app and click on these modules, it will tell to enable these modules, what packages and command you need to run. -Just follow the instructions. So, install as you need.

    Most recent

    To obtain the most recent updates immediately, one can install it directly from -GitHub{blk} as follow:

    if (!requireNamespace("remotes", quietly=TRUE))
    +Just follow the instructions. So, install as you need.

    +

    Most recent

    +

    To obtain the most recent updates immediately, one can install it directly from +GitHub{blk} as follow:

    +
    if (!requireNamespace("remotes", quietly=TRUE))
         install.packages("remotes")
     remotes::install("systemPipeR/systemPipeShiny", dependencies=TRUE)
    -

    Similarly, remotes::install("systemPipeR/systemPipeShiny") for the minimum develop -version.

    Linux

    If you are on Linux, you may also need the following libraries before installing SPS. +

    +

    Similarly, remotes::install("systemPipeR/systemPipeShiny") for the minimum develop +version.

    +

    Linux

    +

    If you are on Linux, you may also need the following libraries before installing SPS. Different distributions -may have different commands, but the following commands are examples for Ubuntu:

    sudo apt-get install -y libicu-dev
    +may have different commands, but the following commands are examples for Ubuntu:

    +
    sudo apt-get install -y libicu-dev
     sudo apt-get install -y pandoc
     sudo apt-get install -y zlib1g-dev
     sudo apt-get install -y libcurl4-openssl-dev
     sudo apt-get install -y libssl-dev      
     sudo apt-get install -y make
    -

    On other Linux distributions, the install commands may be slightly different.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/intro/index.html b/public/sps/intro/index.html index 906d63d4a..9f4b0dd18 100644 --- a/public/sps/intro/index.html +++ b/public/sps/intro/index.html @@ -1,77 +1,1153 @@ -Introduction | sysPipe

    Introduction


    Main functionalities

    Currently, SPS includes 3 main functional categories (Fig 1):

    1. Some pre-defined modules (tabs) include: + + + + + + + + + + + + + + + + + + + +Introduction | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + + + +
      +
      + + + + + + +
      +

      Introduction

      + + +
      +

      Main functionalities

      +

      Currently, SPS includes 3 main functional categories (Fig 1):

      +
        +
      1. Some pre-defined modules (tabs) include: a. A workbench for designing and configuring data analysis workflows, b. Downstream analysis and visualization tools for RNA-Seq, and -c. A space to make quick ggplots.
      2. A section with user custom tabs: users define their own shiny tabs.
      3. An image editing tab “Canvas” which allows users to edit plots made from -the previous two categories.

      Besides, SPS provides many functions to extend the default Shiny development, like +c. A space to make quick ggplots.

    2. +
    3. A section with user custom tabs: users define their own shiny tabs.
    4. +
    5. An image editing tab “Canvas” which allows users to edit plots made from +the previous two categories.
    6. +
    +

    Besides, SPS provides many functions to extend the default Shiny development, like more UI components, server functions. Also, SPS has some useful general R ulitlies -like error catching, logging, and more.

    SPS_structure

    Figure 1. Design of SPS

    The framework provides an -interactive web interface for workflow management and data visualization.

    SPS tabs

    Within the functional categories, SPS functions are modularized into +like error catching, logging, and more.

    +
    +

    SPS_structure

    +
    +

    Figure 1. Design of SPS

    +

    The framework provides an +interactive web interface for workflow management and data visualization.

    +

    SPS tabs

    +

    Within the functional categories, SPS functions are modularized into sub-components, here referred to as SPS tabs that are similar to menu tabs in other GUI applications that organize related and inter-connected -functionalies into groups. On the backend, SPS tabs are based on Shiny modules, +functionalies into groups. On the backend, SPS tabs are based on Shiny modules, that are stored in separate files. This modular structure is highly extensible and greatly simplifies the design of new SPS tabs by both users and/or developers. Details about extending existing tabs and designing new ones are provided in -Manage tabs section on our website.

    + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/modules/ggplot/index.html b/public/sps/modules/ggplot/index.html index c3014b7a1..b04b92337 100644 --- a/public/sps/modules/ggplot/index.html +++ b/public/sps/modules/ggplot/index.html @@ -1,70 +1,1174 @@ -Quick ggplot | sysPipe

    Quick ggplot

    Quick {ggplot} module

    This module enables you to quickly upload datasets and make a {ggplot{blk}} -in a second by using some functionalities from {Esquisse{blk}}.

    Upload data

    quickgg

    Upload data
    1. The first thing you come to this module is to upload a tabular data file. You + + + + + + + + + + + + + + + + + + + +Quick ggplot | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + + + +
      +
      + + + + + + +
      +

      Quick ggplot

      + + +

      Quick {ggplot} module

      +

      This module enables you to quickly upload datasets and make a {ggplot{blk}} +in a second by using some functionalities from {Esquisse{blk}}.

      +

      Upload data

      +
      +

      quickgg

      +Upload data +
      +
        +
      1. The first thing you come to this module is to upload a tabular data file. You can choose to use the example or upload your own. The example is just the iris -data.
        • 1.1. If you choose to upload, there will be a upload button where you need to -choose your own file.
      2. By default, it assumes you upload a “.csv” file with “#” as comments. If not -you can choose the file delimiter and comment character.
      3. You can view your uploaded data and use the boxes below each column name to -perform some filters, but you are not allowed to edit the data.
      4. If everything looks good, you can submit to proceed to the plot making panel.

      Make a plot

      quickgg

      Make a plot

      Figure 8 Quick ggplot

      1. Provide a tabular data table by uploading or use example.
      2. Drag variables from into different ggplot aesthetic boxes to make a ggplot.
      3. Change to different plot types.
      4. Customize other different plotting options.

      For a more specific guide, read -Esquisse official guide{blk}.

      + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/modules/index.html b/public/sps/modules/index.html index 6be75d6ac..f58d95538 100644 --- a/public/sps/modules/index.html +++ b/public/sps/modules/index.html @@ -1,60 +1,1206 @@ -Modules | sysPipe
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + +
      +
      + + + + + + +
      +

      Modules

      + + + + +
      +

      In this section, we will discuss the pre-defined modules in SPS

      + +
      + + +
      + + + + + +
      + + + + + + + + + + +
      +
      + Workflow +
      +

      +
      + + + + + + + + + + + +
      +
      + RNAseq +
      +

      +
      + + + + + + + + + +
      +
      + Quick ggplot +
      +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      Last modified 2021-02-08: sps updates no_render (c30b3d05) +
      +
      + +
      + + + +
      +
      + + + + +
      + + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/modules/index.xml b/public/sps/modules/index.xml index 07335b910..6cb3aa6b0 100644 --- a/public/sps/modules/index.xml +++ b/public/sps/modules/index.xml @@ -1,378 +1,433 @@ -sysPipe – Modules/sps/modules/Recent content in Modules on sysPipeHugo -- gohugo.ioSps: Workflow/sps/modules/workflow/Mon, 01 Jan 0001 00:00:00 +0000/sps/modules/workflow/ -<h2 id="workflow-management">Workflow management</h2> -<p>The workflow management module in <code>SPS</code> allows one to modify or create the + + + sysPipe – Modules + /sps/modules/ + Recent content in Modules on sysPipe + Hugo -- gohugo.io + + + + + + + + + + + Sps: Workflow + /sps/modules/workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/modules/workflow/ + + + + <h2 id="workflow-management">Workflow management</h2> +<p>The workflow management module in <code>SPS</code> allows one to modify or create the configuration files required for running data analysis workflows in -<a href="https://systempipe.org/sp/spr/">systemPipeR</a> (SPR). This includes +<a href="https://systempipe.org/sp/spr/">systemPipeR</a> (SPR). This includes three types of important files: a sample metadata (targets) file, a workflow file (in R Markdown format) defining the workflow steps, and workflow running -files in <a href="https://www.commonwl.org/">Common Workflow Language (CWL){blk}</a> format. In SPS, one can easily create +files in <a href="https://www.commonwl.org/">Common Workflow Language (CWL){blk}</a> format. In SPS, one can easily create these files under the &ldquo;Workflow Management&rdquo; module, located in navigation bar -on the <a href="../../sps/quick_start/#launch-sps">left of the dashboard</a>.</p> -<p>The current version of <code>SPS</code> allows to:</p> -<ol> -<li>create a workflow environment;</li> -<li>create and/or check the format of targets / workflow / CWL files;</li> -<li>download the prepared workflow files to run elsewhere, like a cluster;</li> -<li>directly execute the workflow from SPS.</li> -</ol> -<h3 id="1-setup-a-workflow">1. setup a workflow</h3> -<center> -<p><img src="../img/sps_wf_setup.jpg" alt="wf_setup"></p> -</center> -<p><strong>Figure 3. A.</strong> Workflow Management - Targets File</p> -<ol> -<li>In the workflow module, read the instructions and choose step 1. Step 1 should be -automatically opened for you on start.</li> -<li>Choose a folder where you want to create the workflow environment.</li> -<li>Choose a workflow template. These are SPR workflows and mainly are next-generation -sequencing workflows.</li> -<li>Click &ldquo;Gen workflow&rdquo; to create the workflow project.</li> -<li>You should see a pop-up saying about the project path and other information. +on the <a href="../../sps/quick_start/#launch-sps">left of the dashboard</a>.</p> +<p>The current version of <code>SPS</code> allows to:</p> +<ol> +<li>create a workflow environment;</li> +<li>create and/or check the format of targets / workflow / CWL files;</li> +<li>download the prepared workflow files to run elsewhere, like a cluster;</li> +<li>directly execute the workflow from SPS.</li> +</ol> +<h3 id="1-setup-a-workflow">1. setup a workflow</h3> +<center> +<p><img src="../img/sps_wf_setup.jpg" alt="wf_setup"></p> +</center> +<p><strong>Figure 3. A.</strong> Workflow Management - Targets File</p> +<ol> +<li>In the workflow module, read the instructions and choose step 1. Step 1 should be +automatically opened for you on start.</li> +<li>Choose a folder where you want to create the workflow environment.</li> +<li>Choose a workflow template. These are SPR workflows and mainly are next-generation +sequencing workflows.</li> +<li>Click &ldquo;Gen workflow&rdquo; to create the workflow project.</li> +<li>You should see a pop-up saying about the project path and other information. Clicking the pop-up will jump you to the step 2. The status tracker and banner for -step 1 should all turn green.</li> -</ol> -<h3 id="2-prepare-the-targets-file">2. Prepare the targets file</h3> -<p>The targets file defines all input file paths and other sample information of +step 1 should all turn green.</li> +</ol> +<h3 id="2-prepare-the-targets-file">2. Prepare the targets file</h3> +<p>The targets file defines all input file paths and other sample information of analysis workflows. To better undertand the structure of this file, one can -consult the <a href="https://systempipe.org/sp/spr/gettingstarted/#structure-of-targets-file">&ldquo;Structure of targets -file&rdquo;</a> +consult the <a href="https://systempipe.org/sp/spr/gettingstarted/#structure-of-targets-file">&ldquo;Structure of targets +file&rdquo;</a> section in the SPR vignette. Essentially, this is the tabular file representation -of the <code>colData</code> slot in an <code>SummarizedExperiment</code> object which stores sample -IDs and other meta information.</p> -<p>The following step-by-step instructions explain how to create and/or modify targets -files using RNA-Seq as an example (Fig.3 A):</p> -<ol> -<li>Your project targets file is loaded for you, but you can choose to upload a different one.</li> -<li>You can edit, right click to add/remove rows/columns (The first row is treated as column names).</li> -<li>SPR target file includes a header block, that can also be edited in the SPS app. Each headers needs to start with a &ldquo;#&rdquo;. Header is useful for workflows with DEG analysis in current SPR. You can define sample comparison groups -here. Leave it as default for other projects.</li> -<li>The section on the left provides sample statistics and information whether files exist inside the workflow project&rsquo;s <code>data</code> directory. Choose any column you want from the dropdown to check and watch the statistics bar change in this section.</li> -<li>statistic status bar.</li> -<li>Clicking on &ldquo;Add to task&rdquo; can help you to check if your target file has any formatting problem. You should see a green success pop-up if everything is right. Now your target file is ready and you can click &ldquo;save&rdquo; to download it and later use in other SPR projects.</li> -</ol> -<center> -<p><img src="../img/sps_ui_target.jpg" alt="wf_targets"></p> -</center> -<p><strong>Figure 3. A.</strong> Workflow Management - Targets File</p> -<h3 id="3-prepare-a-workflow-object">3. Prepare a workflow object</h3> -<p>In SPR, workflows are defined in Rmarkdown files, you can read details and obtain them <a href="https://systempipe.org/sp/spr/templates/">here</a>.</p> -<p>Now let us follow the order below to see how SPS helps you to prepare a workflow file for a RNAseq project (Fig.3 B):</p> -<ol> -<li>The left panal is the workflow designer. All steps from the template from your +of the <code>colData</code> slot in an <code>SummarizedExperiment</code> object which stores sample +IDs and other meta information.</p> +<p>The following step-by-step instructions explain how to create and/or modify targets +files using RNA-Seq as an example (Fig.3 A):</p> +<ol> +<li>Your project targets file is loaded for you, but you can choose to upload a different one.</li> +<li>You can edit, right click to add/remove rows/columns (The first row is treated as column names).</li> +<li>SPR target file includes a header block, that can also be edited in the SPS app. Each headers needs to start with a &ldquo;#&rdquo;. Header is useful for workflows with DEG analysis in current SPR. You can define sample comparison groups +here. Leave it as default for other projects.</li> +<li>The section on the left provides sample statistics and information whether files exist inside the workflow project&rsquo;s <code>data</code> directory. Choose any column you want from the dropdown to check and watch the statistics bar change in this section.</li> +<li>statistic status bar.</li> +<li>Clicking on &ldquo;Add to task&rdquo; can help you to check if your target file has any formatting problem. You should see a green success pop-up if everything is right. Now your target file is ready and you can click &ldquo;save&rdquo; to download it and later use in other SPR projects.</li> +</ol> +<center> +<p><img src="../img/sps_ui_target.jpg" alt="wf_targets"></p> +</center> +<p><strong>Figure 3. A.</strong> Workflow Management - Targets File</p> +<h3 id="3-prepare-a-workflow-object">3. Prepare a workflow object</h3> +<p>In SPR, workflows are defined in Rmarkdown files, you can read details and obtain them <a href="https://systempipe.org/sp/spr/templates/">here</a>.</p> +<p>Now let us follow the order below to see how SPS helps you to prepare a workflow file for a RNAseq project (Fig.3 B):</p> +<ol> +<li>The left panal is the workflow designer. All steps from the template from your choosen workflow will be displayed here. The arrows indicates the execution order -of the entire workflow.</li> -<li>All the steps are draggable. Drag and place steps to a different place to change the +of the entire workflow.</li> +<li>All the steps are draggable. Drag and place steps to a different place to change the order. Note: if you change the order, it may break the dependency. SPS will check this for you. After changing orders, steps marked in pink mean these steps are -broken. You need to fix the dependency before you can save it.</li> -<li>To config a step, such as, changing name, fixing dependency. Click the <i class="fa fa-cog"></i> -button next to each step, a modal will show up and you can make changes there.</li> -<li>To add a step, click the <i class="fa fa-plus"></i> button. There, you will have -more options to choose which will be explained in the next figure.</li> -<li>History is enabled in this designer, you can undo <i class="fa fa-undo"></i> -or redo<i class="fa fa-redo"></i> anytime you want. -Current SPS stores max 100 steps of history for you.</li> -<li>To delete a step, simply drag it to the trash can.</li> -<li>After you are done with all edits, click here to save the workflow so we can -run or download it in the next major step.</li> -<li>On the right side is the workflow dependency plot. This plot shows how each -step is connected and the <strong>expected</strong> execution order. It does not mean the +broken. You need to fix the dependency before you can save it.</li> +<li>To config a step, such as, changing name, fixing dependency. Click the <i class="fa fa-cog"></i> +button next to each step, a modal will show up and you can make changes there.</li> +<li>To add a step, click the <i class="fa fa-plus"></i> button. There, you will have +more options to choose which will be explained in the next figure.</li> +<li>History is enabled in this designer, you can undo <i class="fa fa-undo"></i> +or redo<i class="fa fa-redo"></i> anytime you want. +Current SPS stores max 100 steps of history for you.</li> +<li>To delete a step, simply drag it to the trash can.</li> +<li>After you are done with all edits, click here to save the workflow so we can +run or download it in the next major step.</li> +<li>On the right side is the workflow dependency plot. This plot shows how each +step is connected and the <strong>expected</strong> execution order. It does not mean the the workflow will be run in the same order. The order is determined by the order -you have in the left-side designer.</li> -<li>Enlarge the left or right panel. If you have a small monitor screen, this can help.</li> -</ol> -<center> -<p><img src="../img/sps_ui_wf.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.1</strong> Workflow Management - Workflow Designer</p> -</center> -<h4 id="r-step-and-sysargs-step">R step and sysArgs step</h4> -<p>On the designer there are two types of workflow steps. One is R step, which only +you have in the left-side designer.</li> +<li>Enlarge the left or right panel. If you have a small monitor screen, this can help.</li> +</ol> +<center> +<p><img src="../img/sps_ui_wf.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.1</strong> Workflow Management - Workflow Designer</p> +</center> +<h4 id="r-step-and-sysargs-step">R step and sysArgs step</h4> +<p>On the designer there are two types of workflow steps. One is R step, which only has R code. Then it is the time to run these R steps, they will be run in the same R session as the Shiny app and in a separate environment different than your global -environment. In other words, all R steps are in <strong>the same environment</strong>, they can communicate +environment. In other words, all R steps are in <strong>the same environment</strong>, they can communicate with each other, meaning you can define a variable in one step and use it in other -R steps.</p> -<p>sysArgs steps, on the other hand, is different, as its name suggest, it will invoke +R steps.</p> +<p>sysArgs steps, on the other hand, is different, as its name suggest, it will invoke system commands (like bash) when run. Details of how to create these steps will be -discussed on <em>Fig 3.B.5</em>, <em>Fig 3.B.6</em>.</p> -<h4 id="view-and-modify-steps">View and modify steps</h4> -<p>Current SPS allows users to view some basic information of R steps like, step name, +discussed on <em>Fig 3.B.5</em>, <em>Fig 3.B.6</em>.</p> +<h4 id="view-and-modify-steps">View and modify steps</h4> +<p>Current SPS allows users to view some basic information of R steps like, step name, select dependency(ies). Besides, users are welcome to change the R code they want -in the second sub-tab (Fig 3.B.2).</p> -<center> -<p><img src="../img/wf_config_r.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.2</strong> Workflow Management - config R</p> -</center> -<p>Modification of sysArgs steps is limited to step name and dependency. However, this +in the second sub-tab (Fig 3.B.2).</p> +<center> +<p><img src="../img/wf_config_r.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.2</strong> Workflow Management - config R</p> +</center> +<p>Modification of sysArgs steps is limited to step name and dependency. However, this kind steps will provide more information to view, like the files that were used to create this step, raw commandline code that will be run, targets (metadata) and output dataframes. This information -is distributed in different subtabs (Fig 3.B.3).</p> -<center> -<p><img src="../img/wf_config_sys.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.3</strong> Workflow Management - config sysArgs</p> -</center> -<h4 id="create-a-new-step">Create a new step</h4> -<p>After clicking the <i class="fa fa-plus"></i> button in Fig 3.B.1, you would need -to choose whether to create an R or sysArgs step (Figure 3. B.5).</p> -<center> -<p><img src="../img/wf_new_choose.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.5</strong> Workflow Management - Choose new step type</p> -</center> -<p><strong>Create a new R step</strong></p> -<p>Create a new R step is simple. In the modal, type the step name, R code, -and select dependency (Fig 3. B.6).</p> -<center> -<p><img src="../img/wf_new_r.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.6</strong> Workflow Management - New R step</p> -</center> -<p><strong>Create a new sysArgs step</strong></p> -<p>Basic info for sysArgs step is simialr to R step (Fig 3. B.7).</p> -<center> -<p><img src="../img/wf_new_sys1.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.7</strong> Workflow Management - New sysArgs step</p> -</center> -<p>To generate some commandline line, there are three items need to be prepared: -<strong>targets</strong>, <strong>CWL file</strong>, <strong>CWL yaml file</strong> (Fig.3. B.8).</p> -<ul> -<li>targets: metadata that will populate the basecommand sample-wisely. Columns in -targets will be injected into CWL yaml and then, yaml file will replace variables in parsed CWL base command.</li> -<li>CWL file: provide the base command.</li> -<li>CWL yaml file: provides CWL variables.</li> -</ul> -<ol> -<li>Choose the targets source. Targets in SPR workflow steps can come from either a +is distributed in different subtabs (Fig 3.B.3).</p> +<center> +<p><img src="../img/wf_config_sys.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.3</strong> Workflow Management - config sysArgs</p> +</center> +<h4 id="create-a-new-step">Create a new step</h4> +<p>After clicking the <i class="fa fa-plus"></i> button in Fig 3.B.1, you would need +to choose whether to create an R or sysArgs step (Figure 3. B.5).</p> +<center> +<p><img src="../img/wf_new_choose.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.5</strong> Workflow Management - Choose new step type</p> +</center> +<p><strong>Create a new R step</strong></p> +<p>Create a new R step is simple. In the modal, type the step name, R code, +and select dependency (Fig 3. B.6).</p> +<center> +<p><img src="../img/wf_new_r.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.6</strong> Workflow Management - New R step</p> +</center> +<p><strong>Create a new sysArgs step</strong></p> +<p>Basic info for sysArgs step is simialr to R step (Fig 3. B.7).</p> +<center> +<p><img src="../img/wf_new_sys1.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.7</strong> Workflow Management - New sysArgs step</p> +</center> +<p>To generate some commandline line, there are three items need to be prepared: +<strong>targets</strong>, <strong>CWL file</strong>, <strong>CWL yaml file</strong> (Fig.3. B.8).</p> +<ul> +<li>targets: metadata that will populate the basecommand sample-wisely. Columns in +targets will be injected into CWL yaml and then, yaml file will replace variables in parsed CWL base command.</li> +<li>CWL file: provide the base command.</li> +<li>CWL yaml file: provides CWL variables.</li> +</ul> +<ol> +<li>Choose the targets source. Targets in SPR workflow steps can come from either a fresh file or inherit from a previous sysArg step(s) (output from a previous -step can become input of the next(s)).</li> -<li>If you choose from a previous step(s), select the steps from here. If a new -file, upload here.</li> -<li>Then, the targets or inherited targets table is displayed here for you to take a -look. Later we will use these column to replace CWL yaml variables.</li> -<li>Choose the CWL and CWL yaml file you want to use. All <code>.cwl</code> and <code>.yaml</code> or <code>.yml</code> -files inside your workflow project <code>param/cwl</code> folder will be listed here. You +step can become input of the next(s)).</li> +<li>If you choose from a previous step(s), select the steps from here. If a new +file, upload here.</li> +<li>Then, the targets or inherited targets table is displayed here for you to take a +look. Later we will use these column to replace CWL yaml variables.</li> +<li>Choose the CWL and CWL yaml file you want to use. All <code>.cwl</code> and <code>.yaml</code> or <code>.yml</code> +files inside your workflow project <code>param/cwl</code> folder will be listed here. You could drop more of these files you want to this folder. They will become aviable -the next time you create a new step.</li> -<li>If you have all the three items, you can start to use which column from the targets -to replace each CWL yaml variables.</li> -<li>Try to parse the command, see if the results is as what you expect. If not, try to -change options above and try again.</li> -<li>If everything looks fine, save and create the step.</li> -</ol> -<center> -<p><img src="../img/wf_new_sys2.png" alt="wf_wf"></p> -<p><strong>Figure 3. B.8</strong> Workflow Management - New sysArgs step</p> -</center> -<h3 id="4-prepare-cwl-files-optional">4. Prepare CWL files (optional)</h3> -<p>In the new version of SPR, all individual system workflow steps are called by the +the next time you create a new step.</li> +<li>If you have all the three items, you can start to use which column from the targets +to replace each CWL yaml variables.</li> +<li>Try to parse the command, see if the results is as what you expect. If not, try to +change options above and try again.</li> +<li>If everything looks fine, save and create the step.</li> +</ol> +<center> +<p><img src="../img/wf_new_sys2.png" alt="wf_wf"></p> +<p><strong>Figure 3. B.8</strong> Workflow Management - New sysArgs step</p> +</center> +<h3 id="4-prepare-cwl-files-optional">4. Prepare CWL files (optional)</h3> +<p>In the new version of SPR, all individual system workflow steps are called by the CWL files. Each SPR workflow has a set of CWL files and normally users do not need to make any change. In case you want to learn more about CWL and create some new -CWL files, Step 4 is a good place to practice.</p> -<p>To run a CWL step in SPR, 3 files are required:</p> -<ul> -<li>targets: to determine how many samples will be run and sample names.</li> -<li>CWL running file: can be translated to bash code;</li> -<li>CWL input: variables to inject into the running file</li> -</ul> -<p>SPR is the parser between R and CWL by injecting sample information from targets -to <code>CWL input</code> file and then CWL parser translates it to bash code.</p> -<ol> -<li>Most people are not familiar this part, so read instructions carefully.</li> -<li>Your project targets has been loaded for you, and an example CWL running and input -for <strong>hisat2</strong> is also loaded for you. Directly parse the code. See what commandline -code you get.</li> -<li>Change the targets injecting column, and parse again, see what has changed.</li> -<li>You can edit the CWL running and input files</li> -<li>Try to parse the new file and see what has changed.</li> -<li>If new CWL files has been created, you can edit workflow Rmd files by adding your -new steps.</li> -</ol> -<center> -<p><img src="../img/sps_wf_cwl.jpg" alt="wf_cwl"></p> -</center> -<p><strong>Figure 3. C.</strong> Workflow Management - CWL File</p> -<h3 id="5-run-or-finish-workflow-preparation">5. Run or finish workflow preparation</h3> -<p>Up until this step, congratulations, the workflow is prepared. You can choose to -download the workflow project files as a bundle or continue to run the workflow.</p> -<center> -<p><img src="../img/sps_wf_run.jpg" alt="wf_cwl"></p> -</center> -<p><strong>Figure 4.A.B</strong> Workflow Runner</p> -<ol> -<li>On step 5 you can choose to download the prepared workflow or directly run the +CWL files, Step 4 is a good place to practice.</p> +<p>To run a CWL step in SPR, 3 files are required:</p> +<ul> +<li>targets: to determine how many samples will be run and sample names.</li> +<li>CWL running file: can be translated to bash code;</li> +<li>CWL input: variables to inject into the running file</li> +</ul> +<p>SPR is the parser between R and CWL by injecting sample information from targets +to <code>CWL input</code> file and then CWL parser translates it to bash code.</p> +<ol> +<li>Most people are not familiar this part, so read instructions carefully.</li> +<li>Your project targets has been loaded for you, and an example CWL running and input +for <strong>hisat2</strong> is also loaded for you. Directly parse the code. See what commandline +code you get.</li> +<li>Change the targets injecting column, and parse again, see what has changed.</li> +<li>You can edit the CWL running and input files</li> +<li>Try to parse the new file and see what has changed.</li> +<li>If new CWL files has been created, you can edit workflow Rmd files by adding your +new steps.</li> +</ol> +<center> +<p><img src="../img/sps_wf_cwl.jpg" alt="wf_cwl"></p> +</center> +<p><strong>Figure 3. C.</strong> Workflow Management - CWL File</p> +<h3 id="5-run-or-finish-workflow-preparation">5. Run or finish workflow preparation</h3> +<p>Up until this step, congratulations, the workflow is prepared. You can choose to +download the workflow project files as a bundle or continue to run the workflow.</p> +<center> +<p><img src="../img/sps_wf_run.jpg" alt="wf_cwl"></p> +</center> +<p><strong>Figure 4.A.B</strong> Workflow Runner</p> +<ol> +<li>On step 5 you can choose to download the prepared workflow or directly run the workflow. However, if you do not have the required commandline tools, workflow will -most likely fail. Make sure you system has these tools (<a href="http://bioconductor.org/packages/release/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html#261_Third-party_software_tools">Read about these tools</a>).</li> -<li>Open up the runner. It is a &ldquo;Rstudio-like&rdquo; interface.</li> -<li>Code editor. Required workflow running code is pre-entered for you. You can simply +most likely fail. Make sure you system has these tools (<a href="http://bioconductor.org/packages/release/bioc/vignettes/systemPipeR/inst/doc/systemPipeR.html#261_Third-party_software_tools">Read about these tools</a>).</li> +<li>Open up the runner. It is a &ldquo;Rstudio-like&rdquo; interface.</li> +<li>Code editor. Required workflow running code is pre-entered for you. You can simply hit &ldquo;Run&rdquo; to start. Of course, you can delete the default code and run random R -code.</li> -<li>Output R console.</li> -<li>Workflow running log.</li> -<li>View any plot output. and send a copy of your current plot to SPS Canvas tab or -download it.</li> -</ol> -<h2 id="app-security">App security</h2> -<p>Running the workflow may introduce some security concerns. Read <a href="../../sps/adv_features/app_security/#the-workflow-module">App Security</a> -for more details.</p> -<h2 id="is_demo-option"><code>is_demo</code> option</h2> -<p>The <code>is_demo</code> <a href="../../sps/adv_features/config/#app-options">option</a> will impact the workflow -module.</p> -<ul> -<li><code>TRUE</code>: you are <strong>not</strong> deploying the app for production purpose. It is just a show case. +code.</li> +<li>Output R console.</li> +<li>Workflow running log.</li> +<li>View any plot output. and send a copy of your current plot to SPS Canvas tab or +download it.</li> +</ol> +<h2 id="app-security">App security</h2> +<p>Running the workflow may introduce some security concerns. Read <a href="../../sps/adv_features/app_security/#the-workflow-module">App Security</a> +for more details.</p> +<h2 id="is_demo-option"><code>is_demo</code> option</h2> +<p>The <code>is_demo</code> <a href="../../sps/adv_features/config/#app-options">option</a> will impact the workflow +module.</p> +<ul> +<li><code>TRUE</code>: you are <strong>not</strong> deploying the app for production purpose. It is just a show case. Under this option, users who are trying to create a workflow will be locked inside a temp directory and every time they start a new session, they will be assigned to a new temp directory. This is useful if many people want to try the app the same time, so they will have different private environments, and the temp directory will -be removed after the Shiny session is closed.</li> -<li><code>FALSE</code>: you are using the app on your own local computer or use it in a production -environment. WF module will have <strong>full access</strong> to the sever storage system and -users can choose <strong>any place</strong> they have permissions to create the workflow session.</li> -</ul>Sps: RNAseq/sps/modules/rnaseq/Mon, 01 Jan 0001 00:00:00 +0000/sps/modules/rnaseq/ -<h2 id="rna-seq-module">RNA-Seq Module</h2> -<p>This is a module which takes a <strong>raw count table</strong> to do normalization, +be removed after the Shiny session is closed.</li> +<li><code>FALSE</code>: you are using the app on your own local computer or use it in a production +environment. WF module will have <strong>full access</strong> to the sever storage system and +users can choose <strong>any place</strong> they have permissions to create the workflow session.</li> +</ul> + + + + + + Sps: RNAseq + /sps/modules/rnaseq/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/modules/rnaseq/ + + + + <h2 id="rna-seq-module">RNA-Seq Module</h2> +<p>This is a module which takes a <strong>raw count table</strong> to do normalization, Differential gene expression (DEG) analysis, and finally helps users to generate -different plots to visualize the results.</p> -<h3 id="prepare-metadata-and-count-table">Prepare metadata and count table</h3> -<p>To start, we require two files, the metadata file (targets) and a raw count table (Fig. 5).</p> -<center> -<p><img src="../img/sps_rna_data.jpg" alt="rna_data"></p> -</center> -<p><strong>Figure 5</strong> RNAseq</p> -<ol> -<li>This is the RNAseq module UI when you first click it. All sub-tabs are disbled -at the beginning. Other tabs will enabled as you proceed with different options.</li> -<li>First, we need a metadata file to tell SPS what samples and conditions to use. +different plots to visualize the results.</p> +<h3 id="prepare-metadata-and-count-table">Prepare metadata and count table</h3> +<p>To start, we require two files, the metadata file (targets) and a raw count table (Fig. 5).</p> +<center> +<p><img src="../img/sps_rna_data.jpg" alt="rna_data"></p> +</center> +<p><strong>Figure 5</strong> RNAseq</p> +<ol> +<li>This is the RNAseq module UI when you first click it. All sub-tabs are disbled +at the beginning. Other tabs will enabled as you proceed with different options.</li> +<li>First, we need a metadata file to tell SPS what samples and conditions to use. Here, we use the metadata file from SPR, which is also known as &ldquo;targets&rdquo; file. If you are not familiar with the targets file, we suggest to use the workflow module step 2 to practice creating and checking the format. You can also use the example to -see how it looks like.</li> -<li>The loaded targets table is display here. You can use the box below each column +see how it looks like.</li> +<li>The loaded targets table is display here. You can use the box below each column name to filter what samples to include/exclude. Only the &ldquo;SampleName&rdquo; and &ldquo;Factor&rdquo; -columns are used, other columns are ignored. <code>SampleName</code> should be a unique character -string without space for each row. <code>Factor</code> is the experiment design factors, or -conditions, or treatments.</li> -<li>If you want to DEG analysis, DEG comparison groups are defined in the targets -file header.</li> -<li>The header will be parsed into comparison groups which contain individual comparisons. -If the parsed comparison is not what you want, edit the header lines and reupload.</li> -<li>If everything is expected, confirm to use this table.</li> -<li>You should see the progress timeline of step 1 becomes green if your targets -and header pass the format checking.</li> -<li>(Not on figure) Similarly, use example or upload a count table and confirm to use it.</li> -</ol> -<p>Note: For the count table, the first column will be used as gene names. Other column +columns are used, other columns are ignored. <code>SampleName</code> should be a unique character +string without space for each row. <code>Factor</code> is the experiment design factors, or +conditions, or treatments.</li> +<li>If you want to DEG analysis, DEG comparison groups are defined in the targets +file header.</li> +<li>The header will be parsed into comparison groups which contain individual comparisons. +If the parsed comparison is not what you want, edit the header lines and reupload.</li> +<li>If everything is expected, confirm to use this table.</li> +<li>You should see the progress timeline of step 1 becomes green if your targets +and header pass the format checking.</li> +<li>(Not on figure) Similarly, use example or upload a count table and confirm to use it.</li> +</ol> +<p>Note: For the count table, the first column will be used as gene names. Other column names will be treated as sample names, and values in these columns are treated as -raw counts. Make sure columns except the first one are <strong>numeric</strong>, and replace <code>NA</code> -with <code>0</code>.</p> -<p>Upon successfully confirm targets and count table, you should see the &ldquo;Normalize Data&rdquo; +raw counts. Make sure columns except the first one are <strong>numeric</strong>, and replace <code>NA</code> +with <code>0</code>.</p> +<p>Upon successfully confirm targets and count table, you should see the &ldquo;Normalize Data&rdquo; subtab is enabled. You can click on the top navigation or click the pop-up for the next -step.</p> -<h3 id="process-raw-count">Process raw count</h3> -<p>If this UI is displayed, that means your targets and count table are accepted by -SPS (Fig 6). On this sub-tab, you can choose:</p> -<ol> -<li>Transform your count data with &ldquo;raw&rdquo;, &ldquo;rlog&rdquo; or &ldquo;VST&rdquo; and visualize the results -in other sub-tabs.</li> -<li>Do DEG analysis.</li> -</ol> -<p>These two options are independent.</p> -<center> -<p><img src="../img/sps_rna_norm.jpg" alt="rna_norm"></p> -</center> -<p><strong>Figure 6</strong> RNAseq Normalization</p> -<ol> -<li>At step 1 panel, choose how SPS can help you, count transformation or DEG analysis. -The former will jump you to step 2, latter will jump to step 3.</li> -<li>There are many options. If you are not clear, hover your mouse on the option, -and some tips will show up.</li> -<li>To start data transformation or DEG analysis.</li> -<li>A gallery of different plot options will show up when the data process is done.</li> -<li>When the data process is done, you can download results from the right side panel. -Check all items you want and SPS will help you to zip it into one file to download.</li> -<li>If at least one item is checked, downloading is enabled.</li> -<li>Progress timeline will also change upon successful data process.</li> -<li>Different visualization options will be enabled depending on the data process options.</li> -</ol> -<h3 id="plot-options">Plot options</h3> -<p>SPS RNAseq module provides 6 different plot options to cluster transformed count table.</p> -<center> -<p><img src="../img/sps_rna_plot.jpg" alt="rna_plot"></p> -</center> -<p><strong>Figure 6</strong> RNAseq plots</p> -<ol> -<li>Change plot options to customize your plots.</li> -<li>Most plots are <a href="https://plotly.com">Plotly</a> plots, which means you can interact -with these plots, like hiding/show groups, zoom in/out, etc.</li> -<li>All SPS plots are resizable. Drag the bottom-right corner icon to resize your -plot.</li> -<li>Click &ldquo;To canvas&rdquo; to take a screenshot of current plot and edit it in <code>SPS Canvas</code> -tab. Or clicking the down-arrow button to directly save current plot to a png or jpg.</li> -</ol> -<h3 id="deg-report">DEG report</h3> -<p>This is a special sub-tab designed to filter and visualize DEG results. This sub-tab -can be accessed once the DEG is calculated on the &ldquo;Normalize Data&rdquo; sub-tab.</p> -<center> -<p><img src="../img/sps_rna_deg.jpg" alt="rna_deg"></p> -</center> -<p><strong>Figure 7</strong> RNAseq DEG</p> -<ol> -<li>DEG summary plot. You can view what are the DEG results across different comparision -groups.</li> -<li>Switch to view a ggplot friendly table. Different from the table you could download from -&ldquo;Normalize Data&rdquo; subtab, this DEG table is rearranged so you can easily make a ggplot from it.</li> -<li>You can change the filter settings here, so DEGs will be re-filtered and you do not need -to go back to &ldquo;Normalize Data&rdquo; subtab to recalculate DEG.</li> -<li>DEG plotting options. Choose from a volcano plot, an upset plot (intersection), -a MA plot or a heatmap.</li> -</ol> -<h3 id="interact-with-other-bioconductor-packages">Interact with other bioconductor packages.</h3> -<h4 id="locally">Locally</h4> -<p>If you are familiar with R and want to continue other analysis after these, simple stop SPS:</p> -<ol> -<li>After count transformation, there is a <code>spsRNA_trans</code> object stored in your R -environment. <code>raw</code> method gives you a normalized count table. Other two methods -give you a <code>DESeq2</code> class object. You can use it for other analysis.</li> -<li>After DEG analysis, SPS stores a global object called <code>spsDEG.</code> -It is a <code>summerizedExperiment</code> object which has all individual tables from all -DEG comparisons. You can use it for other downstream analysis.</li> -</ol> -<h4 id="remotely">Remotely</h4> -<p>If you are using SPS from a remote server, you can choose to download results from -&ldquo;Normalize Data&rdquo; sub-tab. Choose results in tabular format or <code>summerizedExperiment</code> -format which is saved in a <code>.rds</code> file.</p>Sps: Quick ggplot/sps/modules/ggplot/Mon, 01 Jan 0001 00:00:00 +0000/sps/modules/ggplot/ -<h2 id="quick-ggplot-module">Quick {ggplot} module</h2> -<p>This module enables you to quickly upload datasets and make a {<a href="https://ggplot2.tidyverse.org/">ggplot{blk}</a>} -in a second by using some functionalities from {<a href="https://dreamrs.github.io/esquisse/index.html">Esquisse{blk}</a>}.</p> -<h3 id="upload-data">Upload data</h3> -<center> -<p><img src="../img/sps_quckgg_upload.png" alt="quickgg"></p> -<caption>Upload data</caption> -</center> -<ol> -<li>The first thing you come to this module is to upload a tabular data file. You -can choose to use the example or upload your own. The example is just the <code>iris</code> +step.</p> +<h3 id="process-raw-count">Process raw count</h3> +<p>If this UI is displayed, that means your targets and count table are accepted by +SPS (Fig 6). On this sub-tab, you can choose:</p> +<ol> +<li>Transform your count data with &ldquo;raw&rdquo;, &ldquo;rlog&rdquo; or &ldquo;VST&rdquo; and visualize the results +in other sub-tabs.</li> +<li>Do DEG analysis.</li> +</ol> +<p>These two options are independent.</p> +<center> +<p><img src="../img/sps_rna_norm.jpg" alt="rna_norm"></p> +</center> +<p><strong>Figure 6</strong> RNAseq Normalization</p> +<ol> +<li>At step 1 panel, choose how SPS can help you, count transformation or DEG analysis. +The former will jump you to step 2, latter will jump to step 3.</li> +<li>There are many options. If you are not clear, hover your mouse on the option, +and some tips will show up.</li> +<li>To start data transformation or DEG analysis.</li> +<li>A gallery of different plot options will show up when the data process is done.</li> +<li>When the data process is done, you can download results from the right side panel. +Check all items you want and SPS will help you to zip it into one file to download.</li> +<li>If at least one item is checked, downloading is enabled.</li> +<li>Progress timeline will also change upon successful data process.</li> +<li>Different visualization options will be enabled depending on the data process options.</li> +</ol> +<h3 id="plot-options">Plot options</h3> +<p>SPS RNAseq module provides 6 different plot options to cluster transformed count table.</p> +<center> +<p><img src="../img/sps_rna_plot.jpg" alt="rna_plot"></p> +</center> +<p><strong>Figure 6</strong> RNAseq plots</p> +<ol> +<li>Change plot options to customize your plots.</li> +<li>Most plots are <a href="https://plotly.com">Plotly</a> plots, which means you can interact +with these plots, like hiding/show groups, zoom in/out, etc.</li> +<li>All SPS plots are resizable. Drag the bottom-right corner icon to resize your +plot.</li> +<li>Click &ldquo;To canvas&rdquo; to take a screenshot of current plot and edit it in <code>SPS Canvas</code> +tab. Or clicking the down-arrow button to directly save current plot to a png or jpg.</li> +</ol> +<h3 id="deg-report">DEG report</h3> +<p>This is a special sub-tab designed to filter and visualize DEG results. This sub-tab +can be accessed once the DEG is calculated on the &ldquo;Normalize Data&rdquo; sub-tab.</p> +<center> +<p><img src="../img/sps_rna_deg.jpg" alt="rna_deg"></p> +</center> +<p><strong>Figure 7</strong> RNAseq DEG</p> +<ol> +<li>DEG summary plot. You can view what are the DEG results across different comparision +groups.</li> +<li>Switch to view a ggplot friendly table. Different from the table you could download from +&ldquo;Normalize Data&rdquo; subtab, this DEG table is rearranged so you can easily make a ggplot from it.</li> +<li>You can change the filter settings here, so DEGs will be re-filtered and you do not need +to go back to &ldquo;Normalize Data&rdquo; subtab to recalculate DEG.</li> +<li>DEG plotting options. Choose from a volcano plot, an upset plot (intersection), +a MA plot or a heatmap.</li> +</ol> +<h3 id="interact-with-other-bioconductor-packages">Interact with other bioconductor packages.</h3> +<h4 id="locally">Locally</h4> +<p>If you are familiar with R and want to continue other analysis after these, simple stop SPS:</p> +<ol> +<li>After count transformation, there is a <code>spsRNA_trans</code> object stored in your R +environment. <code>raw</code> method gives you a normalized count table. Other two methods +give you a <code>DESeq2</code> class object. You can use it for other analysis.</li> +<li>After DEG analysis, SPS stores a global object called <code>spsDEG.</code> +It is a <code>summerizedExperiment</code> object which has all individual tables from all +DEG comparisons. You can use it for other downstream analysis.</li> +</ol> +<h4 id="remotely">Remotely</h4> +<p>If you are using SPS from a remote server, you can choose to download results from +&ldquo;Normalize Data&rdquo; sub-tab. Choose results in tabular format or <code>summerizedExperiment</code> +format which is saved in a <code>.rds</code> file.</p> + + + + + + Sps: Quick ggplot + /sps/modules/ggplot/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /sps/modules/ggplot/ + + + + <h2 id="quick-ggplot-module">Quick {ggplot} module</h2> +<p>This module enables you to quickly upload datasets and make a {<a href="https://ggplot2.tidyverse.org/">ggplot{blk}</a>} +in a second by using some functionalities from {<a href="https://dreamrs.github.io/esquisse/index.html">Esquisse{blk}</a>}.</p> +<h3 id="upload-data">Upload data</h3> +<center> +<p><img src="../img/sps_quckgg_upload.png" alt="quickgg"></p> +<caption>Upload data</caption> +</center> +<ol> +<li>The first thing you come to this module is to upload a tabular data file. You +can choose to use the example or upload your own. The example is just the <code>iris</code> data. -<ul> -<li>1.1. If you choose to upload, there will be a upload button where you need to -choose your own file.</li> -</ul> -</li> -<li>By default, it assumes you upload a &ldquo;.csv&rdquo; file with &ldquo;#&rdquo; as comments. If not -you can choose the file delimiter and comment character.</li> -<li>You can view your uploaded data and use the boxes below each column name to -perform some filters, but you are not allowed to edit the data.</li> -<li>If everything looks good, you can submit to proceed to the plot making panel.</li> -</ol> -<h3 id="make-a-plot">Make a plot</h3> -<center> -<p><img src="../img/sps_quickgg.jpg" alt="quickgg"></p> -<caption>Make a plot</caption> -</center> -<p><strong>Figure 8</strong> Quick ggplot</p> -<ol> -<li>Provide a tabular data table by uploading or use example.</li> -<li>Drag variables from into different ggplot aesthetic boxes to make a ggplot.</li> -<li>Change to different plot types.</li> -<li>Customize other different plotting options.</li> -</ol> -<p>For a more specific guide, read -<a href="https://dreamrs.github.io/esquisse/articles/get-started.html">Esquisse official guide{blk}</a>.</p> \ No newline at end of file +<ul> +<li>1.1. If you choose to upload, there will be a upload button where you need to +choose your own file.</li> +</ul> +</li> +<li>By default, it assumes you upload a &ldquo;.csv&rdquo; file with &ldquo;#&rdquo; as comments. If not +you can choose the file delimiter and comment character.</li> +<li>You can view your uploaded data and use the boxes below each column name to +perform some filters, but you are not allowed to edit the data.</li> +<li>If everything looks good, you can submit to proceed to the plot making panel.</li> +</ol> +<h3 id="make-a-plot">Make a plot</h3> +<center> +<p><img src="../img/sps_quickgg.jpg" alt="quickgg"></p> +<caption>Make a plot</caption> +</center> +<p><strong>Figure 8</strong> Quick ggplot</p> +<ol> +<li>Provide a tabular data table by uploading or use example.</li> +<li>Drag variables from into different ggplot aesthetic boxes to make a ggplot.</li> +<li>Change to different plot types.</li> +<li>Customize other different plotting options.</li> +</ol> +<p>For a more specific guide, read +<a href="https://dreamrs.github.io/esquisse/articles/get-started.html">Esquisse official guide{blk}</a>.</p> + + + + + + diff --git a/public/sps/modules/rnaseq/index.html b/public/sps/modules/rnaseq/index.html index 2dffaf69e..0219f4e63 100644 --- a/public/sps/modules/rnaseq/index.html +++ b/public/sps/modules/rnaseq/index.html @@ -1,107 +1,1263 @@ -RNAseq | sysPipe + + + + + + + + + + + + + + + + + +RNAseq | sysPipe + + + + + + + + + + + + + + +

      RNAseq

      RNA-Seq Module

      This is a module which takes a raw count table to do normalization, + This is the RNAseq module UI when you first click it."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

      RNAseq

      + + +

      RNA-Seq Module

      +

      This is a module which takes a raw count table to do normalization, Differential gene expression (DEG) analysis, and finally helps users to generate -different plots to visualize the results.

      Prepare metadata and count table

      To start, we require two files, the metadata file (targets) and a raw count table (Fig. 5).

      rna_data

      Figure 5 RNAseq

      1. This is the RNAseq module UI when you first click it. All sub-tabs are disbled -at the beginning. Other tabs will enabled as you proceed with different options.
      2. First, we need a metadata file to tell SPS what samples and conditions to use. +different plots to visualize the results.

        +

        Prepare metadata and count table

        +

        To start, we require two files, the metadata file (targets) and a raw count table (Fig. 5).

        +
        +

        rna_data

        +
        +

        Figure 5 RNAseq

        +
          +
        1. This is the RNAseq module UI when you first click it. All sub-tabs are disbled +at the beginning. Other tabs will enabled as you proceed with different options.
        2. +
        3. First, we need a metadata file to tell SPS what samples and conditions to use. Here, we use the metadata file from SPR, which is also known as “targets” file. If you are not familiar with the targets file, we suggest to use the workflow module step 2 to practice creating and checking the format. You can also use the example to -see how it looks like.
        4. The loaded targets table is display here. You can use the box below each column +see how it looks like.
        5. +
        6. The loaded targets table is display here. You can use the box below each column name to filter what samples to include/exclude. Only the “SampleName” and “Factor” columns are used, other columns are ignored. SampleName should be a unique character -string without space for each row. Factor is the experiment design factors, or -conditions, or treatments.
        7. If you want to DEG analysis, DEG comparison groups are defined in the targets -file header.
        8. The header will be parsed into comparison groups which contain individual comparisons. -If the parsed comparison is not what you want, edit the header lines and reupload.
        9. If everything is expected, confirm to use this table.
        10. You should see the progress timeline of step 1 becomes green if your targets -and header pass the format checking.
        11. (Not on figure) Similarly, use example or upload a count table and confirm to use it.

        Note: For the count table, the first column will be used as gene names. Other column +string without space for each row. Factor is the experiment design factors, or +conditions, or treatments.

      3. +
      4. If you want to DEG analysis, DEG comparison groups are defined in the targets +file header.
      5. +
      6. The header will be parsed into comparison groups which contain individual comparisons. +If the parsed comparison is not what you want, edit the header lines and reupload.
      7. +
      8. If everything is expected, confirm to use this table.
      9. +
      10. You should see the progress timeline of step 1 becomes green if your targets +and header pass the format checking.
      11. +
      12. (Not on figure) Similarly, use example or upload a count table and confirm to use it.
      13. +
      +

      Note: For the count table, the first column will be used as gene names. Other column names will be treated as sample names, and values in these columns are treated as raw counts. Make sure columns except the first one are numeric, and replace NA -with 0.

      Upon successfully confirm targets and count table, you should see the “Normalize Data” +with 0.

      +

      Upon successfully confirm targets and count table, you should see the “Normalize Data” subtab is enabled. You can click on the top navigation or click the pop-up for the next -step.

      Process raw count

      If this UI is displayed, that means your targets and count table are accepted by -SPS (Fig 6). On this sub-tab, you can choose:

      1. Transform your count data with “raw”, “rlog” or “VST” and visualize the results -in other sub-tabs.
      2. Do DEG analysis.

      These two options are independent.

      rna_norm

      Figure 6 RNAseq Normalization

      1. At step 1 panel, choose how SPS can help you, count transformation or DEG analysis. -The former will jump you to step 2, latter will jump to step 3.
      2. There are many options. If you are not clear, hover your mouse on the option, -and some tips will show up.
      3. To start data transformation or DEG analysis.
      4. A gallery of different plot options will show up when the data process is done.
      5. When the data process is done, you can download results from the right side panel. -Check all items you want and SPS will help you to zip it into one file to download.
      6. If at least one item is checked, downloading is enabled.
      7. Progress timeline will also change upon successful data process.
      8. Different visualization options will be enabled depending on the data process options.

      Plot options

      SPS RNAseq module provides 6 different plot options to cluster transformed count table.

      rna_plot

      Figure 6 RNAseq plots

      1. Change plot options to customize your plots.
      2. Most plots are Plotly plots, which means you can interact -with these plots, like hiding/show groups, zoom in/out, etc.
      3. All SPS plots are resizable. Drag the bottom-right corner icon to resize your -plot.
      4. Click “To canvas” to take a screenshot of current plot and edit it in SPS Canvas -tab. Or clicking the down-arrow button to directly save current plot to a png or jpg.

      DEG report

      This is a special sub-tab designed to filter and visualize DEG results. This sub-tab -can be accessed once the DEG is calculated on the “Normalize Data” sub-tab.

      rna_deg

      Figure 7 RNAseq DEG

      1. DEG summary plot. You can view what are the DEG results across different comparision -groups.
      2. Switch to view a ggplot friendly table. Different from the table you could download from -“Normalize Data” subtab, this DEG table is rearranged so you can easily make a ggplot from it.
      3. You can change the filter settings here, so DEGs will be re-filtered and you do not need -to go back to “Normalize Data” subtab to recalculate DEG.
      4. DEG plotting options. Choose from a volcano plot, an upset plot (intersection), -a MA plot or a heatmap.

      Interact with other bioconductor packages.

      Locally

      If you are familiar with R and want to continue other analysis after these, simple stop SPS:

      1. After count transformation, there is a spsRNA_trans object stored in your R +step.

        +

        Process raw count

        +

        If this UI is displayed, that means your targets and count table are accepted by +SPS (Fig 6). On this sub-tab, you can choose:

        +
          +
        1. Transform your count data with “raw”, “rlog” or “VST” and visualize the results +in other sub-tabs.
        2. +
        3. Do DEG analysis.
        4. +
        +

        These two options are independent.

        +
        +

        rna_norm

        +
        +

        Figure 6 RNAseq Normalization

        +
          +
        1. At step 1 panel, choose how SPS can help you, count transformation or DEG analysis. +The former will jump you to step 2, latter will jump to step 3.
        2. +
        3. There are many options. If you are not clear, hover your mouse on the option, +and some tips will show up.
        4. +
        5. To start data transformation or DEG analysis.
        6. +
        7. A gallery of different plot options will show up when the data process is done.
        8. +
        9. When the data process is done, you can download results from the right side panel. +Check all items you want and SPS will help you to zip it into one file to download.
        10. +
        11. If at least one item is checked, downloading is enabled.
        12. +
        13. Progress timeline will also change upon successful data process.
        14. +
        15. Different visualization options will be enabled depending on the data process options.
        16. +
        +

        Plot options

        +

        SPS RNAseq module provides 6 different plot options to cluster transformed count table.

        +
        +

        rna_plot

        +
        +

        Figure 6 RNAseq plots

        +
          +
        1. Change plot options to customize your plots.
        2. +
        3. Most plots are Plotly plots, which means you can interact +with these plots, like hiding/show groups, zoom in/out, etc.
        4. +
        5. All SPS plots are resizable. Drag the bottom-right corner icon to resize your +plot.
        6. +
        7. Click “To canvas” to take a screenshot of current plot and edit it in SPS Canvas +tab. Or clicking the down-arrow button to directly save current plot to a png or jpg.
        8. +
        +

        DEG report

        +

        This is a special sub-tab designed to filter and visualize DEG results. This sub-tab +can be accessed once the DEG is calculated on the “Normalize Data” sub-tab.

        +
        +

        rna_deg

        +
        +

        Figure 7 RNAseq DEG

        +
          +
        1. DEG summary plot. You can view what are the DEG results across different comparision +groups.
        2. +
        3. Switch to view a ggplot friendly table. Different from the table you could download from +“Normalize Data” subtab, this DEG table is rearranged so you can easily make a ggplot from it.
        4. +
        5. You can change the filter settings here, so DEGs will be re-filtered and you do not need +to go back to “Normalize Data” subtab to recalculate DEG.
        6. +
        7. DEG plotting options. Choose from a volcano plot, an upset plot (intersection), +a MA plot or a heatmap.
        8. +
        +

        Interact with other bioconductor packages.

        +

        Locally

        +

        If you are familiar with R and want to continue other analysis after these, simple stop SPS:

        +
          +
        1. After count transformation, there is a spsRNA_trans object stored in your R environment. raw method gives you a normalized count table. Other two methods -give you a DESeq2 class object. You can use it for other analysis.
        2. After DEG analysis, SPS stores a global object called spsDEG. +give you a DESeq2 class object. You can use it for other analysis.
        3. +
        4. After DEG analysis, SPS stores a global object called spsDEG. It is a summerizedExperiment object which has all individual tables from all -DEG comparisons. You can use it for other downstream analysis.

        Remotely

        If you are using SPS from a remote server, you can choose to download results from +DEG comparisons. You can use it for other downstream analysis.

      2. +
      +

      Remotely

      +

      If you are using SPS from a remote server, you can choose to download results from “Normalize Data” sub-tab. Choose results in tabular format or summerizedExperiment -format which is saved in a .rds file.

      + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/modules/workflow/index.html b/public/sps/modules/workflow/index.html index f1c12a988..374d14a23 100644 --- a/public/sps/modules/workflow/index.html +++ b/public/sps/modules/workflow/index.html @@ -1,138 +1,1373 @@ -Workflow | sysPipe

      Workflow

      Workflow management

      The workflow management module in SPS allows one to modify or create the + + + + + + + + + + + + + + + + + + + +Workflow | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

      Workflow

      + + +

      Workflow management

      +

      The workflow management module in SPS allows one to modify or create the configuration files required for running data analysis workflows in -systemPipeR (SPR). This includes +systemPipeR (SPR). This includes three types of important files: a sample metadata (targets) file, a workflow file (in R Markdown format) defining the workflow steps, and workflow running -files in Common Workflow Language (CWL){blk} format. In SPS, one can easily create +files in Common Workflow Language (CWL){blk} format. In SPS, one can easily create these files under the “Workflow Management” module, located in navigation bar -on the left of the dashboard.

      The current version of SPS allows to:

      1. create a workflow environment;
      2. create and/or check the format of targets / workflow / CWL files;
      3. download the prepared workflow files to run elsewhere, like a cluster;
      4. directly execute the workflow from SPS.

      1. setup a workflow

      wf_setup

      Figure 3. A. Workflow Management - Targets File

      1. In the workflow module, read the instructions and choose step 1. Step 1 should be -automatically opened for you on start.
      2. Choose a folder where you want to create the workflow environment.
      3. Choose a workflow template. These are SPR workflows and mainly are next-generation -sequencing workflows.
      4. Click “Gen workflow” to create the workflow project.
      5. You should see a pop-up saying about the project path and other information. +on the left of the dashboard.

        +

        The current version of SPS allows to:

        +
          +
        1. create a workflow environment;
        2. +
        3. create and/or check the format of targets / workflow / CWL files;
        4. +
        5. download the prepared workflow files to run elsewhere, like a cluster;
        6. +
        7. directly execute the workflow from SPS.
        8. +
        +

        1. setup a workflow

        +
        +

        wf_setup

        +
        +

        Figure 3. A. Workflow Management - Targets File

        +
          +
        1. In the workflow module, read the instructions and choose step 1. Step 1 should be +automatically opened for you on start.
        2. +
        3. Choose a folder where you want to create the workflow environment.
        4. +
        5. Choose a workflow template. These are SPR workflows and mainly are next-generation +sequencing workflows.
        6. +
        7. Click “Gen workflow” to create the workflow project.
        8. +
        9. You should see a pop-up saying about the project path and other information. Clicking the pop-up will jump you to the step 2. The status tracker and banner for -step 1 should all turn green.

        2. Prepare the targets file

        The targets file defines all input file paths and other sample information of +step 1 should all turn green.

      6. +
      +

      2. Prepare the targets file

      +

      The targets file defines all input file paths and other sample information of analysis workflows. To better undertand the structure of this file, one can -consult the “Structure of targets +consult the “Structure of targets file” section in the SPR vignette. Essentially, this is the tabular file representation of the colData slot in an SummarizedExperiment object which stores sample -IDs and other meta information.

      The following step-by-step instructions explain how to create and/or modify targets -files using RNA-Seq as an example (Fig.3 A):

      1. Your project targets file is loaded for you, but you can choose to upload a different one.
      2. You can edit, right click to add/remove rows/columns (The first row is treated as column names).
      3. SPR target file includes a header block, that can also be edited in the SPS app. Each headers needs to start with a “#”. Header is useful for workflows with DEG analysis in current SPR. You can define sample comparison groups -here. Leave it as default for other projects.
      4. The section on the left provides sample statistics and information whether files exist inside the workflow project’s data directory. Choose any column you want from the dropdown to check and watch the statistics bar change in this section.
      5. statistic status bar.
      6. Clicking on “Add to task” can help you to check if your target file has any formatting problem. You should see a green success pop-up if everything is right. Now your target file is ready and you can click “save” to download it and later use in other SPR projects.

      wf_targets

      Figure 3. A. Workflow Management - Targets File

      3. Prepare a workflow object

      In SPR, workflows are defined in Rmarkdown files, you can read details and obtain them here.

      Now let us follow the order below to see how SPS helps you to prepare a workflow file for a RNAseq project (Fig.3 B):

      1. The left panal is the workflow designer. All steps from the template from your +IDs and other meta information.

        +

        The following step-by-step instructions explain how to create and/or modify targets +files using RNA-Seq as an example (Fig.3 A):

        +
          +
        1. Your project targets file is loaded for you, but you can choose to upload a different one.
        2. +
        3. You can edit, right click to add/remove rows/columns (The first row is treated as column names).
        4. +
        5. SPR target file includes a header block, that can also be edited in the SPS app. Each headers needs to start with a “#”. Header is useful for workflows with DEG analysis in current SPR. You can define sample comparison groups +here. Leave it as default for other projects.
        6. +
        7. The section on the left provides sample statistics and information whether files exist inside the workflow project’s data directory. Choose any column you want from the dropdown to check and watch the statistics bar change in this section.
        8. +
        9. statistic status bar.
        10. +
        11. Clicking on “Add to task” can help you to check if your target file has any formatting problem. You should see a green success pop-up if everything is right. Now your target file is ready and you can click “save” to download it and later use in other SPR projects.
        12. +
        +
        +

        wf_targets

        +
        +

        Figure 3. A. Workflow Management - Targets File

        +

        3. Prepare a workflow object

        +

        In SPR, workflows are defined in Rmarkdown files, you can read details and obtain them here.

        +

        Now let us follow the order below to see how SPS helps you to prepare a workflow file for a RNAseq project (Fig.3 B):

        +
          +
        1. The left panal is the workflow designer. All steps from the template from your choosen workflow will be displayed here. The arrows indicates the execution order -of the entire workflow.
        2. All the steps are draggable. Drag and place steps to a different place to change the +of the entire workflow.
        3. +
        4. All the steps are draggable. Drag and place steps to a different place to change the order. Note: if you change the order, it may break the dependency. SPS will check this for you. After changing orders, steps marked in pink mean these steps are -broken. You need to fix the dependency before you can save it.
        5. To config a step, such as, changing name, fixing dependency. Click the button next to each step, a modal will show up and you can make changes there.
        6. To add a step, click the button. There, you will have -more options to choose which will be explained in the next figure.
        7. History is enabled in this designer, you can undo or redo anytime you want. -Current SPS stores max 100 steps of history for you.
        8. To delete a step, simply drag it to the trash can.
        9. After you are done with all edits, click here to save the workflow so we can -run or download it in the next major step.
        10. On the right side is the workflow dependency plot. This plot shows how each +broken. You need to fix the dependency before you can save it.
        11. +
        12. To config a step, such as, changing name, fixing dependency. Click the +button next to each step, a modal will show up and you can make changes there.
        13. +
        14. To add a step, click the button. There, you will have +more options to choose which will be explained in the next figure.
        15. +
        16. History is enabled in this designer, you can undo +or redo anytime you want. +Current SPS stores max 100 steps of history for you.
        17. +
        18. To delete a step, simply drag it to the trash can.
        19. +
        20. After you are done with all edits, click here to save the workflow so we can +run or download it in the next major step.
        21. +
        22. On the right side is the workflow dependency plot. This plot shows how each step is connected and the expected execution order. It does not mean the the workflow will be run in the same order. The order is determined by the order -you have in the left-side designer.
        23. Enlarge the left or right panel. If you have a small monitor screen, this can help.

        wf_wf

        Figure 3. B.1 Workflow Management - Workflow Designer

        R step and sysArgs step

        On the designer there are two types of workflow steps. One is R step, which only +you have in the left-side designer.

      2. +
      3. Enlarge the left or right panel. If you have a small monitor screen, this can help.
      4. +
      +
      +

      wf_wf

      +

      Figure 3. B.1 Workflow Management - Workflow Designer

      +
      +

      R step and sysArgs step

      +

      On the designer there are two types of workflow steps. One is R step, which only has R code. Then it is the time to run these R steps, they will be run in the same R session as the Shiny app and in a separate environment different than your global environment. In other words, all R steps are in the same environment, they can communicate with each other, meaning you can define a variable in one step and use it in other -R steps.

      sysArgs steps, on the other hand, is different, as its name suggest, it will invoke +R steps.

      +

      sysArgs steps, on the other hand, is different, as its name suggest, it will invoke system commands (like bash) when run. Details of how to create these steps will be -discussed on Fig 3.B.5, Fig 3.B.6.

      View and modify steps

      Current SPS allows users to view some basic information of R steps like, step name, +discussed on Fig 3.B.5, Fig 3.B.6.

      +

      View and modify steps

      +

      Current SPS allows users to view some basic information of R steps like, step name, select dependency(ies). Besides, users are welcome to change the R code they want -in the second sub-tab (Fig 3.B.2).

      wf_wf

      Figure 3. B.2 Workflow Management - config R

      Modification of sysArgs steps is limited to step name and dependency. However, this +in the second sub-tab (Fig 3.B.2).

      +
      +

      wf_wf

      +

      Figure 3. B.2 Workflow Management - config R

      +
      +

      Modification of sysArgs steps is limited to step name and dependency. However, this kind steps will provide more information to view, like the files that were used to create this step, raw commandline code that will be run, targets (metadata) and output dataframes. This information -is distributed in different subtabs (Fig 3.B.3).

      wf_wf

      Figure 3. B.3 Workflow Management - config sysArgs

      Create a new step

      After clicking the button in Fig 3.B.1, you would need -to choose whether to create an R or sysArgs step (Figure 3. B.5).

      wf_wf

      Figure 3. B.5 Workflow Management - Choose new step type

      Create a new R step

      Create a new R step is simple. In the modal, type the step name, R code, -and select dependency (Fig 3. B.6).

      wf_wf

      Figure 3. B.6 Workflow Management - New R step

      Create a new sysArgs step

      Basic info for sysArgs step is simialr to R step (Fig 3. B.7).

      wf_wf

      Figure 3. B.7 Workflow Management - New sysArgs step

      To generate some commandline line, there are three items need to be prepared: -targets, CWL file, CWL yaml file (Fig.3. B.8).

      • targets: metadata that will populate the basecommand sample-wisely. Columns in -targets will be injected into CWL yaml and then, yaml file will replace variables in parsed CWL base command.
      • CWL file: provide the base command.
      • CWL yaml file: provides CWL variables.
      1. Choose the targets source. Targets in SPR workflow steps can come from either a +is distributed in different subtabs (Fig 3.B.3).

        +
        +

        wf_wf

        +

        Figure 3. B.3 Workflow Management - config sysArgs

        +
        +

        Create a new step

        +

        After clicking the button in Fig 3.B.1, you would need +to choose whether to create an R or sysArgs step (Figure 3. B.5).

        +
        +

        wf_wf

        +

        Figure 3. B.5 Workflow Management - Choose new step type

        +
        +

        Create a new R step

        +

        Create a new R step is simple. In the modal, type the step name, R code, +and select dependency (Fig 3. B.6).

        +
        +

        wf_wf

        +

        Figure 3. B.6 Workflow Management - New R step

        +
        +

        Create a new sysArgs step

        +

        Basic info for sysArgs step is simialr to R step (Fig 3. B.7).

        +
        +

        wf_wf

        +

        Figure 3. B.7 Workflow Management - New sysArgs step

        +
        +

        To generate some commandline line, there are three items need to be prepared: +targets, CWL file, CWL yaml file (Fig.3. B.8).

        +
          +
        • targets: metadata that will populate the basecommand sample-wisely. Columns in +targets will be injected into CWL yaml and then, yaml file will replace variables in parsed CWL base command.
        • +
        • CWL file: provide the base command.
        • +
        • CWL yaml file: provides CWL variables.
        • +
        +
          +
        1. Choose the targets source. Targets in SPR workflow steps can come from either a fresh file or inherit from a previous sysArg step(s) (output from a previous -step can become input of the next(s)).
        2. If you choose from a previous step(s), select the steps from here. If a new -file, upload here.
        3. Then, the targets or inherited targets table is displayed here for you to take a -look. Later we will use these column to replace CWL yaml variables.
        4. Choose the CWL and CWL yaml file you want to use. All .cwl and .yaml or .yml +step can become input of the next(s)).
        5. +
        6. If you choose from a previous step(s), select the steps from here. If a new +file, upload here.
        7. +
        8. Then, the targets or inherited targets table is displayed here for you to take a +look. Later we will use these column to replace CWL yaml variables.
        9. +
        10. Choose the CWL and CWL yaml file you want to use. All .cwl and .yaml or .yml files inside your workflow project param/cwl folder will be listed here. You could drop more of these files you want to this folder. They will become aviable -the next time you create a new step.
        11. If you have all the three items, you can start to use which column from the targets -to replace each CWL yaml variables.
        12. Try to parse the command, see if the results is as what you expect. If not, try to -change options above and try again.
        13. If everything looks fine, save and create the step.

        wf_wf

        Figure 3. B.8 Workflow Management - New sysArgs step

        4. Prepare CWL files (optional)

        In the new version of SPR, all individual system workflow steps are called by the +the next time you create a new step.

      2. +
      3. If you have all the three items, you can start to use which column from the targets +to replace each CWL yaml variables.
      4. +
      5. Try to parse the command, see if the results is as what you expect. If not, try to +change options above and try again.
      6. +
      7. If everything looks fine, save and create the step.
      8. +
      +
      +

      wf_wf

      +

      Figure 3. B.8 Workflow Management - New sysArgs step

      +
      +

      4. Prepare CWL files (optional)

      +

      In the new version of SPR, all individual system workflow steps are called by the CWL files. Each SPR workflow has a set of CWL files and normally users do not need to make any change. In case you want to learn more about CWL and create some new -CWL files, Step 4 is a good place to practice.

      To run a CWL step in SPR, 3 files are required:

      • targets: to determine how many samples will be run and sample names.
      • CWL running file: can be translated to bash code;
      • CWL input: variables to inject into the running file

      SPR is the parser between R and CWL by injecting sample information from targets -to CWL input file and then CWL parser translates it to bash code.

      1. Most people are not familiar this part, so read instructions carefully.
      2. Your project targets has been loaded for you, and an example CWL running and input +CWL files, Step 4 is a good place to practice.

        +

        To run a CWL step in SPR, 3 files are required:

        +
          +
        • targets: to determine how many samples will be run and sample names.
        • +
        • CWL running file: can be translated to bash code;
        • +
        • CWL input: variables to inject into the running file
        • +
        +

        SPR is the parser between R and CWL by injecting sample information from targets +to CWL input file and then CWL parser translates it to bash code.

        +
          +
        1. Most people are not familiar this part, so read instructions carefully.
        2. +
        3. Your project targets has been loaded for you, and an example CWL running and input for hisat2 is also loaded for you. Directly parse the code. See what commandline -code you get.
        4. Change the targets injecting column, and parse again, see what has changed.
        5. You can edit the CWL running and input files
        6. Try to parse the new file and see what has changed.
        7. If new CWL files has been created, you can edit workflow Rmd files by adding your -new steps.

        wf_cwl

        Figure 3. C. Workflow Management - CWL File

        5. Run or finish workflow preparation

        Up until this step, congratulations, the workflow is prepared. You can choose to -download the workflow project files as a bundle or continue to run the workflow.

        wf_cwl

        Figure 4.A.B Workflow Runner

        1. On step 5 you can choose to download the prepared workflow or directly run the +code you get.
        2. +
        3. Change the targets injecting column, and parse again, see what has changed.
        4. +
        5. You can edit the CWL running and input files
        6. +
        7. Try to parse the new file and see what has changed.
        8. +
        9. If new CWL files has been created, you can edit workflow Rmd files by adding your +new steps.
        10. +
        +
        +

        wf_cwl

        +
        +

        Figure 3. C. Workflow Management - CWL File

        +

        5. Run or finish workflow preparation

        +

        Up until this step, congratulations, the workflow is prepared. You can choose to +download the workflow project files as a bundle or continue to run the workflow.

        +
        +

        wf_cwl

        +
        +

        Figure 4.A.B Workflow Runner

        +
          +
        1. On step 5 you can choose to download the prepared workflow or directly run the workflow. However, if you do not have the required commandline tools, workflow will -most likely fail. Make sure you system has these tools (Read about these tools).
        2. Open up the runner. It is a “Rstudio-like” interface.
        3. Code editor. Required workflow running code is pre-entered for you. You can simply +most likely fail. Make sure you system has these tools (Read about these tools).
        4. +
        5. Open up the runner. It is a “Rstudio-like” interface.
        6. +
        7. Code editor. Required workflow running code is pre-entered for you. You can simply hit “Run” to start. Of course, you can delete the default code and run random R -code.
        8. Output R console.
        9. Workflow running log.
        10. View any plot output. and send a copy of your current plot to SPS Canvas tab or -download it.

        App security

        Running the workflow may introduce some security concerns. Read App Security -for more details.

        is_demo option

        The is_demo option will impact the workflow -module.

        • TRUE: you are not deploying the app for production purpose. It is just a show case. +code.
        • +
        • Output R console.
        • +
        • Workflow running log.
        • +
        • View any plot output. and send a copy of your current plot to SPS Canvas tab or +download it.
        • +
      +

      App security

      +

      Running the workflow may introduce some security concerns. Read App Security +for more details.

      +

      is_demo option

      +

      The is_demo option will impact the workflow +module.

      +
        +
      • TRUE: you are not deploying the app for production purpose. It is just a show case. Under this option, users who are trying to create a workflow will be locked inside a temp directory and every time they start a new session, they will be assigned to a new temp directory. This is useful if many people want to try the app the same time, so they will have different private environments, and the temp directory will -be removed after the Shiny session is closed.
      • FALSE: you are using the app on your own local computer or use it in a production +be removed after the Shiny session is closed.
      • +
      • FALSE: you are using the app on your own local computer or use it in a production environment. WF module will have full access to the sever storage system and -users can choose any place they have permissions to create the workflow session.
      + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/quick_start/index.html b/public/sps/quick_start/index.html index 2e94b978b..92a008ce8 100644 --- a/public/sps/quick_start/index.html +++ b/public/sps/quick_start/index.html @@ -1,127 +1,1235 @@ -Quick start | sysPipe + + + + + + + + + + + + + + + + + +Quick start | sysPipe + + + + + + + + + + + + + + +

      Quick start

      SPS example usage

      To start with SPS after installation:

      Load package

      Load the systemPipeShiny package in your R session.

      library(systemPipeShiny)
      -
      ## Loading required package: shiny
      -
      ## Loading required package: spsUtil
      -
      ## Loading required package: spsComps
      -
      ## Loading required package: drawer
      -

      Initialize SPS project

      Before launching the SPS application, a project environment needs to be created with the -following command.

      spsInit()
      -

      For this demo, the project directory structure is written to a temporary +spsInit() For this demo, the project directory structure is written to a temporary directory on a user’s system."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View Rmd source + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + + + +
      +
      + + + + + + +
      +

      Quick start

      + + +

      SPS example usage

      +

      To start with SPS after installation:

      +

      Load package

      +

      Load the systemPipeShiny package in your R session.

      +
      library(systemPipeShiny)
      +
      +
      ## Loading required package: shiny
      +
      +
      ## Loading required package: spsUtil
      +
      +
      ## Loading required package: spsComps
      +
      +
      ## Loading required package: drawer
      +
      +

      Initialize SPS project

      +

      Before launching the SPS application, a project environment needs to be created with the +following command.

      +
      spsInit()
      +
      +

      For this demo, the project directory structure is written to a temporary directory on a user’s system. For a real project, it should be written to a defined and user controlled location on a system rather than a temporary -directory.

      sps_tmp_dir <- tempdir()
      +directory.

      +
      sps_tmp_dir <- tempdir()
       spsInit(app_path = sps_tmp_dir, change_wd = FALSE, project_name = "SPSProject")
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Start to create a new SPS project
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Create project under /tmp/RtmpgROsL7/SPSProject
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Now copy files
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Create SPS database
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Created SPS database method container
      -
      ## [SPS-INFO] 2021-04-12 11:31:39 Creating SPS db...
      -
      ## [SPS-DANGER] 2021-04-12 11:31:39 Done, Db created at '/tmp/RtmpgROsL7/SPSProject/config/sps.db'. DO NOT share this file with others or upload to open access domains.
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Start to create a new SPS project
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Create project under /tmp/RtmpgROsL7/SPSProject
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Now copy files
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Create SPS database
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Created SPS database method container
      +
      +
      ## [SPS-INFO] 2021-04-12 11:31:39 Creating SPS db...
      +
      +
      ## [SPS-DANGER] 2021-04-12 11:31:39 Done, Db created at '/tmp/RtmpgROsL7/SPSProject/config/sps.db'. DO NOT share this file with others or upload to open access domains.
       ## [SPS-INFO] 2021-04-12 11:31:39 Key md5 ae88518aa6cce9a5af24d37c4c3c1b16
       ## [SPS-INFO] 2021-04-12 11:31:39 SPS project setup done!
      -
      sps_dir <- file.path(sps_tmp_dir, "SPSProject")
      -

      SPS project structure

      The file and directory structure of an SPS project is organized as follows.

      +
      +
      sps_dir <- file.path(sps_tmp_dir, "SPSProject")
      +
      +

      SPS project structure

      +

      The file and directory structure of an SPS project is organized as follows.

      +
       SPS_xx/  
      -├── server.R               | 
      -├── global.R               | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit manually   
      -├── ui.R                   |  
      -├── deploy.R               | Deploy helper file  
      -├── config                 | Important app config files. Do not edit them if you don't know  
      -│   ├── sps.db             | SPS database 
      -│   ├── sps_options.yaml   | SPS default option list 
      -│   └── tabs.csv           | SPS tab information 
      -├── data                   | App example data files 
      +├── server.R               | 
      +├── global.R               | Most important server, UI and global files, unless special needs, `global.R` is the only file you need to edit manually   
      +├── ui.R                   |  
      +├── deploy.R               | Deploy helper file  
      +├── config                 | Important app config files. Do not edit them if you don't know  
      +│   ├── sps.db             | SPS database 
      +│   ├── sps_options.yaml   | SPS default option list 
      +│   └── tabs.csv           | SPS tab information 
      +├── data                   | App example data files 
       │   ├── xx.csv             
      -├── R                      | All SPS additional tab files and helper R function files 
      +├── R                      | All SPS additional tab files and helper R function files 
       │   ├── tab_xx.R            
       ├── README.md              
      -├── results                | Not in use for this current version, you can store some data been generated from the app 
      +├── results                | Not in use for this current version, you can store some data been generated from the app 
       │   └── README.md          
      -└── www                    | Internet resources  
      -    ├── about              | About tab information 
      +└── www                    | Internet resources  
      +    ├── about              | About tab information 
           │   └── xx.md          
      -    ├── css                | CSS files  
      +    ├── css                | CSS files  
           │   └── sps.css         
      -    ├── img                | App image resources    
      +    ├── img                | App image resources    
           │   └── xx.png         
      -    ├── js                 | Javascripts
      +    ├── js                 | Javascripts
           │   └── xx.js           
      -    ├── loading_themes     | Loading screen files 
      +    ├── loading_themes     | Loading screen files 
           │   └── xx.html         
      -    └── plot_list          | Image files for plot gallery  
      +    └── plot_list          | Image files for plot gallery  
               └── plot_xx.jpg      
      -

      Launch SPS

      By default, the working directory will be set inside the project folder automatically. -To launch the SPS Shiny application, one only needs to execute the following command.

      shiny::runApp()
      -

      After the SPS app has been launched, clicking the “Continue to app” button -on the welcome screen will open the main dashboard (Fig.2).

      sps_ui

      Figure 2: Snapshot of SPS' UI.

      1. Welcome screen.
      2. Module tabs.
      3. User defined custom tabs.
      4. The Canvas tab.
      5. All SPS tabs has this description on top. It is highly recommend to click here -to expand and read the full the description for the first time.

      Alternatively, when using RStudio one can click the Run App button in the top right corner.

      In addition, in Rstudio the global.R file will be automatically +

      +

      Launch SPS

      +

      By default, the working directory will be set inside the project folder automatically. +To launch the SPS Shiny application, one only needs to execute the following command.

      +
      shiny::runApp()
      +
      +

      After the SPS app has been launched, clicking the “Continue to app” button +on the welcome screen will open the main dashboard (Fig.2).

      +
      +

      sps_ui

      +
      +

      Figure 2: Snapshot of SPS' UI.

      +
        +
      1. Welcome screen.
      2. +
      3. Module tabs.
      4. +
      5. User defined custom tabs.
      6. +
      7. The Canvas tab.
      8. +
      9. All SPS tabs has this description on top. It is highly recommend to click here +to expand and read the full the description for the first time.
      10. +
      +

      Alternatively, when using RStudio one can click the Run App button in the top right corner.

      +

      In addition, in Rstudio the global.R file will be automatically opened when the SPS project is created. Custom changes can be made inside this file -before the app launches. Later we will discuss how to change and create new custom tabs and change other settings.

      + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/screenshots/index.html b/public/sps/screenshots/index.html index 97c6c7297..9f82e29f2 100644 --- a/public/sps/screenshots/index.html +++ b/public/sps/screenshots/index.html @@ -1,60 +1,1159 @@ -Screenshots | sysPipe
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + + + +
      +
      + + + + + + +
      +

      Screenshots

      + + +
      +

      Some screenshots of SPS

      +
      Full app
      +

      sps

      +
      Loading screens
      +

      loading screens

      +
      Workflow module
      +

      WF

      +
      Workflow Execution
      +

      WF run

      +
      RNASeq module
      +

      RNASeq module

      +

      RNASeq module

      +
      Canvas
      +

      canvas

      +
      Admin
      +

      Admin

      +

      Admin

      +

      Admin

      +
      Debugging
      +

      Debugging

      + + + +
      Last modified 2021-08-06: sps no_render (bb799648) +
      +
      + + +
      + + + +
      +
      + + + + +
      + + + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sps/sps_funcs/index.html b/public/sps/sps_funcs/index.html index 104de5271..bc27b3045 100644 --- a/public/sps/sps_funcs/index.html +++ b/public/sps/sps_funcs/index.html @@ -1,63 +1,1150 @@ -SPS Functions | sysPipe

      SPS Functions


      SPS Function Reference Manuals

      There are many more useful functions one could use from SPS core and sub packages. + + + + + + + + + + + + + + + + + + + +SPS Functions | sysPipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      + + + +
      +
      +
      +
      +
      + + + + + +
      + + + + +
      + + + + +
      + + + + + + + +
      + + + + + + +
      + + + + + + + + + + + + + + + + + + View source code + + View on Github + Edit this page + Create child page + + + Create project issue + + + + +
      + + + + + + + +
      +
      + + + + + + +
      +

      SPS Functions

      + + +
      + +

      SPS Function Reference Manuals

      +

      There are many more useful functions one could use from SPS core and sub packages. We could not cover all the details in this manual. To take a look at these functions, click links below to go to the function reference manual of each package. Detailed -function usage, example code, and example running results are shown inside.

      PackageDescription
      systemPipeShinymain package
      spsCompsSPS components
      drawerimage editing tool
      spsUtilutility functions

      + + + + + + + + + \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/en/sp/spr/gettingstarted_files/jquery/jquery-AUTHORS.txt b/static/en/sp/spr/gettingstarted_files/jquery/jquery-AUTHORS.txt deleted file mode 100644 index 06df1a533..000000000 --- a/static/en/sp/spr/gettingstarted_files/jquery/jquery-AUTHORS.txt +++ /dev/null @@ -1,357 +0,0 @@ -Authors ordered by first contribution. - -John Resig -Gilles van den Hoven -Michael Geary -Stefan Petre -Yehuda Katz -Corey Jewett -Klaus Hartl -Franck Marcia -Jörn Zaefferer -Paul Bakaus -Brandon Aaron -Mike Alsup -Dave Methvin -Ed Engelhardt -Sean Catchpole -Paul Mclanahan -David Serduke -Richard D. Worth -Scott González -Ariel Flesler -Cheah Chu Yeow -Andrew Chalkley -Fabio Buffoni -Stefan Bauckmeier  -Jon Evans -TJ Holowaychuk -Riccardo De Agostini -Michael Bensoussan -Louis-Rémi Babé -Robert Katić -Damian Janowski -Anton Kovalyov -Dušan B. Jovanovic -Earle Castledine -Rich Dougherty -Kim Dalsgaard -Andrea Giammarchi -Fabian Jakobs -Mark Gibson -Karl Swedberg -Justin Meyer -Ben Alman -James Padolsey -David Petersen -Batiste Bieler -Jake Archibald -Alexander Farkas -Filipe Fortes -Rick Waldron -Neeraj Singh -Paul Irish -Iraê Carvalho -Matt Curry -Michael Monteleone -Noah Sloan -Tom Viner -J. Ryan Stinnett -Douglas Neiner -Adam J. Sontag -Heungsub Lee -Dave Reed -Carl Fürstenberg -Jacob Wright -Ralph Whitbeck -unknown -temp01 -Colin Snover -Jared Grippe -Ryan W Tenney -Alex Sexton -Pinhook -Ron Otten -Jephte Clain -Anton Matzneller -Dan Heberden -Henri Wiechers -Russell Holbrook -Julian Aubourg -Gianni Alessandro Chiappetta -Scott Jehl -James Burke -Jonas Pfenniger -Xavi Ramirez -Sylvester Keil -Brandon Sterne -Mathias Bynens -Lee Carpenter -Timmy Willison <4timmywil@gmail.com> -Corey Frang -Digitalxero -David Murdoch -Josh Varner -Charles McNulty -Jordan Boesch -Jess Thrysoee -Michael Murray -Alexis Abril -Rob Morgan -John Firebaugh -Sam Bisbee -Gilmore Davidson -Brian Brennan -Xavier Montillet -Daniel Pihlstrom -Sahab Yazdani -avaly -Scott Hughes -Mike Sherov -Greg Hazel -Schalk Neethling -Denis Knauf -Timo Tijhof -Steen Nielsen -Anton Ryzhov -Shi Chuan -Matt Mueller -Berker Peksag -Toby Brain -Justin -Daniel Herman -Oleg Gaidarenko -Rock Hymas -Richard Gibson -Rafaël Blais Masson -cmc3cn <59194618@qq.com> -Joe Presbrey -Sindre Sorhus -Arne de Bree -Vladislav Zarakovsky -Andrew E Monat -Oskari -Joao Henrique de Andrade Bruni -tsinha -Dominik D. Geyer -Matt Farmer -Trey Hunner -Jason Moon -Jeffery To -Kris Borchers -Vladimir Zhuravlev -Jacob Thornton -Chad Killingsworth -Vitya Muhachev -Nowres Rafid -David Benjamin -Alan Plum -Uri Gilad -Chris Faulkner -Marcel Greter -Elijah Manor -Daniel Chatfield -Daniel Gálvez -Nikita Govorov -Wesley Walser -Mike Pennisi -Matthias Jäggli -Devin Cooper -Markus Staab -Dave Riddle -Callum Macrae -Jonathan Sampson -Benjamin Truyman -Jay Merrifield -James Huston -Sai Lung Wong -Erick Ruiz de Chávez -David Bonner -Allen J Schmidt Jr -Akintayo Akinwunmi -MORGAN -Ismail Khair -Carl Danley -Mike Petrovich -Greg Lavallee -Tom H Fuertes -Roland Eckl -Yiming He -David Fox -Bennett Sorbo -Paul Ramos -Rod Vagg -Sebastian Burkhard -Zachary Adam Kaplan -Adam Coulombe -nanto_vi -nanto -Danil Somsikov -Ryunosuke SATO -Diego Tres -Jean Boussier -Andrew Plummer -Mark Raddatz -Pascal Borreli -Isaac Z. Schlueter -Karl Sieburg -Nguyen Phuc Lam -Dmitry Gusev -Steven Benner -Li Xudong -Michał Gołębiowski-Owczarek -Renato Oliveira dos Santos -Frederic Junod -Tom H Fuertes -Mitch Foley -ros3cin -Kyle Robinson Young -John Paul -Jason Bedard -Chris Talkington -Eddie Monge -Terry Jones -Jason Merino -Dan Burzo -Jeremy Dunck -Chris Price -Guy Bedford -njhamann -Goare Mao -Amey Sakhadeo -Mike Sidorov -Anthony Ryan -Lihan Li -George Kats -Dongseok Paeng -Ronny Springer -Ilya Kantor -Marian Sollmann -Chris Antaki -David Hong -Jakob Stoeck -Christopher Jones -Forbes Lindesay -S. Andrew Sheppard -Leonardo Balter -Rodrigo Rosenfeld Rosas -Daniel Husar -Philip Jägenstedt -John Hoven -Roman Reiß -Benjy Cui -Christian Kosmowski -David Corbacho -Liang Peng -TJ VanToll -Aurelio De Rosa -Senya Pugach -Dan Hart -Nazar Mokrynskyi -Benjamin Tan -Amit Merchant -Jason Bedard -Veaceslav Grimalschi -Richard McDaniel -Arthur Verschaeve -Shivaji Varma -Ben Toews -Bin Xin -Neftaly Hernandez -T.J. Crowder -Nicolas HENRY -Frederic Hemberger -Victor Homyakov -Aditya Raghavan -Anne-Gaelle Colom -Leonardo Braga -George Mauer -Stephen Edgar -Thomas Tortorini -Jörn Wagner -Jon Hester -Colin Frick -Winston Howes -Alexander O'Mara -Chris Rebert -Bastian Buchholz -Mu Haibao -Calvin Metcalf -Arthur Stolyar -Gabriel Schulhof -Gilad Peleg -Julian Alexander Murillo -Kevin Kirsche -Martin Naumann -Yongwoo Jeon -John-David Dalton -Marek Lewandowski -Bruno Pérel -Daniel Nill -Reed Loden -Sean Henderson -Gary Ye -Richard Kraaijenhagen -Connor Atherton -Christian Grete -Tom von Clef -Liza Ramo -Joelle Fleurantin -Steve Mao -Jon Dufresne -Jae Sung Park -Josh Soref -Saptak Sengupta -Henry Wong -Jun Sun -Martijn W. van der Lee -Devin Wilson -Damian Senn -Zack Hall -Vitaliy Terziev -Todor Prikumov -Bernhard M. Wiedemann -Jha Naman -Alexander Lisianoi -William Robinet -Joe Trumbull -Alexander K -Ralin Chimev -Felipe Sateler -Christophe Tafani-Dereeper -Manoj Kumar -David Broder-Rodgers -Alex Louden -Alex Padilla -karan-96 -南漂一卒 -Erik Lax -Boom Lee -Andreas Solleder -Pierre Spring -Shashanka Nataraj -CDAGaming -Matan Kotler-Berkowitz <205matan@gmail.com> -Jordan Beland -Henry Zhu -Nilton Cesar -basil.belokon -Andrey Meshkov -tmybr11 -Luis Emilio Velasco Sanchez -Ed S -Bert Zhang -Sébastien Règne -wartmanm <3869625+wartmanm@users.noreply.github.com> -Siddharth Dungarwal -abnud1 -Andrei Fangli -Marja Hölttä -buddh4 -Hoang -Wonseop Kim -Pat O'Callaghan -JuanMa Ruiz -Ahmed.S.ElAfifi -Sean Robinson -Christian Oliff diff --git a/static/en/sp/spr/gettingstarted_files/jquery/jquery.min.js b/static/en/sp/spr/gettingstarted_files/jquery/jquery.min.js deleted file mode 100644 index b0614034a..000000000 --- a/static/en/sp/spr/gettingstarted_files/jquery/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GAMhC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAIjDC,EAAW,SAAmBF,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB6B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOrC,GAGCyC,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQvB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCwB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa9B,GAMrB,IAAI+B,IAAW/B,GAAO,WAAYA,GAAOA,EAAI+B,OAC5C3B,EAAOmB,EAAQvB,GAEhB,OAAKD,EAAYC,KAASE,EAAUF,KAIpB,UAATI,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAO/B,GArWhEyB,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOnD,EAAMG,KAAMT,OAKpB0D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGrD,EAAMG,KAAMT,MAIb2D,EAAM,EAAI3D,KAAM2D,EAAM3D,KAAKqD,QAAWrD,KAAM2D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAO/D,KAAKwD,cAAeK,GAM5C,OAHAC,EAAIE,WAAahE,KAGV8D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMjE,KAAMkE,IAG3BC,IAAK,SAAUD,GACd,OAAOlE,KAAK4D,UAAWb,EAAOoB,IAAKnE,KAAM,SAAUoE,EAAMlC,GACxD,OAAOgC,EAASzD,KAAM2D,EAAMlC,EAAGkC,OAIjC9D,MAAO,WACN,OAAON,KAAK4D,UAAWtD,EAAMK,MAAOX,KAAMqE,aAG3CC,MAAO,WACN,OAAOtE,KAAKuE,GAAI,IAGjBC,KAAM,WACL,OAAOxE,KAAKuE,IAAK,IAGlBE,KAAM,WACL,OAAOzE,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO5E,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM7E,KAAKqD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO7E,KAAK4D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE7E,KAAM8E,IAAQ,KAG5DC,IAAK,WACJ,OAAO/E,KAAKgE,YAAchE,KAAKwD,eAKhC5C,KAAMA,EACNoE,KAAM9E,EAAI8E,KACVC,OAAQ/E,EAAI+E,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBnE,EAAYmE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASxF,KACTkC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAItG,MAAOsG,IAGlBC,KAAM,aAENX,cAAe,SAAUpE,GACxB,IAAIgF,EAAOC,EAIX,SAAMjF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BgF,EAAQnG,EAAUmB,KASK,mBADvBiF,EAAOvF,EAAOP,KAAM6F,EAAO,gBAAmBA,EAAM9C,cACftC,EAAWT,KAAM8F,KAAWpF,IAGlEqF,cAAe,SAAUlF,GACxB,IAAI8D,EAEJ,IAAMA,KAAQ9D,EACb,OAAO,EAER,OAAO,GAKRmF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU3C,EAAK4C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa9B,IAEjB,IADA+B,EAAS/B,EAAI+B,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,WAIF,IAAMA,KAAKZ,EACV,IAAgD,IAA3C4C,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,MAKH,OAAOZ,GAIRoF,UAAW,SAAUxG,EAAKyG,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAPzG,IACCkD,EAAahD,OAAQF,IACzB6C,EAAOgB,MAAOD,EACE,iBAAR5D,EACP,CAAEA,GAAQA,GAGXU,EAAKH,KAAMqD,EAAK5D,IAIX4D,GAGR8C,QAAS,SAAUxC,EAAMlE,EAAKgC,GAC7B,OAAc,MAAPhC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKkE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQnG,KAAMiD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,GAMb,OAAO3G,EAAMuD,IAIdqD,KAAM,EAIN/F,QAASA,IAGa,mBAAXgG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAanH,EAAKkH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC3F,SAAUC,EAAInC,GACbtE,EAAY,WAAasE,EAAO,KAAQA,EAAKoC,gBAmB9C,IAAIC,EAWJ,SAAY1H,GACZ,IAAImC,EACHd,EACAsG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAvI,EACAwI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe3I,EAAOH,SACtB+I,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRlH,EAAS,GAAOC,eAChBf,EAAM,GACNmJ,EAAMnJ,EAAImJ,IACVC,EAAapJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU0I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOhL,MAAO,GAAM,MAEtC,OAAOiL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGvL,MAAO,GAAI,GAAM,KAC1BuL,EAAGE,WAAYF,EAAGxI,OAAS,GAAItC,SAAU,IAAO,IAI3C,KAAO8K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC1L,EAAKD,MACFT,EAAMI,EAAMG,KAAMiI,EAAa6D,YACjC7D,EAAa6D,YAMdrM,EAAKwI,EAAa6D,WAAWlJ,QAAS9B,SACrC,MAAQiL,GACT5L,EAAO,CAAED,MAAOT,EAAImD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW3I,MAAO6E,EAAQlF,EAAMG,KAAMgM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC1L,EAAW0B,EAAUA,EAAQ1B,SAAW,EAKzC,GAHAoF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAbzB,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOoF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWrD,EAEhByI,GAAiB,CAIrB,GAAkB,KAAb9G,IAAqBsL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbtL,EAAiB,CACrB,KAAO6C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQ/F,KAAMwD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQ/F,KAAMwD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAjM,EAAKD,MAAOgG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAASzL,EAAQkM,wBACzCrK,EAAQqK,uBAGR,OADA1M,EAAKD,MAAOgG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKvF,EAAQmM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAbzB,GAAqD,WAAnC0B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb1B,IACF2I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY7B,EAAQsM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAhN,EAAKD,MAAOgG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKpN,KAAMsN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK3O,EAASyC,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIxO,EAAMuO,EAAMnH,MAAO,KACtBpF,EAAIhC,EAAImD,OAET,MAAQnB,IACPwF,EAAKiH,WAAYzO,EAAKgC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE5H,UAAiC,IAAf6H,EAAE7H,UACnC4H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNd,EAAUqG,GAAOrG,QAAU,GAO3BwG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,EAAKqL,aACpBrH,GAAYhE,EAAK6I,eAAiB7I,GAAOsL,gBAK1C,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOrC,GAA6B,IAAjBqC,EAAIV,UAAmBU,EAAIyN,kBAMnDtH,GADAxI,EAAWqC,GACQyN,gBACnBrH,GAAkBT,EAAOhI,GAQpB8I,GAAgB9I,IAClBgQ,EAAYhQ,EAASiQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC5K,EAAQsM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa9C,EAASyC,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDjC,EAAQuI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BnB,EAAQiM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa9C,EAASsQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxCjC,EAAQkM,uBAAyBrC,EAAQuC,KAAM5N,EAAS0N,wBAMxDlM,EAAQ+O,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBlG,EAASwQ,oBAAsBxQ,EAASwQ,kBAAmBtK,GAAUzC,SAIzEjC,EAAQ+O,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAInP,EAAQiM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BrP,EAAQmM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK7C,UACTmP,EAAI9P,KAAMwD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAInP,EAAQkM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELlH,EAAQmM,IAAMtC,EAAQuC,KAAM5N,EAASiO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU1H,KAAM,SAAW6I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU1H,KAAM,MAAQ6I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU1H,KAAM,OAQjB+P,EAAQ/Q,EAASyC,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU1H,KAAM,MAAQ6I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU1H,KAAM,YAMX2N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU1H,KAAM,YAKjB2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,iBAGjB0N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQ/Q,EAASyC,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,OAAS6I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,WAAY,aAK7BwH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU1H,KAAM,WAAY,aAK7B2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,YAIXQ,EAAQyP,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBnN,EAAQ8P,kBAAoBnK,EAAQtG,KAAM8N,EAAI,KAI9CxH,EAAQtG,KAAM8N,EAAI,aAClBhG,EAAc3H,KAAM,KAAMgJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE5H,SAAiB4H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI9P,YAClC6P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGhI,EAAQmQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKvJ,GAAYuJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKxJ,GAAYwJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKvJ,GAAY,EACvBwJ,GAAKxJ,EAAW,EAEhB4R,GAAO,EACPH,EAAM,EACNpJ,EACEpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK9I,GAGR6H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERhD,EAAQyP,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQtG,KAAM2D,EAAMwN,GAG9B,GAAK9N,GAAO1C,EAAQ8P,mBAInB9M,EAAKxE,UAAuC,KAA3BwE,EAAKxE,SAAS2B,SAC/B,OAAOuC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMhS,EAAU,KAAM,CAAEwE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAarD,GAC5CuI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUxE,GACtCuI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMlC,EAAOP,KAAMiH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAf,EAAQuI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAItG,MAAO,0CAA4CsG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB9G,EAAQ+Q,iBACxBlK,GAAa7G,EAAQgR,YAAczL,EAAQrG,MAAO,GAClDqG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWtR,KAAMsB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJX,EAAW6C,EAAK7C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB6C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb7C,GAA+B,IAAbA,EAC7B,OAAO6C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMvM,MAAO,EAAG,IAGxBqK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIvM,MAAO,EAAG,IAGnBuM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASpS,QAAS,IAAKoS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIvM,MAAO,EAAG0S,GAClCnG,EAAO,GAAMoG,EAAS3S,MAAO,EAAG0S,IAI1BnG,EAAMvM,MAAO,EAAG,MAIzB+P,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,GAASC,EAAOhT,OAAQ+S,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMhJ,QAASwS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOhT,MAAO,EAAG+S,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKpB,MAAO,EAAG,GAC3BoT,EAA+B,SAArBhS,EAAKpB,OAAQ,GACvBqT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,SAEL,OAAO,EAKT0S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKT,YAAoBuN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,aACHuN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWvT,eAAgBqT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM5T,EAAS6L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASvD,QAASyB,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASnU,QAASkU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK7C,UAC7C,OAAO,KAKTiE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOlV,EAAOmV,UAAYnV,EAAOmV,SAASD,KAC9C,OAAOA,GAAQA,EAAK3U,MAAO,KAAQ8D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASxE,EAASyV,iBACrBzV,EAAS0V,UAAY1V,EAAS0V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK7C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR2S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa3O,KAAMsB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK7C,UAAkBuV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAazW,KAAMwD,GACdkT,GACJnT,EAAIvD,KAAMsB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ1B,SAAW,CAAE0B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAK/W,KAAQqX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa5W,EAAS6L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvCjT,EAAKD,MAAOgG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCvD,EAASuX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU1B,SAC1BgX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOf,MAAO,KAAM+V,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACEpW,MAAO,EAAG4B,EAAI,GACdxB,OAAQ,CAAEwG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOpW,MAAO4B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOpW,MAAOwE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASvW,KAAMgU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOvY,MAAO,GAGtCqY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMrY,MAAOuM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOlM,KAAQ8V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASxM,MAAO,IA4ZzCwH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYnY,KAAMiY,GAElBC,EAAgBlY,KAAMiY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWrD,GAAYqD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBrN,IACtCuI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWrD,EAAUiU,GAAQ,CAChDlN,EAAQ/F,KAAMwD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUjU,KAAMwD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI5I,KAAMkG,IAM/B0S,EAAajC,GAAUiC,GAIxBzY,EAAKD,MAAOgG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIvM,MAAO,IAC5B+C,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ1B,UAAkB8G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS1C,MAAOoW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA9V,EAAKD,MAAOgG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRvF,EAAQgR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E1E,EAAQ+Q,mBAAqBjK,EAG7BC,IAIA/G,EAAQmQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBvR,EAASyC,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjEpG,EAAQuI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK1H,GAILgD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK7C,SACtC,GAAuB,IAAlB6C,EAAK7C,SAAiB,CAC1B,GAAKyY,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ9T,KAAMwD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE5Y,UAAkB4Y,IAAM/V,GAC9BsQ,EAAQ9T,KAAMuZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAEvB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG/D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKtT,EAAYkZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU9Z,KAAM2D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUhZ,SACPwB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCvD,EAAQJ,KAAM8Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK7C,SACxBwB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK7C,aAIdwB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM7E,KAAKqD,OACXmX,EAAOxa,KAER,GAAyB,iBAAbgD,EACX,OAAOhD,KAAK4D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKlC,MAChC,OAAO,KAQX,IAFA8D,EAAM9D,KAAK4D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRta,KAIoB,iBAAbgD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOhD,KAQR,GAHAmV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BhD,KAAKwD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAO/D,KAAM+C,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ1B,SAAW0B,EAAQgK,eAAiBhK,EAAUrD,GACjE,IAIIya,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT5B,EAAYrB,KAAM6M,IACtB7M,KAAM6M,GAAS5J,EAAS4J,IAIxB7M,KAAK8R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO7M,KAYP,OARAoE,EAAOxE,EAASuN,eAAgBN,EAAO,OAKtC7M,KAAM,GAAMoE,EACZpE,KAAKqD,OAAS,GAERrD,KAcH,OAAKgD,EAASzB,UACpBvB,KAAM,GAAMgD,EACZhD,KAAKqD,OAAS,EACPrD,MAIIqB,EAAY2B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUhD,QAIhCsD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQnD,GAGrB,IAAIgb,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAItN,UACpC,OAAOsN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQxF,MAC7Bmb,EAAID,EAAQ7X,OAEb,OAAOrD,KAAKqQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUxI,KAAMkb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAInb,KAAKqD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM7O,KAAMkC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAItN,SAAW,KAAQ2Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAItN,UACHwB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ9T,KAAMiO,GACd,MAMJ,OAAO7O,KAAK4D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJvD,EAAQJ,KAAMsC,EAAQqB,GAAQpE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBoE,EAAKb,OAASa,EAAM,GAAMA,GAZjBpE,KAAM,IAAOA,KAAM,GAAI2C,WAAe3C,KAAKsE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOjD,KAAK4D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAO/D,KAAK0D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOhD,KAAKub,IAAiB,MAAZvY,EAChBhD,KAAKgE,WAAahE,KAAKgE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO3S,SAAkB2S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT3b,EAAUiE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKnE,KAAMkD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK9E,OAAQ,KACjB0C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd1U,KAAKqD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHhc,KAAK4D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS7F,EAAcqb,EAASxV,EAAMyV,SAC1CD,EAAOjc,KAAMyG,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS7F,EAAcqb,EAASxV,EAAM2V,MACjDH,EAAOjc,KAAMyG,EAAOqV,EAASC,GAQ7BD,EAAQ5b,WAAOkF,EAAW,CAAEqB,GAAQ5G,MAAOmc,IAM3C,MAAQvV,GAITsV,EAAO7b,WAAOkF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc5c,MAAOwc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM1c,KAAMuc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B5F,EAAY4F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK3I,KAAMqG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKxd,MAIR2d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIvd,MAKR8U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDvJ,MAMR4d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTnd,MAERmM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVnd,MAERqd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQjU,MAAQiU,EAAKjU,QAAUiU,GAC9C+I,EAAM1c,KAAM2T,GACN2I,GACLM,KAGKxd,MAIRwd,KAAM,WAEL,OADAhD,EAAKsD,SAAU9d,KAAMqE,WACdrE,MAIRod,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BrE,MAERqe,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK7B,EAAYkd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGvC,MAAOX,KAAMqE,WAChCqa,GAAYrd,EAAYqd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtBze,KACAkD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOnf,KACVuU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQ/N,MAAOwe,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLxb,EAAYwb,GAGXqC,EACJrC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC7f,EAAO8f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAY0d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYwd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYyd,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUrb,GAClB,OAAc,MAAPA,EAAcyB,EAAOmC,OAAQ5D,EAAKqb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAUze,OAASoe,OAAWvY,EAAY7F,KAAMqE,WAChErE,MAMRoe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKvd,KAAM2d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB7f,EAAMG,KAAM4D,WAG5B+b,EAASrd,EAAOgb,WAGhBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMlC,KACvBmgB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAa/C,EAAMG,KAAM4D,WAAc6C,IAC5D+Y,GACTG,EAAOb,YAAaW,EAAiBC,KAMzC,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAOxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAO5D,QACtEyD,GAGsB,YAAnBG,EAAOlC,SACX7c,EAAY8e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAOvD,OAKhB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAO5D,QAGzD,OAAO4D,EAAOzD,aAOhB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CxgB,EAAOygB,SAAWzgB,EAAOygB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9ErF,EAAOygB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCpG,EAAO8f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRjhB,EAASkhB,oBAAqB,mBAAoBD,GAClD9gB,EAAO+gB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBnG,MAGR+C,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa3f,EAAU,CAAEmD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBjd,EAASqhB,YACa,YAAxBrhB,EAASqhB,aAA6BrhB,EAAS8P,gBAAgBwR,SAGjEnhB,EAAO8f,WAAY9c,EAAO4X,QAK1B/a,EAASmQ,iBAAkB,mBAAoB8Q,GAG/C9gB,EAAOgQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAEN/f,EAAY6F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAGzC,KAAMoD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK9gB,KAAMsC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EACjBpa,EACAA,EAAMzG,KAAMoD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAM/C,OAAKkT,EACGvd,EAIH0d,EACGre,EAAGzC,KAAMoD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM3gB,UAAqC,IAAnB2gB,EAAM3gB,YAAsB2gB,EAAM3gB,UAMlE,SAAS4gB,IACRniB,KAAK8F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOliB,KAAK8F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,SAAYoB,EAMxB9G,OAAOiiB,eAAgBH,EAAOliB,KAAK8F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQjO,KAAKiO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNlO,KAAKiO,MAAOiU,GAGZA,EAAOliB,KAAK8F,UAAaoc,EAAOliB,KAAK8F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElClH,KAAK0D,IAAKwe,EAAOhU,IASzBlO,KAAKuiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOliB,KAAK8F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,cAAYD,SAEjBqc,EAAOliB,KAAK8F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOliB,KAAK8F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK7C,SAI/B,GAHA6D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOpE,KAAM,GACbyO,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKlO,KAAKqD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK7C,WAAmBohB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRvE,QAAS,WAClBuE,EAAO2c,EAAW3c,EAAK9E,MAAO,IAC9ByiB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJlO,KAAKiE,KAAM,WACjB2e,EAASL,IAAKviB,KAAMkO,KAIfiT,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDxiB,KAAKiE,KAAM,WAGV2e,EAASL,IAAKviB,KAAMkO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOlO,KAAKiE,KAAM,WACjB2e,EAASjF,OAAQ3d,KAAMkO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM1c,KAAM4hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAGzC,KAAM2D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOtd,KAAM,GAAK0B,QAGjBmE,IAAT2c,EACNxiB,KACAA,KAAKiE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOtd,KAAM0B,EAAM8gB,GAGtCzf,EAAOygB,YAAaxjB,KAAM0B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAASrjB,KAAM0B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO1B,KAAKiE,KAAM,WACjBlB,EAAOsgB,QAASrjB,KAAM0B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO1B,KAAKsd,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAMJ,GACxB,IAAIoP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW7R,KACXkC,EAAIlC,KAAKqD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXJ,EAAMI,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAASrb,MAGxB,IAAIwiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB9P,EAAS8P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK7C,WAClBwB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUrlB,MAAM,IAExBylB,KAAM,WACL,OAAOJ,GAAUrlB,OAElB0lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQle,KAAKslB,OAAStlB,KAAKylB,OAG5BzlB,KAAKiE,KAAM,WACZogB,GAAoBrkB,MACxB+C,EAAQ/C,MAAOslB,OAEfviB,EAAQ/C,MAAOylB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADc/lB,EAASmmB,yBACRrjB,YAAa9C,EAASyC,cAAe,SACpDsO,GAAQ/Q,EAASyC,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBvP,EAAQ4kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBxP,EAAQ8kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBxP,EAAQ+kB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfplB,EAAQ+kB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK7C,SAAW,CAAE6C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM9mB,KAAMqC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ1mB,KAAMwD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQxmB,KAAMwD,GAMlB,OAAOqjB,EAIR,IACCI,GAAY,OACZC,GAAc,iDACdC,GAAiB,sBAElB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY9jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOxE,EAASyV,cACf,MAAQ8S,KATQC,KAAqC,UAAT1mB,GAY/C,SAAS2mB,GAAIjkB,EAAMkkB,EAAOtlB,EAAUwf,EAAMtf,EAAIqlB,GAC7C,IAAIC,EAAQ9mB,EAGZ,GAAsB,iBAAV4mB,EAAqB,CAShC,IAAM5mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEyiB,EACbD,GAAIjkB,EAAM1C,EAAMsB,EAAUwf,EAAM8F,EAAO5mB,GAAQ6mB,GAEhD,OAAOnkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK+kB,QACC,IAAM/kB,EACZ,OAAOkB,EAeR,OAZa,IAARmkB,IACJC,EAAStlB,GACTA,EAAK,SAAUulB,GAId,OADA1lB,IAAS2lB,IAAKD,GACPD,EAAO7nB,MAAOX,KAAMqE,aAIzB8C,KAAOqhB,EAAOrhB,OAAUqhB,EAAOrhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAO0lB,MAAMlN,IAAKvb,KAAMsoB,EAAOplB,EAAIsf,EAAMxf,KA+a3C,SAAS2lB,GAAgBpa,EAAI7M,EAAMwmB,GAG5BA,GAQNvF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU+Z,GAClB,IAAIG,EAAUtV,EACbuV,EAAQlG,EAASjf,IAAK1D,KAAM0B,GAE7B,GAAyB,EAAlB+mB,EAAMK,WAAmB9oB,KAAM0B,IAKrC,GAAMmnB,EAAMxlB,QAiCEN,EAAO0lB,MAAMvJ,QAASxd,IAAU,IAAKqnB,cAClDN,EAAMO,uBAfN,GAdAH,EAAQvoB,EAAMG,KAAM4D,WACpBse,EAASJ,IAAKviB,KAAM0B,EAAMmnB,GAK1BD,EAAWV,EAAYloB,KAAM0B,GAC7B1B,KAAM0B,KAEDmnB,KADLvV,EAASqP,EAASjf,IAAK1D,KAAM0B,KACJknB,EACxBjG,EAASJ,IAAKviB,KAAM0B,GAAM,GAE1B4R,EAAS,GAELuV,IAAUvV,EAKd,OAFAmV,EAAMQ,2BACNR,EAAMS,iBACC5V,EAAOpM,WAeL2hB,EAAMxlB,SAGjBsf,EAASJ,IAAKviB,KAAM0B,EAAM,CACzBwF,MAAOnE,EAAO0lB,MAAMU,QAInBpmB,EAAOmC,OAAQ2jB,EAAO,GAAK9lB,EAAOqmB,MAAM9lB,WACxCulB,EAAMvoB,MAAO,GACbN,QAKFyoB,EAAMQ,qCAzE0BpjB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAMsmB,IA5a/BjlB,EAAO0lB,MAAQ,CAEdjpB,OAAQ,GAER+b,IAAK,SAAUnX,EAAMkkB,EAAO5Z,EAAS8T,EAAMxf,GAE1C,IAAIqmB,EAAaC,EAAa5Y,EAC7B6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADA2a,EAAc3a,GACQA,QACtB1L,EAAWqmB,EAAYrmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfoiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASnpB,OAAO0pB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUvd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAO0lB,MAAMuB,YAAcxd,EAAE9K,KACpEqB,EAAO0lB,MAAMwB,SAAStpB,MAAOyD,EAAMC,gBAAcwB,IAMpD2jB,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAEP9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,EAGjEwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1C+nB,EAAY1mB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNkoB,SAAUA,EACVpH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWma,EAAW/b,KAAM,MAC1Byb,IAGKK,EAAWH,EAAQ7nB,OAC1BgoB,EAAWH,EAAQ7nB,GAAS,IACnByoB,cAAgB,EAGnBjL,EAAQkL,QACiD,IAA9DlL,EAAQkL,MAAM3pB,KAAM2D,EAAMoe,EAAMmH,EAAYL,IAEvCllB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM4nB,IAK3BpK,EAAQ3D,MACZ2D,EAAQ3D,IAAI9a,KAAM2D,EAAMqlB,GAElBA,EAAU/a,QAAQvH,OACvBsiB,EAAU/a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJ0mB,EAASzkB,OAAQykB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS9oB,KAAM6oB,GAIhB1mB,EAAO0lB,MAAMjpB,OAAQkC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMkkB,EAAO5Z,EAAS1L,EAAUqnB,GAEjD,IAAIvlB,EAAGwlB,EAAW5Z,EACjB6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMylB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAMP,GAJA9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAE1CgoB,EAAWH,EADX7nB,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAG9D0c,EAAYxlB,EAAI4kB,EAASrmB,OACzB,MAAQyB,IACP2kB,EAAYC,EAAU5kB,IAEfulB,GAAeT,IAAaH,EAAUG,UACzClb,GAAWA,EAAQvH,OAASsiB,EAAUtiB,MACtCuJ,IAAOA,EAAIlD,KAAMic,EAAUja,YAC3BxM,GAAYA,IAAaymB,EAAUzmB,WACxB,OAAbA,IAAqBymB,EAAUzmB,YAChC0mB,EAASzkB,OAAQH,EAAG,GAEf2kB,EAAUzmB,UACd0mB,EAASS,gBAELjL,EAAQvB,QACZuB,EAAQvB,OAAOld,KAAM2D,EAAMqlB,IAOzBa,IAAcZ,EAASrmB,SACrB6b,EAAQqL,WACkD,IAA/DrL,EAAQqL,SAAS9pB,KAAM2D,EAAMulB,EAAYE,EAASE,SAElDhnB,EAAOynB,YAAapmB,EAAM1C,EAAMmoB,EAASE,eAGnCR,EAAQ7nB,SA1Cf,IAAMA,KAAQ6nB,EACbxmB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,EAAO4mB,EAAOkB,GAAK9a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe+iB,IAC1B5G,EAAShF,OAAQvZ,EAAM,mBAIzB6lB,SAAU,SAAUQ,GAEnB,IAAIvoB,EAAG4C,EAAGhB,EAAK4Q,EAAS+U,EAAWiB,EAClCnW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BolB,EAAQ1lB,EAAO0lB,MAAMkC,IAAKF,GAE1Bf,GACE/G,EAASjf,IAAK1D,KAAM,WAAcI,OAAO0pB,OAAQ,OAC/CrB,EAAM/mB,OAAU,GACpBwd,EAAUnc,EAAO0lB,MAAMvJ,QAASuJ,EAAM/mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMkU,EAENvmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAumB,EAAMmC,eAAiB5qB,MAGlBkf,EAAQ2L,cAA2D,IAA5C3L,EAAQ2L,YAAYpqB,KAAMT,KAAMyoB,GAA5D,CAKAiC,EAAe3nB,EAAO0lB,MAAMiB,SAASjpB,KAAMT,KAAMyoB,EAAOiB,GAGxDxnB,EAAI,EACJ,OAAUwS,EAAUgW,EAAcxoB,QAAYumB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBrW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAU2kB,EAAY/U,EAAQgV,SAAU5kB,QACtC2jB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAUja,YACnCiZ,EAAMwC,WAAWzd,KAAMic,EAAUja,aAEjCiZ,EAAMgB,UAAYA,EAClBhB,EAAMjG,KAAOiH,EAAUjH,UAKV3c,KAHb/B,IAAUf,EAAO0lB,MAAMvJ,QAASuK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU/a,SAAU/N,MAAO+T,EAAQtQ,KAAMmQ,MAGT,KAAzBkU,EAAMnV,OAASxP,KACrB2kB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK9J,EAAQgM,cACZhM,EAAQgM,aAAazqB,KAAMT,KAAMyoB,GAG3BA,EAAMnV,SAGdoW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAIxnB,EAAGunB,EAAWzX,EAAKmZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBtb,EAAM4Z,EAAMjjB,OAGb,GAAK2kB,GAIJtb,EAAItN,YAOc,UAAfknB,EAAM/mB,MAAoC,GAAhB+mB,EAAM1S,QAEnC,KAAQlH,IAAQ7O,KAAM6O,EAAMA,EAAIlM,YAAc3C,KAI7C,GAAsB,IAAjB6O,EAAItN,WAAoC,UAAfknB,EAAM/mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFAgf,EAAkB,GAClBC,EAAmB,GACblpB,EAAI,EAAGA,EAAIioB,EAAejoB,SAME2D,IAA5BulB,EAFLpZ,GAHAyX,EAAYC,EAAUxnB,IAGNc,SAAW,OAG1BooB,EAAkBpZ,GAAQyX,EAAU5e,cACC,EAApC9H,EAAQiP,EAAKhS,MAAOqb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKhS,KAAM,KAAM,CAAE6O,IAAQxL,QAErC+nB,EAAkBpZ,IACtBmZ,EAAgBvqB,KAAM6oB,GAGnB0B,EAAgB9nB,QACpBqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUyB,IAY9C,OALAtc,EAAM7O,KACDmqB,EAAgBT,EAASrmB,QAC7BqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUA,EAASppB,MAAO6pB,KAGpDO,GAGRW,QAAS,SAAUjmB,EAAMkmB,GACxBlrB,OAAOiiB,eAAgBtf,EAAOqmB,MAAM9lB,UAAW8B,EAAM,CACpDmmB,YAAY,EACZjJ,cAAc,EAEd5e,IAAKrC,EAAYiqB,GAChB,WACC,GAAKtrB,KAAKwrB,cACR,OAAOF,EAAMtrB,KAAKwrB,gBAGrB,WACC,GAAKxrB,KAAKwrB,cACR,OAAOxrB,KAAKwrB,cAAepmB,IAI/Bmd,IAAK,SAAUrb,GACd9G,OAAOiiB,eAAgBriB,KAAMoF,EAAM,CAClCmmB,YAAY,EACZjJ,cAAc,EACdmJ,UAAU,EACVvkB,MAAOA,QAMXyjB,IAAK,SAAUa,GACd,OAAOA,EAAezoB,EAAO+C,SAC5B0lB,EACA,IAAIzoB,EAAOqmB,MAAOoC,IAGpBtM,QAAS,CACRwM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU5H,GAIhB,IAAIjU,EAAKvO,MAAQwiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAG1Boa,GAAgBpa,EAAI,QAASyZ,KAIvB,GAERmB,QAAS,SAAU3G,GAIlB,IAAIjU,EAAKvO,MAAQwiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAE1Boa,GAAgBpa,EAAI,UAId,GAKRkY,SAAU,SAAUgC,GACnB,IAAIjjB,EAASijB,EAAMjjB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOomB,OAASxf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBqmB,aAAc,CACbX,aAAc,SAAUzC,QAID5iB,IAAjB4iB,EAAMnV,QAAwBmV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMnV,YA8F7CvQ,EAAOynB,YAAc,SAAUpmB,EAAM1C,EAAMqoB,GAGrC3lB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMqoB,IAIlChnB,EAAOqmB,MAAQ,SAAUznB,EAAKoqB,GAG7B,KAAQ/rB,gBAAgB+C,EAAOqmB,OAC9B,OAAO,IAAIrmB,EAAOqmB,MAAOznB,EAAKoqB,GAI1BpqB,GAAOA,EAAID,MACf1B,KAAKwrB,cAAgB7pB,EACrB3B,KAAK0B,KAAOC,EAAID,KAIhB1B,KAAKgsB,mBAAqBrqB,EAAIsqB,uBACHpmB,IAAzBlE,EAAIsqB,mBAGgB,IAApBtqB,EAAImqB,YACL9D,GACAC,GAKDjoB,KAAKwF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOjE,SACxCI,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELxF,KAAK+qB,cAAgBppB,EAAIopB,cACzB/qB,KAAKksB,cAAgBvqB,EAAIuqB,eAIzBlsB,KAAK0B,KAAOC,EAIRoqB,GACJhpB,EAAOmC,OAAQlF,KAAM+rB,GAItB/rB,KAAKmsB,UAAYxqB,GAAOA,EAAIwqB,WAAa1jB,KAAK2jB,MAG9CpsB,KAAM+C,EAAO+C,UAAY,GAK1B/C,EAAOqmB,MAAM9lB,UAAY,CACxBE,YAAaT,EAAOqmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAI1c,EAAIxM,KAAKwrB,cAEbxrB,KAAKgsB,mBAAqBhE,GAErBxb,IAAMxM,KAAKqsB,aACf7f,EAAE0c,kBAGJF,gBAAiB,WAChB,IAAIxc,EAAIxM,KAAKwrB,cAEbxrB,KAAK8qB,qBAAuB9C,GAEvBxb,IAAMxM,KAAKqsB,aACf7f,EAAEwc,mBAGJC,yBAA0B,WACzB,IAAIzc,EAAIxM,KAAKwrB,cAEbxrB,KAAKgrB,8BAAgChD,GAEhCxb,IAAMxM,KAAKqsB,aACf7f,EAAEyc,2BAGHjpB,KAAKgpB,oBAKPjmB,EAAOkB,KAAM,CACZqoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRnrB,MAAM,EACNorB,UAAU,EACVjf,KAAK,EACLkf,SAAS,EACTrX,QAAQ,EACRsX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EAETC,MAAO,SAAUxF,GAChB,IAAI1S,EAAS0S,EAAM1S,OAGnB,OAAoB,MAAf0S,EAAMwF,OAAiBpG,GAAUra,KAAMib,EAAM/mB,MACxB,MAAlB+mB,EAAM0E,SAAmB1E,EAAM0E,SAAW1E,EAAM2E,SAIlD3E,EAAMwF,YAAoBpoB,IAAXkQ,GAAwB+R,GAAYta,KAAMib,EAAM/mB,MACtD,EAATqU,EACG,EAGM,EAATA,EACG,EAGM,EAATA,EACG,EAGD,EAGD0S,EAAMwF,QAEZlrB,EAAO0lB,MAAM4C,SAEhBtoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUxsB,EAAMqnB,GACpEhmB,EAAO0lB,MAAMvJ,QAASxd,GAAS,CAG9B0oB,MAAO,WAQN,OAHAzB,GAAgB3oB,KAAM0B,EAAMwmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB3oB,KAAM0B,IAGf,GAGRqnB,aAAcA,KAYhBhmB,EAAOkB,KAAM,CACZkqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB5nB,EAAO0lB,MAAMvJ,QAASqP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAI3kB,EAEH0qB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTxuB,MAMgC+C,EAAOyF,SANvCxI,KAMyDwuB,MAClE/F,EAAM/mB,KAAO+nB,EAAUG,SACvB9lB,EAAM2lB,EAAU/a,QAAQ/N,MAAOX,KAAMqE,WACrCokB,EAAM/mB,KAAOipB,GAEP7mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBmjB,GAAI,SAAUC,EAAOtlB,EAAUwf,EAAMtf,GACpC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,IAEzCqlB,IAAK,SAAUD,EAAOtlB,EAAUwf,EAAMtf,GACrC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,EAAI,IAE7CwlB,IAAK,SAAUJ,EAAOtlB,EAAUE,GAC/B,IAAIumB,EAAW/nB,EACf,GAAK4mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClB1mB,EAAQulB,EAAMsC,gBAAiBlC,IAC9Be,EAAUja,UACTia,EAAUG,SAAW,IAAMH,EAAUja,UACrCia,EAAUG,SACXH,EAAUzmB,SACVymB,EAAU/a,SAEJ1O,KAER,GAAsB,iBAAVsoB,EAAqB,CAGhC,IAAM5mB,KAAQ4mB,EACbtoB,KAAK0oB,IAAKhnB,EAAMsB,EAAUslB,EAAO5mB,IAElC,OAAO1B,KAWR,OATkB,IAAbgD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK+kB,IAECjoB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAM9K,OAAQ3d,KAAMsoB,EAAOplB,EAAIF,QAMzC,IAKCyrB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBxqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQxa,SAAkBwa,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASyqB,GAAezqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAAS0qB,GAAe1qB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKpB,MAAO,EAAG,GAClC8D,EAAK1C,KAAO0C,EAAK1C,KAAKpB,MAAO,GAE7B8D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAAS2qB,GAAgBptB,EAAKqtB,GAC7B,IAAI9sB,EAAGiZ,EAAGzZ,EAAgButB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKztB,SAAV,CAKA,GAAKohB,EAASD,QAAS/gB,KAEtB4nB,EADW5G,EAASjf,IAAK/B,GACP4nB,QAKjB,IAAM7nB,KAFNihB,EAAShF,OAAQqR,EAAM,iBAETzF,EACb,IAAMrnB,EAAI,EAAGiZ,EAAIoO,EAAQ7nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAO0lB,MAAMlN,IAAKyT,EAAMttB,EAAM6nB,EAAQ7nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBstB,EAAWrM,EAASzB,OAAQxf,GAC5ButB,EAAWnsB,EAAOmC,OAAQ,GAAI+pB,GAE9BrM,EAASL,IAAKyM,EAAME,KAkBtB,SAASC,GAAUC,EAAY7a,EAAMrQ,EAAUojB,GAG9C/S,EAAOhU,EAAMgU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAASiI,EAAYrtB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAIiU,EAAW/rB,OACfisB,EAAWnU,EAAI,EACfjU,EAAQqN,EAAM,GACdgb,EAAkBluB,EAAY6F,GAG/B,GAAKqoB,GACG,EAAJpU,GAA0B,iBAAVjU,IAChB9F,EAAQ4kB,YAAc0I,GAASlhB,KAAMtG,GACxC,OAAOkoB,EAAWnrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO4U,EAAW7qB,GAAI8W,GACrBkU,IACJhb,EAAM,GAAMrN,EAAMzG,KAAMT,KAAMqb,EAAOb,EAAKgV,SAE3CL,GAAU3U,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM6a,EAAY,GAAIniB,eAAe,EAAOmiB,EAAY9H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA+H,GADAjI,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYoH,KAC/BxrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMotB,IACVttB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BqtB,GAIJtsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAASzD,KAAM2uB,EAAYltB,GAAKF,EAAME,GAGvC,GAAKmtB,EAOJ,IANAptB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAAS0H,IAGf5sB,EAAI,EAAGA,EAAImtB,EAAYntB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAO0sB,WAAaztB,EAAKH,UAC7BkB,EAAO0sB,SAAUztB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAAS0oB,GAAc,IAAM3sB,EAAMC,IAQnE,OAAOmtB,EAGR,SAASzR,GAAQvZ,EAAMpB,EAAU0sB,GAKhC,IAJA,IAAI1tB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCwtB,GAA8B,IAAlB1tB,EAAKT,UACtBwB,EAAO4sB,UAAWjJ,GAAQ1kB,IAGtBA,EAAKW,aACJ+sB,GAAYxL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU6H,GACxB,OAAOA,GAGRjqB,MAAO,SAAUnB,EAAMwrB,EAAeC,GACrC,IAAI3tB,EAAGiZ,EAAG2U,EAAaC,EApINpuB,EAAKqtB,EACnB5iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB+J,EAAS9L,GAAY9f,GAGtB,KAAMhD,EAAQ8kB,gBAAsC,IAAlB9hB,EAAK7C,UAAoC,KAAlB6C,EAAK7C,UAC3DwB,EAAO8W,SAAUzV,IAMnB,IAHA2rB,EAAerJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFb2U,EAAcpJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLmuB,EAAa5tB,GAjJH8sB,EAiJQe,EAAc7tB,QAhJzCkK,EAGc,WAHdA,EAAW4iB,EAAK5iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDstB,EAAKtZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC4iB,EAAKrV,aAAehY,EAAIgY,cA6IxB,GAAKiW,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAepJ,GAAQtiB,GACrC2rB,EAAeA,GAAgBrJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAI2U,EAAYzsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C6sB,GAAgBe,EAAa5tB,GAAK6tB,EAAc7tB,SAGjD6sB,GAAgB3qB,EAAMmB,GAWxB,OAL2B,GAD3BwqB,EAAerJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAeoJ,GAAeC,GAAUtJ,GAAQtiB,EAAM,WAIhDmB,GAGRoqB,UAAW,SAAU9rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAO0lB,MAAMvJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK+G,OACT,IAAM7nB,KAAQ8gB,EAAK+G,OACbrK,EAASxd,GACbqB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,GAI3BqB,EAAOynB,YAAapmB,EAAM1C,EAAM8gB,EAAKuH,QAOxC3lB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB+qB,OAAQ,SAAUjtB,GACjB,OAAO2a,GAAQ3d,KAAMgD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ3d,KAAMgD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMtC,MACbA,KAAK6V,QAAQ5R,KAAM,WACK,IAAlBjE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKqS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B6sB,OAAQ,WACP,OAAOf,GAAUnvB,KAAMqE,UAAW,SAAUD,GACpB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CqtB,GAAoB5uB,KAAMoE,GAChC1B,YAAa0B,MAKvB+rB,QAAS,WACR,OAAOhB,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIiE,EAASopB,GAAoB5uB,KAAMoE,GACvCoB,EAAO4qB,aAAchsB,EAAMoB,EAAO8M,gBAKrC+d,OAAQ,WACP,OAAOlB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,SAKvCswB,MAAO,WACN,OAAOnB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,KAAKgP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOpE,KAAMkC,IAAeA,IACd,IAAlBkC,EAAK7C,WAGTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOrS,MAGRuF,MAAO,SAAUqqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD7vB,KAAKmE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOvF,KAAM4vB,EAAeC,MAI5CL,KAAM,SAAUtoB,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAI9C,EAAOpE,KAAM,IAAO,GACvBkC,EAAI,EACJiZ,EAAInb,KAAKqD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK7C,SAChC,OAAO6C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBunB,GAAajhB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOpE,KAAMkC,IAAO,IAGVX,WACTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJpE,KAAK6V,QAAQqa,OAAQhpB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BktB,YAAa,WACZ,IAAIjJ,EAAU,GAGd,OAAO6H,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,IAAI8P,EAASlU,KAAK2C,WAEbI,EAAO6D,QAAS5G,KAAMsnB,GAAY,IACtCvkB,EAAO4sB,UAAWjJ,GAAQ1mB,OACrBkU,GACJA,EAAOsc,aAAcpsB,EAAMpE,QAK3BsnB,MAILvkB,EAAOkB,KAAM,CACZwsB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUxrB,EAAMyrB,GAClB9tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACNgtB,EAAS/tB,EAAQC,GACjBwB,EAAOssB,EAAOztB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOxE,KAAOA,KAAKuF,OAAO,GACxCxC,EAAQ+tB,EAAQ5uB,IAAO2uB,GAAYhtB,GAInCjD,EAAKD,MAAOmD,EAAKD,EAAMH,OAGxB,OAAO1D,KAAK4D,UAAWE,MAGzB,IAAIitB,GAAY,IAAIjnB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDkN,GAAY,SAAU5sB,GAKxB,IAAI6oB,EAAO7oB,EAAK6I,cAAc4C,YAM9B,OAJMod,GAASA,EAAKgE,SACnBhE,EAAOltB,GAGDktB,EAAKiE,iBAAkB9sB,IAG5B+sB,GAAO,SAAU/sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACRgsB,EAAM,GAGP,IAAMhsB,KAAQD,EACbisB,EAAKhsB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAASzD,KAAM2D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAASgsB,EAAKhsB,GAG3B,OAAOtB,GAIJutB,GAAY,IAAIvnB,OAAQma,GAAUrW,KAAM,KAAO,KA8HnD,SAAS0jB,GAAQltB,EAAMgB,EAAMmsB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU5tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCAiN,EAAWA,GAAYP,GAAW5sB,MAQpB,MAFbN,EAAMytB,EAASI,iBAAkBvsB,IAAUmsB,EAAUnsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBhE,EAAQwwB,kBAAoBb,GAAUvjB,KAAM1J,IAASutB,GAAU7jB,KAAMpI,KAG1EosB,EAAQlN,EAAMkN,MACdC,EAAWnN,EAAMmN,SACjBC,EAAWpN,EAAMoN,SAGjBpN,EAAMmN,SAAWnN,EAAMoN,SAAWpN,EAAMkN,MAAQ1tB,EAChDA,EAAMytB,EAASC,MAGflN,EAAMkN,MAAQA,EACdlN,EAAMmN,SAAWA,EACjBnN,EAAMoN,SAAWA,SAIJ7rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS+tB,GAAcC,EAAaC,GAGnC,MAAO,CACNruB,IAAK,WACJ,IAAKouB,IASL,OAAS9xB,KAAK0D,IAAMquB,GAASpxB,MAAOX,KAAMqE,kBALlCrE,KAAK0D,OAxLhB,WAIC,SAASsuB,IAGR,GAAMrM,EAAN,CAIAsM,EAAU3N,MAAM4N,QAAU,+EAE1BvM,EAAIrB,MAAM4N,QACT,4HAGDxiB,GAAgBhN,YAAauvB,GAAYvvB,YAAaijB,GAEtD,IAAIwM,EAAWpyB,EAAOmxB,iBAAkBvL,GACxCyM,EAAoC,OAAjBD,EAASriB,IAG5BuiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD5M,EAAIrB,MAAMkO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD7L,EAAIrB,MAAMqO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoB3M,EAAIkN,YAAc,GAEzDnjB,GAAgB9M,YAAaqvB,GAI7BtM,EAAM,MAGP,SAAS2M,EAAoBQ,GAC5B,OAAO/sB,KAAKgtB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYryB,EAASyC,cAAe,OACpCsjB,EAAM/lB,EAASyC,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM4O,eAAiB,cAC3BvN,EAAIM,WAAW,GAAO3B,MAAM4O,eAAiB,GAC7C9xB,EAAQ+xB,gBAA+C,gBAA7BxN,EAAIrB,MAAM4O,eAEpCnwB,EAAOmC,OAAQ9D,EAAS,CACvBgyB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAQRY,qBAAsB,WACrB,IAAIC,EAAOlN,EAAImN,EAASC,EAoBxB,OAnBgC,MAA3BV,IACJQ,EAAQ7zB,EAASyC,cAAe,SAChCkkB,EAAK3mB,EAASyC,cAAe,MAC7BqxB,EAAU9zB,EAASyC,cAAe,OAElCoxB,EAAMnP,MAAM4N,QAAU,kCACtB3L,EAAGjC,MAAMsP,OAAS,MAClBF,EAAQpP,MAAMsP,OAAS,MAEvBlkB,GACEhN,YAAa+wB,GACb/wB,YAAa6jB,GACb7jB,YAAagxB,GAEfC,EAAU5zB,EAAOmxB,iBAAkB3K,GACnC0M,EAAuD,EAA7BY,SAAUF,EAAQC,QAE5ClkB,GAAgB9M,YAAa6wB,IAEvBR,MApHV,GAmMA,IAAIa,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAan0B,EAASyC,cAAe,OAAQiiB,MAC7C0P,GAAc,GAkBf,SAASC,GAAe7uB,GACvB,IAAI8uB,EAAQnxB,EAAOoxB,SAAU/uB,IAAU4uB,GAAa5uB,GAEpD,OAAK8uB,IAGA9uB,KAAQ2uB,GACL3uB,EAED4uB,GAAa5uB,GAxBrB,SAAyBA,GAGxB,IAAIgvB,EAAUhvB,EAAM,GAAI0c,cAAgB1c,EAAK9E,MAAO,GACnD4B,EAAI4xB,GAAYzwB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO0uB,GAAa5xB,GAAMkyB,KACbL,GACZ,OAAO3uB,EAeoBivB,CAAgBjvB,IAAUA,GAIxD,IAKCkvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAE7B,SAAU,WAAY8B,WAAY,SAAUlQ,QAAS,SACjEmQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBlwB,EAAOuC,EAAO4tB,GAIzC,IAAI/tB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKgvB,IAAK,EAAGhuB,EAAS,IAAQ+tB,GAAY,KAAU/tB,EAAS,IAAO,MACpEG,EAGF,SAAS8tB,GAAoB5wB,EAAM6wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAInzB,EAAkB,UAAd+yB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQjzB,EAAI,EAAGA,GAAK,EAGN,WAARgzB,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM8wB,EAAMjR,GAAW/hB,IAAK,EAAMkzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,IAIjD,WAARF,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,MAtBvEG,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,GAGhD,YAARF,EACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,GAItEE,GAASvyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASxvB,KAAKgvB,IAAK,EAAGhvB,KAAKyvB,KAC1BpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE+0B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBrxB,EAAM6wB,EAAWK,GAG3C,IAAIF,EAASpE,GAAW5sB,GAKvB+wB,IADmB/zB,EAAQgyB,qBAAuBkC,IAEE,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCM,EAAmBP,EAEnBhzB,EAAMmvB,GAAQltB,EAAM6wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,GAIzE,GAAKywB,GAAUvjB,KAAMrL,GAAQ,CAC5B,IAAMmzB,EACL,OAAOnzB,EAERA,EAAM,OAyCP,QAlCQf,EAAQgyB,qBAAuB+B,IAMrC/zB,EAAQoyB,wBAA0BpnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC6wB,WAAY7wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOgxB,KAG1DhxB,EAAKwxB,iBAAiBvyB,SAEtB8xB,EAAiE,eAAnDpyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,IAKpDM,EAAmBC,KAAcvxB,KAEhCjC,EAAMiC,EAAMuxB,MAKdxzB,EAAM6wB,WAAY7wB,IAAS,GAI1B6yB,GACC5wB,EACA6wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAjzB,GAEE,KA+SL,SAAS0zB,GAAOzxB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GACzC,OAAO,IAAID,GAAMvyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GA7S5D/yB,EAAOmC,OAAQ,CAId6wB,SAAU,CACTC,QAAS,CACRtyB,IAAK,SAAUU,EAAMmtB,GACpB,GAAKA,EAAW,CAGf,IAAIztB,EAAMwtB,GAAQltB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACV+Q,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV7P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOouB,GAGnC,GAAMlxB,GAA0B,IAAlBA,EAAK7C,UAAoC,IAAlB6C,EAAK7C,UAAmB6C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd4T,EAAWpV,EAAW3c,GACtBgyB,EAAe7C,GAAY/mB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM8S,IACLhyB,EAAO6uB,GAAekD,IAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,QAGrCtxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOkxB,IAEzBxxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB01B,IAC1BlwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWiS,GAAa,GAAK,OAI7D/1B,EAAQ+xB,iBAA6B,KAAVjsB,GAAiD,IAAjC9B,EAAKvE,QAAS,gBAC9DyjB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOouB,MAE7B8B,EACJ9S,EAAM+S,YAAajyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMkwB,EAAOF,GACjC,IAAIjzB,EAAKwB,EAAK4f,EACb4T,EAAWpV,EAAW3c,GA6BvB,OA5BgBmvB,GAAY/mB,KAAMpI,KAMjCA,EAAO6uB,GAAekD,KAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,KAGtC,QAAS5T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMkxB,SAIjBzvB,IAAR1D,IACJA,EAAMmvB,GAAQltB,EAAMgB,EAAMgwB,IAId,WAARjzB,GAAoBiD,KAAQsvB,KAChCvyB,EAAMuyB,GAAoBtvB,IAIZ,KAAVkwB,GAAgBA,GACpB3xB,EAAMqvB,WAAY7wB,IACD,IAAVmzB,GAAkBgC,SAAU3zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI0tB,GACjDlyB,EAAOgzB,SAAUd,GAAc,CAC9BvxB,IAAK,SAAUU,EAAMmtB,EAAU+D,GAC9B,GAAK/D,EAIJ,OAAO+C,GAAa9mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKwxB,iBAAiBvyB,QAAWe,EAAKmzB,wBAAwB/F,MAIhEiE,GAAkBrxB,EAAM6wB,EAAWK,GAHnCnE,GAAM/sB,EAAMowB,GAAS,WACpB,OAAOiB,GAAkBrxB,EAAM6wB,EAAWK,MAM/C/S,IAAK,SAAUne,EAAM8C,EAAOouB,GAC3B,IAAIvuB,EACHquB,EAASpE,GAAW5sB,GAIpBozB,GAAsBp2B,EAAQmyB,iBACT,aAApB6B,EAAOzC,SAIRwC,GADkBqC,GAAsBlC,IAEY,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCN,EAAWQ,EACVN,GACC5wB,EACA6wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAY/uB,KAAKyvB,KAChBpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE0yB,WAAYoC,EAAQH,IACpBD,GAAoB5wB,EAAM6wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAc/tB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO2Q,GAAc/tB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM6wB,IAGpBJ,GAAmBzwB,EAAM8C,EAAO4tB,OAK1C/xB,EAAOgzB,SAASxD,WAAaV,GAAczwB,EAAQkyB,mBAClD,SAAUlvB,EAAMmtB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQltB,EAAM,gBAClCA,EAAKmzB,wBAAwBE,KAC5BtG,GAAM/sB,EAAM,CAAEmuB,WAAY,GAAK,WAC9B,OAAOnuB,EAAKmzB,wBAAwBE,QAElC,OAMR10B,EAAOkB,KAAM,CACZyzB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB/0B,EAAOgzB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU7wB,GAOjB,IANA,IAAIhF,EAAI,EACP81B,EAAW,GAGXC,EAAyB,iBAAV/wB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd81B,EAAUH,EAAS5T,GAAW/hB,GAAM41B,GACnCG,EAAO/1B,IAAO+1B,EAAO/1B,EAAI,IAAO+1B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ90B,EAAOgzB,SAAU8B,EAASC,GAASvV,IAAMsS,MAI3C9xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAMgB,EAAM8B,GAC1C,IAAIkuB,EAAQvwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAgwB,EAASpE,GAAW5sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOkzB,GAGxD,OAAOjxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO8yB,MAAQA,IAETvyB,UAAY,CACjBE,YAAaqyB,GACb1yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,EAAQ7Q,GACjDjlB,KAAKoE,KAAOA,EACZpE,KAAKyiB,KAAOA,EACZziB,KAAK81B,OAASA,GAAU/yB,EAAO+yB,OAAOrP,SACtCzmB,KAAKmF,QAAUA,EACfnF,KAAKiU,MAAQjU,KAAKosB,IAAMpsB,KAAK6O,MAC7B7O,KAAK+E,IAAMA,EACX/E,KAAKilB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK1D,MACX61B,GAAMqC,UAAUzR,SAAS/iB,IAAK1D,OAEhCm4B,IAAK,SAAUC,GACd,IAAIC,EACH9U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAoB/B,OAlBKziB,KAAKmF,QAAQmzB,SACjBt4B,KAAKu4B,IAAMF,EAAQt1B,EAAO+yB,OAAQ91B,KAAK81B,QACtCsC,EAASp4B,KAAKmF,QAAQmzB,SAAWF,EAAS,EAAG,EAAGp4B,KAAKmF,QAAQmzB,UAG9Dt4B,KAAKu4B,IAAMF,EAAQD,EAEpBp4B,KAAKosB,KAAQpsB,KAAK+E,IAAM/E,KAAKiU,OAAUokB,EAAQr4B,KAAKiU,MAE/CjU,KAAKmF,QAAQqzB,MACjBx4B,KAAKmF,QAAQqzB,KAAK/3B,KAAMT,KAAKoE,KAAMpE,KAAKosB,IAAKpsB,MAGzCujB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKviB,MAEX61B,GAAMqC,UAAUzR,SAASlE,IAAKviB,MAExBA,QAIOmD,KAAKG,UAAYuyB,GAAMvyB,WAEvCuyB,GAAMqC,UAAY,CACjBzR,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK7C,UACa,MAA5BojB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAC1B1f,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK7C,WACrBwB,EAAOgzB,SAAUpR,EAAMlC,OAC4B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO2P,GAAetP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,IAFjCrpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMyH,IAAMzH,EAAMM,UAU5CyT,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDpW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK7C,UAAYojB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,OAKpCrpB,EAAO+yB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM9yB,KAAKgzB,IAAKF,EAAI9yB,KAAKizB,IAAO,GAExCvS,SAAU,SAGX1jB,EAAO01B,GAAK5C,GAAMvyB,UAAUH,KAG5BJ,EAAO01B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAkrBHvoB,GAEHwoB,GAnrBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBt5B,EAAS25B,QAAoBx5B,EAAOy5B,sBACxCz5B,EAAOy5B,sBAAuBF,IAE9Bv5B,EAAO8f,WAAYyZ,GAAUv2B,EAAO01B,GAAGgB,UAGxC12B,EAAO01B,GAAGiB,QAKZ,SAASC,KAIR,OAHA55B,EAAO8f,WAAY,WAClBoZ,QAAQpzB,IAEAozB,GAAQxwB,KAAK2jB,MAIvB,SAASwN,GAAOl4B,EAAMm4B,GACrB,IAAI5L,EACH/rB,EAAI,EACJuM,EAAQ,CAAEmlB,OAAQlyB,GAKnB,IADAm4B,EAAeA,EAAe,EAAI,EAC1B33B,EAAI,EAAGA,GAAK,EAAI23B,EAEvBprB,EAAO,UADPwf,EAAQhK,GAAW/hB,KACSuM,EAAO,UAAYwf,GAAUvsB,EAO1D,OAJKm4B,IACJprB,EAAMunB,QAAUvnB,EAAM+iB,MAAQ9vB,GAGxB+M,EAGR,SAASqrB,GAAa5yB,EAAOub,EAAMsX,GAKlC,IAJA,IAAIpV,EACHyK,GAAe4K,GAAUC,SAAUxX,IAAU,IAAK/hB,OAAQs5B,GAAUC,SAAU,MAC9E5e,EAAQ,EACRhY,EAAS+rB,EAAW/rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQyK,EAAY/T,GAAQ5a,KAAMs5B,EAAWtX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASqV,GAAW51B,EAAM81B,EAAY/0B,GACrC,IAAImO,EACH6mB,EACA9e,EAAQ,EACRhY,EAAS22B,GAAUI,WAAW/2B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bub,EAAKt1B,OAEbs1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B1Z,EAAYla,KAAKgvB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHnY,EAAY8Z,EAAUzB,UAAY,GAEzCjd,EAAQ,EACRhY,EAAS02B,EAAUQ,OAAOl3B,OAEnBgY,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAKC,GAMhC,OAHAha,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW3B,EAASnY,IAG5CmY,EAAU,GAAK/0B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAI5C3b,EAASmB,YAAanb,EAAM,CAAE21B,KACvB,IAERA,EAAY3b,EAASzB,QAAS,CAC7BvY,KAAMA,EACN2nB,MAAOhpB,EAAOmC,OAAQ,GAAIg1B,GAC1BM,KAAMz3B,EAAOmC,QAAQ,EAAM,CAC1Bu1B,cAAe,GACf3E,OAAQ/yB,EAAO+yB,OAAOrP,UACpBthB,GACHu1B,mBAAoBR,EACpBS,gBAAiBx1B,EACjBm1B,UAAWrB,IAASU,KACpBrB,SAAUnzB,EAAQmzB,SAClBiC,OAAQ,GACRT,YAAa,SAAUrX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO8yB,MAAOzxB,EAAM21B,EAAUS,KAAM/X,EAAM1d,EACpDg1B,EAAUS,KAAKC,cAAehY,IAAUsX,EAAUS,KAAK1E,QAEzD,OADAiE,EAAUQ,OAAO35B,KAAM+jB,GAChBA,GAERlB,KAAM,SAAUmX,GACf,IAAIvf,EAAQ,EAIXhY,EAASu3B,EAAUb,EAAUQ,OAAOl3B,OAAS,EAC9C,GAAK82B,EACJ,OAAOn6B,KAGR,IADAm6B,GAAU,EACF9e,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAK,GAUhC,OANKyC,GACJxc,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAC3C3b,EAASmB,YAAanb,EAAM,CAAE21B,EAAWa,KAEzCxc,EAASuB,WAAYvb,EAAM,CAAE21B,EAAWa,IAElC56B,QAGT+rB,EAAQgO,EAAUhO,MAInB,KA/HD,SAAqBA,EAAO0O,GAC3B,IAAIpf,EAAOjW,EAAM0wB,EAAQ5uB,EAAOqc,EAGhC,IAAMlI,KAAS0Q,EAed,GAbA+J,EAAS2E,EADTr1B,EAAO2c,EAAW1G,IAElBnU,EAAQ6kB,EAAO1Q,GACV1V,MAAMC,QAASsB,KACnB4uB,EAAS5uB,EAAO,GAChBA,EAAQ6kB,EAAO1Q,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACd2mB,EAAO3mB,GAAS8B,SACT6kB,EAAO1Q,KAGfkI,EAAQxgB,EAAOgzB,SAAU3wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMwU,OAAQ7wB,UACf6kB,EAAO3mB,GAIC8B,EACNmU,KAAS0Q,IAChBA,EAAO1Q,GAAUnU,EAAOmU,GACxBof,EAAepf,GAAUya,QAI3B2E,EAAer1B,GAAS0wB,EA6F1B+E,CAAY9O,EAAOgO,EAAUS,KAAKC,eAE1Bpf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS0mB,GAAUI,WAAY/e,GAAQ5a,KAAMs5B,EAAW31B,EAAM2nB,EAAOgO,EAAUS,MAM9E,OAJKn5B,EAAYiS,EAAOmQ,QACvB1gB,EAAOygB,YAAauW,EAAU31B,KAAM21B,EAAUS,KAAKld,OAAQmG,KAC1DnQ,EAAOmQ,KAAKqX,KAAMxnB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK4nB,EAAO+N,GAAaC,GAE3B14B,EAAY04B,EAAUS,KAAKvmB,QAC/B8lB,EAAUS,KAAKvmB,MAAMxT,KAAM2D,EAAM21B,GAIlCA,EACEpb,SAAUob,EAAUS,KAAK7b,UACzB/V,KAAMmxB,EAAUS,KAAK5xB,KAAMmxB,EAAUS,KAAKO,UAC1Cne,KAAMmd,EAAUS,KAAK5d,MACrBuB,OAAQ4b,EAAUS,KAAKrc,QAEzBpb,EAAO01B,GAAGuC,MACTj4B,EAAOmC,OAAQw0B,EAAM,CACpBt1B,KAAMA,EACN62B,KAAMlB,EACNzc,MAAOyc,EAAUS,KAAKld,SAIjByc,EAGRh3B,EAAOi3B,UAAYj3B,EAAOmC,OAAQ80B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAUzY,EAAMvb,GACtB,IAAIyd,EAAQ3kB,KAAK85B,YAAarX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITwW,QAAS,SAAUpP,EAAO7nB,GACpB7C,EAAY0qB,IAChB7nB,EAAW6nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMlf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAAS0oB,EAAM1oB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOsJ,EAAO1Q,GACd2e,GAAUC,SAAUxX,GAASuX,GAAUC,SAAUxX,IAAU,GAC3DuX,GAAUC,SAAUxX,GAAO9Q,QAASzN,IAItCk2B,WAAY,CA3Wb,SAA2Bh2B,EAAM2nB,EAAOyO,GACvC,IAAI/X,EAAMvb,EAAOwe,EAAQnC,EAAO6X,EAASC,EAAWC,EAAgB/W,EACnEgX,EAAQ,UAAWxP,GAAS,WAAYA,EACxCkP,EAAOj7B,KACPuuB,EAAO,GACPjK,EAAQlgB,EAAKkgB,MACbiV,EAASn1B,EAAK7C,UAAY8iB,GAAoBjgB,GAC9Co3B,EAAW7Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BA+X,EAAKld,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBq3B,WACVlY,EAAMkY,SAAW,EACjBL,EAAU7X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMkY,UACXL,MAIH7X,EAAMkY,WAENR,EAAK9c,OAAQ,WAGZ8c,EAAK9c,OAAQ,WACZoF,EAAMkY,WACA14B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFuO,EAEb,GADA7kB,EAAQ6kB,EAAOtJ,GACV2W,GAAS5rB,KAAMtG,GAAU,CAG7B,UAFO6kB,EAAOtJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYqyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVryB,IAAoBs0B,QAAiC31B,IAArB21B,EAAU/Y,GAK9C,SAJA8W,GAAS,EAOXhL,EAAM9L,GAAS+Y,GAAYA,EAAU/Y,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA4Y,GAAat4B,EAAOyD,cAAeulB,MAChBhpB,EAAOyD,cAAe+nB,GA8DzC,IAAM9L,KAzDD8Y,GAA2B,IAAlBn3B,EAAK7C,WAMlBi5B,EAAKkB,SAAW,CAAEpX,EAAMoX,SAAUpX,EAAMqX,UAAWrX,EAAMsX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASjX,WAErC+W,EAAiB3Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBk3B,EACJ/W,EAAU+W,GAIVjW,GAAU,CAAEjhB,IAAQ,GACpBk3B,EAAiBl3B,EAAKkgB,MAAMC,SAAW+W,EACvC/W,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlB+W,IACrB,SAAhCv4B,EAAOyhB,IAAKpgB,EAAM,WAGhBi3B,IACLJ,EAAKryB,KAAM,WACV0b,EAAMC,QAAU+W,IAEM,MAAlBA,IACJ/W,EAAUD,EAAMC,QAChB+W,EAA6B,SAAZ/W,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdiW,EAAKkB,WACTpX,EAAMoX,SAAW,SACjBT,EAAK9c,OAAQ,WACZmG,EAAMoX,SAAWlB,EAAKkB,SAAU,GAChCpX,EAAMqX,UAAYnB,EAAKkB,SAAU,GACjCpX,EAAMsX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACE9M,EAGP8M,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW7Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAAS+W,IAInD5V,IACJ8V,EAASjC,QAAUA,GAIfA,GACJlU,GAAU,CAAEjhB,IAAQ,GAKrB62B,EAAKryB,KAAM,WASV,IAAM6Z,KAJA8W,GACLlU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTmqB,EACbxrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM8L,EAAM9L,OAMnC4Y,EAAYvB,GAAaP,EAASiC,EAAU/Y,GAAS,EAAGA,EAAMwY,GACtDxY,KAAQ+Y,IACfA,EAAU/Y,GAAS4Y,EAAUpnB,MACxBslB,IACJ8B,EAAUt2B,IAAMs2B,EAAUpnB,MAC1BonB,EAAUpnB,MAAQ,MAuMrB4nB,UAAW,SAAU33B,EAAUisB,GACzBA,EACJ6J,GAAUI,WAAWzoB,QAASzN,GAE9B81B,GAAUI,WAAWx5B,KAAMsD,MAK9BnB,EAAO+4B,MAAQ,SAAUA,EAAOhG,EAAQ5yB,GACvC,IAAIi2B,EAAM2C,GAA0B,iBAAVA,EAAqB/4B,EAAOmC,OAAQ,GAAI42B,GAAU,CAC3Ef,SAAU73B,IAAOA,GAAM4yB,GACtBz0B,EAAYy6B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ5yB,GAAM4yB,GAAUA,IAAWz0B,EAAYy0B,IAAYA,GAoC5D,OAhCK/yB,EAAO01B,GAAG/P,IACdyQ,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYv1B,EAAO01B,GAAGsD,OAC9B5C,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAOtV,UAMjB,MAAb0S,EAAI7b,QAA+B,IAAd6b,EAAI7b,QAC7B6b,EAAI7b,MAAQ,MAIb6b,EAAI/H,IAAM+H,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT15B,EAAY83B,EAAI/H,MACpB+H,EAAI/H,IAAI3wB,KAAMT,MAGVm5B,EAAI7b,OACRva,EAAOsgB,QAASrjB,KAAMm5B,EAAI7b,QAIrB6b,GAGRp2B,EAAOG,GAAGgC,OAAQ,CACjB82B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ5xB,GAGpC,OAAOlE,KAAKqQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMm3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ5xB,IAElDg4B,QAAS,SAAUzZ,EAAMqZ,EAAOhG,EAAQ5xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC0Z,EAASp5B,EAAO+4B,MAAOA,EAAOhG,EAAQ5xB,GACtCk4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWh6B,KAAM+C,EAAOmC,OAAQ,GAAIud,GAAQ0Z,IAGlDtmB,GAAS8M,EAASjf,IAAK1D,KAAM,YACjCi7B,EAAKxX,MAAM,IAKd,OAFC2Y,EAAYC,OAASD,EAEfvmB,IAA0B,IAAjBsmB,EAAO7e,MACtBtd,KAAKiE,KAAMm4B,GACXp8B,KAAKsd,MAAO6e,EAAO7e,MAAO8e,IAE5B3Y,KAAM,SAAU/hB,EAAMiiB,EAAYiX,GACjC,IAAI0B,EAAY,SAAU/Y,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMmX,IAYP,MATqB,iBAATl5B,IACXk5B,EAAUjX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ3jB,KAAKsd,MAAO5b,GAAQ,KAAM,IAGpB1B,KAAKiE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B66B,EAASx5B,EAAOw5B,OAChB/Z,EAAOG,EAASjf,IAAK1D,MAEtB,GAAKqb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC6Y,EAAW9Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ4V,GAAK7rB,KAAM6N,IACtDihB,EAAW9Z,EAAMnH,IAKpB,IAAMA,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MACnB,MAAR0B,GAAgB66B,EAAQlhB,GAAQiC,QAAU5b,IAE5C66B,EAAQlhB,GAAQ4f,KAAKxX,KAAMmX,GAC3BvX,GAAU,EACVkZ,EAAOt3B,OAAQoW,EAAO,KAOnBgI,GAAYuX,GAChB73B,EAAOsgB,QAASrjB,KAAM0B,MAIzB26B,OAAQ,SAAU36B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET1B,KAAKiE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK1D,MACrBsd,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB66B,EAASx5B,EAAOw5B,OAChBl5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK6Z,QAAS,EAGdt5B,EAAOua,MAAOtd,KAAM0B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKhjB,KAAMT,MAAM,GAIlBqb,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MAAQu8B,EAAQlhB,GAAQiC,QAAU5b,IAC/D66B,EAAQlhB,GAAQ4f,KAAKxX,MAAM,GAC3B8Y,EAAOt3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQghB,QACrC/e,EAAOjC,GAAQghB,OAAO57B,KAAMT,aAKvBwiB,EAAK6Z,YAKft5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIo3B,EAAQz5B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAgB,MAAT43B,GAAkC,kBAAVA,EAC9BU,EAAM77B,MAAOX,KAAMqE,WACnBrE,KAAKk8B,QAAStC,GAAOx0B,GAAM,GAAQ02B,EAAOhG,EAAQ5xB,MAKrDnB,EAAOkB,KAAM,CACZw4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU5wB,EAAM2mB,GAClBhpB,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAOlE,KAAKk8B,QAASnQ,EAAO+P,EAAOhG,EAAQ5xB,MAI7CnB,EAAOw5B,OAAS,GAChBx5B,EAAO01B,GAAGiB,KAAO,WAChB,IAAIsB,EACH94B,EAAI,EACJq6B,EAASx5B,EAAOw5B,OAIjB,IAFAtD,GAAQxwB,KAAK2jB,MAELlqB,EAAIq6B,EAAOl5B,OAAQnB,KAC1B84B,EAAQuB,EAAQr6B,OAGCq6B,EAAQr6B,KAAQ84B,GAChCuB,EAAOt3B,OAAQ/C,IAAK,GAIhBq6B,EAAOl5B,QACZN,EAAO01B,GAAGhV,OAEXwV,QAAQpzB,GAGT9C,EAAO01B,GAAGuC,MAAQ,SAAUA,GAC3Bj4B,EAAOw5B,OAAO37B,KAAMo6B,GACpBj4B,EAAO01B,GAAGxkB,SAGXlR,EAAO01B,GAAGgB,SAAW,GACrB12B,EAAO01B,GAAGxkB,MAAQ,WACZilB,KAILA,IAAa,EACbI,OAGDv2B,EAAO01B,GAAGhV,KAAO,WAChByV,GAAa,MAGdn2B,EAAO01B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNvW,SAAU,KAMX1jB,EAAOG,GAAG+5B,MAAQ,SAAUC,EAAMx7B,GAIjC,OAHAw7B,EAAOn6B,EAAO01B,IAAK11B,EAAO01B,GAAGsD,OAAQmB,IAAiBA,EACtDx7B,EAAOA,GAAQ,KAER1B,KAAKsd,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI4Z,EAAUp9B,EAAO8f,WAAYvT,EAAM4wB,GACvC3Z,EAAME,KAAO,WACZ1jB,EAAOq9B,aAAcD,OAOnBxsB,GAAQ/Q,EAASyC,cAAe,SAEnC82B,GADSv5B,EAASyC,cAAe,UACpBK,YAAa9C,EAASyC,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbN,EAAQi8B,QAA0B,KAAhB1sB,GAAMzJ,MAIxB9F,EAAQk8B,YAAcnE,GAAIxjB,UAI1BhF,GAAQ/Q,EAASyC,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbN,EAAQm8B,WAA6B,MAAhB5sB,GAAMzJ,MAI5B,IAAIs2B,GACH7uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Do6B,WAAY,SAAUr4B,GACrB,OAAOpF,KAAKiE,KAAM,WACjBlB,EAAO06B,WAAYz9B,KAAMoF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBt5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVw2B,GAAgB36B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO46B,UAAWv4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASo4B,QAAW33B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO06B,WAAYr5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC65B,UAAW,CACVj8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM9F,EAAQm8B,YAAwB,UAAVr2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXu2B,WAAY,SAAUr5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ07B,EAAY12B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK2hB,GAA+B,IAAlBx5B,EAAK7C,SACtB,MAAU6D,EAAOw4B,EAAW17B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bo4B,GAAW,CACVjb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO06B,WAAYr5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAIy4B,EAASlvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAKimB,EACR+T,EAAgB14B,EAAKoC,cAYtB,OAVMI,IAGLmiB,EAASpb,GAAYmvB,GACrBnvB,GAAYmvB,GAAkBh6B,EAC9BA,EAAqC,MAA/B+5B,EAAQz5B,EAAMgB,EAAMwC,GACzBk2B,EACA,KACDnvB,GAAYmvB,GAAkB/T,GAExBjmB,KAOT,IAAIi6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkB/2B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASswB,GAAU95B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS47B,GAAgBj3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1D+6B,WAAY,SAAUh5B,GACrB,OAAOpF,KAAKiE,KAAM,kBACVjE,KAAM+C,EAAOs7B,QAASj5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB36B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOs7B,QAASj5B,IAAUA,EACjCme,EAAQxgB,EAAOm1B,UAAW9yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd8yB,UAAW,CACV1iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIk6B,EAAWv7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKk6B,EACGzK,SAAUyK,EAAU,IAI3BP,GAAWvwB,KAAMpJ,EAAKgI,WACtB4xB,GAAWxwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX8oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLp9B,EAAQk8B,cACbv6B,EAAOm1B,UAAUviB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOs7B,QAASr+B,KAAKwH,eAAkBxH,OA4BxC+C,EAAOG,GAAGgC,OAAQ,CACjBu5B,SAAU,SAAUv3B,GACnB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAOy+B,SAAUv3B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAM1D,IAFA0+B,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAItB,GAHAy8B,EAAWT,GAAU95B,GACrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KACrB+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAAQ,IACvC/vB,GAAO+vB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR8+B,YAAa,SAAU53B,GACtB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAO8+B,YAAa53B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAI7D,IAAMqE,UAAUhB,OACf,OAAOrD,KAAK8R,KAAM,QAAS,IAK5B,IAFA4sB,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAMtB,GALAy8B,EAAWT,GAAU95B,GAGrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KAG1B,OAA4C,EAApC+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAClC/vB,EAAMA,EAAI5I,QAAS,IAAM24B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR++B,YAAa,SAAU73B,EAAO83B,GAC7B,IAAIt9B,SAAcwF,EACjB+3B,EAAwB,WAATv9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb83B,GAA0BC,EAC9BD,EAAWh/B,KAAKy+B,SAAUv3B,GAAUlH,KAAK8+B,YAAa53B,GAGzD7F,EAAY6F,GACTlH,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAO++B,YACd73B,EAAMzG,KAAMT,KAAMkC,EAAGg8B,GAAUl+B,MAAQg/B,GACvCA,KAKIh/B,KAAKiE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM0kB,EAExB,GAAKD,EAAe,CAGnB/8B,EAAI,EACJsY,EAAOzX,EAAQ/C,MACfk/B,EAAaf,GAAgBj3B,GAE7B,MAAU+I,EAAYivB,EAAYh9B,KAG5BsY,EAAK2kB,SAAUlvB,GACnBuK,EAAKskB,YAAa7uB,GAElBuK,EAAKikB,SAAUxuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYiuB,GAAUl+B,QAIrB2iB,EAASJ,IAAKviB,KAAM,gBAAiBiQ,GAOjCjQ,KAAKwC,cACTxC,KAAKwC,aAAc,QAClByN,IAAuB,IAAV/I,EACb,GACAyb,EAASjf,IAAK1D,KAAM,kBAAqB,QAO9Cm/B,SAAU,SAAUn8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOpE,KAAMkC,KACtB,GAAuB,IAAlBkC,EAAK7C,WACoE,GAA3E,IAAM08B,GAAkBC,GAAU95B,IAAW,KAAMvD,QAASoP,GAC7D,OAAO,EAIV,OAAO,KAOT,IAAImvB,GAAU,MAEdr8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKyrB,EACfnrB,EAAOpE,KAAM,GAEd,OAAMqE,UAAUhB,QA0BhBksB,EAAkBluB,EAAY6F,GAEvBlH,KAAKiE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBnC,KAAKuB,WAWE,OANXY,EADIotB,EACEroB,EAAMzG,KAAMT,KAAMkC,EAAGa,EAAQ/C,MAAOmC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOs8B,SAAUr/B,KAAK0B,OAAUqB,EAAOs8B,SAAUr/B,KAAKoM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKviB,KAAMmC,EAAK,WAC3DnC,KAAKkH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOs8B,SAAUj7B,EAAK1C,OAC7BqB,EAAOs8B,SAAUj7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASm5B,GAAS,IAIhB,MAAPt7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdm6B,SAAU,CACTlZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA87B,GAAkBl7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACb2S,EAAoB,eAAdnkB,EAAK1C,KACX6jB,EAASgD,EAAM,KAAO,GACtBwM,EAAMxM,EAAMlN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR0Z,EAGAxM,EAAMlN,EAAQ,EAIXnZ,EAAI6yB,EAAK7yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBomB,EACJ,OAAOrhB,EAIRqe,EAAO3kB,KAAMsG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIo4B,EAAWnZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOs8B,SAASlZ,OAAOziB,IAAKyiB,GAAUZ,MAEtD+Z,GAAY,GAUd,OAHMA,IACLl7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOs8B,SAAUr/B,MAAS,CACzBuiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D9F,EAAQi8B,UACbt6B,EAAOs8B,SAAUr/B,MAAO0D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D9F,EAAQm+B,QAAU,cAAex/B,EAGjC,IAAIy/B,GAAc,kCACjBC,GAA0B,SAAUjzB,GACnCA,EAAEwc,mBAGJjmB,EAAOmC,OAAQnC,EAAO0lB,MAAO,CAE5BU,QAAS,SAAUV,EAAOjG,EAAMpe,EAAMs7B,GAErC,IAAIx9B,EAAG2M,EAAK6B,EAAKivB,EAAYC,EAAQ7V,EAAQ7K,EAAS2gB,EACrDC,EAAY,CAAE17B,GAAQxE,GACtB8B,EAAOV,EAAOP,KAAMgoB,EAAO,QAAWA,EAAM/mB,KAAO+mB,EACnDkB,EAAa3oB,EAAOP,KAAMgoB,EAAO,aAAgBA,EAAMjZ,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMgxB,EAAcnvB,EAAMtM,EAAOA,GAAQxE,EAGlB,IAAlBwE,EAAK7C,UAAoC,IAAlB6C,EAAK7C,WAK5Bi+B,GAAYhyB,KAAM9L,EAAOqB,EAAO0lB,MAAMuB,cAIf,EAAvBtoB,EAAKb,QAAS,OAIlBa,GADAioB,EAAajoB,EAAK4F,MAAO,MACP8G,QAClBub,EAAW3kB,QAEZ46B,EAASl+B,EAAKb,QAAS,KAAQ,GAAK,KAAOa,GAG3C+mB,EAAQA,EAAO1lB,EAAO+C,SACrB2iB,EACA,IAAI1lB,EAAOqmB,MAAO1nB,EAAuB,iBAAV+mB,GAAsBA,IAGhDK,UAAY4W,EAAe,EAAI,EACrCjX,EAAMjZ,UAAYma,EAAW/b,KAAM,KACnC6a,EAAMwC,WAAaxC,EAAMjZ,UACxB,IAAI1F,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAC7D,KAGD6a,EAAMnV,YAASzN,EACT4iB,EAAMjjB,SACXijB,EAAMjjB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAEiG,GACF1lB,EAAO2D,UAAW8b,EAAM,CAAEiG,IAG3BvJ,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GACpCg+B,IAAgBxgB,EAAQiK,UAAmD,IAAxCjK,EAAQiK,QAAQxoB,MAAOyD,EAAMoe,IAAtE,CAMA,IAAMkd,IAAiBxgB,EAAQyM,WAAanqB,EAAU4C,GAAS,CAM9D,IAJAu7B,EAAazgB,EAAQ6J,cAAgBrnB,EAC/B89B,GAAYhyB,KAAMmyB,EAAaj+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBm9B,EAAUl/B,KAAMiO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBrN,IACpCkgC,EAAUl/B,KAAM8P,EAAIb,aAAea,EAAIqvB,cAAgBhgC,GAKzDmC,EAAI,EACJ,OAAU2M,EAAMixB,EAAW59B,QAAYumB,EAAMqC,uBAC5C+U,EAAchxB,EACd4Z,EAAM/mB,KAAW,EAAJQ,EACZy9B,EACAzgB,EAAQgL,UAAYxoB,GAGrBqoB,GACEpH,EAASjf,IAAKmL,EAAK,WAAczO,OAAO0pB,OAAQ,OAC9CrB,EAAM/mB,OACTihB,EAASjf,IAAKmL,EAAK,YAEnBkb,EAAOppB,MAAOkO,EAAK2T,IAIpBuH,EAAS6V,GAAU/wB,EAAK+wB,KACT7V,EAAOppB,OAASshB,EAAYpT,KAC1C4Z,EAAMnV,OAASyW,EAAOppB,MAAOkO,EAAK2T,IACZ,IAAjBiG,EAAMnV,QACVmV,EAAMS,kBA8CT,OA1CAT,EAAM/mB,KAAOA,EAGPg+B,GAAiBjX,EAAMuD,sBAEpB9M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS9lB,MAAOm/B,EAAUz2B,MAAOmZ,KACzCP,EAAY7d,IAIPw7B,GAAUv+B,EAAY+C,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMw7B,MAGXx7B,EAAMw7B,GAAW,MAIlB78B,EAAO0lB,MAAMuB,UAAYtoB,EAEpB+mB,EAAMqC,wBACV+U,EAAY9vB,iBAAkBrO,EAAM+9B,IAGrCr7B,EAAM1C,KAED+mB,EAAMqC,wBACV+U,EAAY/e,oBAAqBpf,EAAM+9B,IAGxC18B,EAAO0lB,MAAMuB,eAAYnkB,EAEpB6K,IACJtM,EAAMw7B,GAAWlvB,IAMd+X,EAAMnV,SAKd0sB,SAAU,SAAUt+B,EAAM0C,EAAMqkB,GAC/B,IAAIjc,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOqmB,MACXX,EACA,CACC/mB,KAAMA,EACN2qB,aAAa,IAIftpB,EAAO0lB,MAAMU,QAAS3c,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjBikB,QAAS,SAAUznB,EAAM8gB,GACxB,OAAOxiB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMxiB,SAGpCigC,eAAgB,SAAUv+B,EAAM8gB,GAC/B,IAAIpe,EAAOpE,KAAM,GACjB,GAAKoE,EACJ,OAAOrB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMpe,GAAM,MAc5ChD,EAAQm+B,SACbx8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAIjc,EAAU,SAAU+Z,GACvB1lB,EAAO0lB,MAAMuX,SAAUrV,EAAKlC,EAAMjjB,OAAQzC,EAAO0lB,MAAMkC,IAAKlC,KAG7D1lB,EAAO0lB,MAAMvJ,QAASyL,GAAQ,CAC7BP,MAAO,WAIN,IAAInoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAE5BuV,GACLj+B,EAAI8N,iBAAkBwe,EAAM7f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAK0oB,GAAOuV,GAAY,GAAM,IAEhD3V,SAAU,WACT,IAAItoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAAQ,EAEpCuV,EAKLvd,EAASxB,OAAQlf,EAAK0oB,EAAKuV,IAJ3Bj+B,EAAI6e,oBAAqByN,EAAM7f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAK0oB,QAS3B,IAAIzV,GAAWnV,EAAOmV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAK2jB,OAErB+T,GAAS,KAKbp9B,EAAOq9B,SAAW,SAAU5d,GAC3B,IAAI3O,EACJ,IAAM2O,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM9T,EAAOsgC,WAAcC,gBAAiB9d,EAAM,YACvD,MAAQhW,GACTqH,OAAMhO,EAMP,OAHMgO,IAAOA,EAAIxG,qBAAsB,eAAgBhK,QACtDN,EAAOoD,MAAO,gBAAkBqc,GAE1B3O,GAIR,IACC0sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa9I,EAAQv2B,EAAKs/B,EAAarlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAAStE,GAGnByB,EAAOkB,KAAM3C,EAAK,SAAUY,EAAGia,GACzBykB,GAAeL,GAAS/yB,KAAMqqB,GAGlCtc,EAAKsc,EAAQ1b,GAKbwkB,GACC9I,EAAS,KAAqB,iBAAN1b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACAykB,EACArlB,UAKG,GAAMqlB,GAAiC,WAAlB/9B,EAAQvB,GAUnCia,EAAKsc,EAAQv2B,QAPb,IAAM8D,KAAQ9D,EACbq/B,GAAa9I,EAAS,IAAMzyB,EAAO,IAAK9D,EAAK8D,GAAQw7B,EAAarlB,GAYrExY,EAAO89B,MAAQ,SAAU13B,EAAGy3B,GAC3B,IAAI/I,EACHiJ,EAAI,GACJvlB,EAAM,SAAUrN,EAAK6yB,GAGpB,IAAI75B,EAAQ7F,EAAY0/B,GACvBA,IACAA,EAEDD,EAAGA,EAAEz9B,QAAW29B,mBAAoB9yB,GAAQ,IAC3C8yB,mBAA6B,MAAT95B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKvb,KAAKoF,KAAMpF,KAAKkH,cAOtB,IAAM2wB,KAAU1uB,EACfw3B,GAAa9I,EAAQ1uB,EAAG0uB,GAAU+I,EAAarlB,GAKjD,OAAOulB,EAAElzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjB+7B,UAAW,WACV,OAAOl+B,EAAO89B,MAAO7gC,KAAKkhC,mBAE3BA,eAAgB,WACf,OAAOlhC,KAAKmE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAMziB,KAAM,YAClC,OAAO6R,EAAW9O,EAAO2D,UAAWmL,GAAa7R,OAEjDqQ,OAAQ,WACR,IAAI3O,EAAO1B,KAAK0B,KAGhB,OAAO1B,KAAKoF,OAASrC,EAAQ/C,MAAOia,GAAI,cACvCymB,GAAalzB,KAAMxN,KAAKoM,YAAeq0B,GAAgBjzB,KAAM9L,KAC3D1B,KAAK0V,UAAYkQ,GAAepY,KAAM9L,MAEzCyC,IAAK,SAAUoD,EAAInD,GACnB,IAAIjC,EAAMY,EAAQ/C,MAAOmC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAIhD,CAAEp7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAClD98B,SAKN,IACCy9B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZpH,GAAa,GAObqH,GAAa,GAGbC,GAAW,KAAKhhC,OAAQ,KAGxBihC,GAAe/hC,EAASyC,cAAe,KAIxC,SAASu/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoB9jB,GAED,iBAAvB8jB,IACX9jB,EAAO8jB,EACPA,EAAqB,KAGtB,IAAIC,EACH7/B,EAAI,EACJ8/B,EAAYF,EAAmBt6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK5a,EAAY2c,GAGhB,MAAU+jB,EAAWC,EAAW9/B,KAGR,MAAlB6/B,EAAU,IACdA,EAAWA,EAASzhC,MAAO,IAAO,KAChCuhC,EAAWE,GAAaF,EAAWE,IAAc,IAAKpwB,QAASqM,KAI/D6jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKnhC,KAAMod,IAQnE,SAASikB,GAA+BJ,EAAW18B,EAASw1B,EAAiBuH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAIpsB,EAcJ,OAbAwsB,EAAWJ,IAAa,EACxBh/B,EAAOkB,KAAM49B,EAAWE,IAAc,GAAI,SAAU/kB,EAAGslB,GACtD,IAAIC,EAAsBD,EAAoBn9B,EAASw1B,EAAiBuH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACDzsB,EAAW4sB,QADf,GAHNp9B,EAAQ68B,UAAUrwB,QAAS4wB,GAC3BF,EAASE,IACF,KAKF5sB,EAGR,OAAO0sB,EAASl9B,EAAQ68B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYh9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRg9B,EAAc1/B,EAAO2/B,aAAaD,aAAe,GAElD,IAAMv0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPu0B,EAAav0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/EPm8B,GAAapsB,KAAOL,GAASK,KAgP9BxS,EAAOmC,OAAQ,CAGdy9B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK5tB,GAASK,KACd7T,KAAM,MACNqhC,QAvRgB,4DAuRQv1B,KAAM0H,GAAS8tB,UACvCxjC,QAAQ,EACRyjC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRlI,IAAKwG,GACLp/B,KAAM,aACNktB,KAAM,YACN3b,IAAK,4BACLwvB,KAAM,qCAGPtoB,SAAU,CACTlH,IAAK,UACL2b,KAAM,SACN6T,KAAM,YAGPC,eAAgB,CACfzvB,IAAK,cACLvR,KAAM,eACN+gC,KAAM,gBAKPE,WAAY,CAGXC,SAAU/3B,OAGVg4B,aAAa,EAGbC,YAAa1gB,KAAKC,MAGlB0gB,WAAY5gC,EAAOq9B,UAOpBqC,YAAa,CACZK,KAAK,EACL7/B,SAAS,IAOX2gC,UAAW,SAAUp+B,EAAQq+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYh9B,EAAQzC,EAAO2/B,cAAgBmB,GAGvDrB,GAAYz/B,EAAO2/B,aAAcl9B,IAGnCs+B,cAAelC,GAA6BxH,IAC5C2J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK39B,GAGA,iBAAR29B,IACX39B,EAAU29B,EACVA,OAAMj9B,GAIPV,EAAUA,GAAW,GAErB,IAAI8+B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGAzjB,EAGA0jB,EAGAriC,EAGAsiC,EAGA1D,EAAI/9B,EAAO6gC,UAAW,GAAIz+B,GAG1Bs/B,EAAkB3D,EAAE79B,SAAW69B,EAG/B4D,EAAqB5D,EAAE79B,UACpBwhC,EAAgBljC,UAAYkjC,EAAgBlhC,QAC7CR,EAAQ0hC,GACR1hC,EAAO0lB,MAGTrK,EAAWrb,EAAOgb,WAClB4mB,EAAmB5hC,EAAO+Z,UAAW,eAGrC8nB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPjhB,WAAY,EAGZ+jB,kBAAmB,SAAU92B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMujB,EAAkB,CACvBA,EAAkB,GAClB,MAAUv3B,EAAQy0B,GAASp0B,KAAMi3B,GAChCC,EAAiBv3B,EAAO,GAAIrF,cAAgB,MACzC48B,EAAiBv3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD9G,OAAQmM,EAAO,IAGpBA,EAAQu3B,EAAiBl2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cq3B,sBAAuB,WACtB,OAAOpkB,EAAYsjB,EAAwB,MAI5Ce,iBAAkB,SAAU9/B,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO0/B,EAAqB1/B,EAAKoC,eAChCs9B,EAAqB1/B,EAAKoC,gBAAmBpC,EAC9Cy/B,EAAgBz/B,GAAS8B,GAEnBlH,MAIRmlC,iBAAkB,SAAUzjC,GAI3B,OAHkB,MAAbmf,IACJigB,EAAEsE,SAAW1jC,GAEP1B,MAIR4kC,WAAY,SAAUzgC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJqhB,EAAM/jB,OAAQha,EAAK+9B,EAAMmD,cAIzB,IAAMtjC,KAAQoC,EACbygC,EAAY7iC,GAAS,CAAE6iC,EAAY7iC,GAAQoC,EAAKpC,IAInD,OAAO/B,MAIRslC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB58B,EAAM,EAAG48B,GACFxlC,OAoBV,GAfAoe,EAASzB,QAASulB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO5tB,GAASK,MAAS,IAC5CtP,QAASu7B,GAAWtsB,GAAS8tB,SAAW,MAG1ClC,EAAEp/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQo/B,EAAEpkB,QAAUokB,EAAEp/B,KAGzDo/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMv6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB6kB,EAAE2E,YAAsB,CAC5BnB,EAAY1kC,EAASyC,cAAe,KAKpC,IACCiiC,EAAU/uB,KAAOurB,EAAEgC,IAInBwB,EAAU/uB,KAAO+uB,EAAU/uB,KAC3BurB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQl5B,GAITs0B,EAAE2E,aAAc,GAalB,GARK3E,EAAEte,MAAQse,EAAEmC,aAAiC,iBAAXnC,EAAEte,OACxCse,EAAEte,KAAOzf,EAAO89B,MAAOC,EAAEte,KAAMse,EAAEF,cAIlCqB,GAA+B7H,GAAY0G,EAAG37B,EAAS+8B,GAGlDrhB,EACJ,OAAOqhB,EA8ER,IAAMhgC,KAzENqiC,EAAcxhC,EAAO0lB,OAASqY,EAAEthC,SAGQ,GAApBuD,EAAO4/B,UAC1B5/B,EAAO0lB,MAAMU,QAAS,aAIvB2X,EAAEp/B,KAAOo/B,EAAEp/B,KAAKogB,cAGhBgf,EAAE6E,YAAcpE,GAAW/zB,KAAMszB,EAAEp/B,MAKnCwiC,EAAWpD,EAAEgC,IAAI78B,QAASm7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAEte,MAAQse,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKtiC,QAAS,uCACjCigC,EAAEte,KAAOse,EAAEte,KAAKvc,QAASk7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAIxiC,MAAO4jC,EAAS7gC,QAG5By9B,EAAEte,OAAUse,EAAEmC,aAAiC,iBAAXnC,EAAEte,QAC1C0hB,IAAc/D,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQpD,EAAEte,YAGjDse,EAAEte,OAIO,IAAZse,EAAE7yB,QACNi2B,EAAWA,EAASj+B,QAASo7B,GAAY,MACzCmD,GAAarE,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQ,KAAStiC,GAAMuF,OACnEq9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD7iC,EAAO6/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBniC,EAAO6/B,aAAcsB,IAE9DnhC,EAAO8/B,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBniC,EAAO8/B,KAAMqB,MAKnDpD,EAAEte,MAAQse,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBh+B,EAAQg+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBhjC,EAAG4+B,EAAE+E,QAAS3jC,IAIvC,GAAK4+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWrlC,KAAMgkC,EAAiBvC,EAAOpB,IAAiBjgB,GAG9D,OAAOqhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBppB,IAAKulB,EAAE/F,UACxBmH,EAAMt5B,KAAMk4B,EAAEiF,SACd7D,EAAMtlB,KAAMkkB,EAAE36B,OAGd89B,EAAYhC,GAA+BR,GAAYX,EAAG37B,EAAS+8B,GAK5D,CASN,GARAA,EAAMjhB,WAAa,EAGdsjB,GACJG,EAAmBvb,QAAS,WAAY,CAAE+Y,EAAOpB,IAI7CjgB,EACJ,OAAOqhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE3D,UACjBkH,EAAetkC,EAAO8f,WAAY,WACjCqiB,EAAMoD,MAAO,YACXxE,EAAE3D,UAGN,IACCtc,GAAY,EACZojB,EAAU+B,KAAMnB,EAAgBj8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAMy8B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS5/B,EAAOigC,EAAUC,EACxCd,EAAaU,EAGTplB,IAILA,GAAY,EAGPwjB,GACJtkC,EAAOq9B,aAAciH,GAKtBJ,OAAYp+B,EAGZs+B,EAAwB0B,GAAW,GAGnC3D,EAAMjhB,WAAsB,EAATokB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI5kC,EAAM6kC,EAAeC,EAC5BzrB,EAAW+lB,EAAE/lB,SACbinB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU5zB,aACEvI,IAAPygC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM5kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAM84B,GAAO,CACtDtE,EAAUrwB,QAASjQ,GACnB,MAMH,GAAKsgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMtgC,KAAQwkC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY7hC,EAAO,IAAMsgC,EAAW,IAAQ,CACrEuE,EAAgB7kC,EAChB,MAEK8kC,IACLA,EAAgB9kC,GAKlB6kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUrwB,QAAS40B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IAAwD,EAA3CpjC,EAAO6D,QAAS,SAAUk6B,EAAEkB,aAC9ClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA5iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMl2B,EAAKsK,EAC9BuoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU1hC,QAGzB,GAAK0hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKp/B,eAAkBs5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU5zB,QAGpB,MAAQu4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCprB,GAAQmrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtC/mB,EAAO2rB,EACPA,EAAU3E,EAAU5zB,QAKnB,GAAiB,MAAZu4B,EAEJA,EAAU3rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS2rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYvoB,EAAO,IAAM2rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA7yB,EAAMg2B,EAAMp/B,MAAO,MACT,KAAQq/B,IAGjBC,EAAOrD,EAAYvoB,EAAO,IAAMtK,EAAK,KACpC6yB,EAAY,KAAO7yB,EAAK,KACb,EAGG,IAATk2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUj2B,EAAK,GACfsxB,EAAUrwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATk2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ55B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAOygC,EAAOp6B,EAAI,sBAAwBwO,EAAO,OAAS2rB,IASjE,MAAO,CAAEzoB,MAAO,UAAWsE,KAAM4jB,GA+cpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCjiC,EAAO6/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCjiC,EAAO8/B,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEp/B,KACxB6jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASloB,MACtB6nB,EAAUK,EAAS5jB,KAEnB2jB,IADAhgC,EAAQigC,EAASjgC,UAMlBA,EAAQo/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJ/nB,EAASmB,YAAaklB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9D9jB,EAASuB,WAAY8kB,EAAiB,CAAEvC,EAAOqD,EAAYp/B,IAI5D+7B,EAAM0C,WAAYA,GAClBA,OAAa/+B,EAER0+B,GACJG,EAAmBvb,QAASgd,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU5/B,IAIpCw+B,EAAiB7mB,SAAU2mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmBvb,QAAS,eAAgB,CAAE+Y,EAAOpB,MAG3C/9B,EAAO4/B,QAChB5/B,EAAO0lB,MAAMU,QAAS,cAKzB,OAAO+Y,GAGR8E,QAAS,SAAUlE,EAAKtgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKo/B,EAAKtgB,EAAMte,EAAU,SAGzC+iC,UAAW,SAAUnE,EAAK5+B,GACzB,OAAOnB,EAAOW,IAAKo/B,OAAKj9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUomB,EAAKtgB,EAAMte,EAAUxC,GAUjD,OAPKL,EAAYmhB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOihC,KAAMjhC,EAAOmC,OAAQ,CAClC49B,IAAKA,EACLphC,KAAMgb,EACNqlB,SAAUrgC,EACV8gB,KAAMA,EACNujB,QAAS7hC,GACPnB,EAAO2C,cAAeo9B,IAASA,OAIpC//B,EAAO+gC,cAAe,SAAUhD,GAC/B,IAAI5+B,EACJ,IAAMA,KAAK4+B,EAAE+E,QACa,iBAApB3jC,EAAEsF,gBACNs5B,EAAEqC,YAAcrC,EAAE+E,QAAS3jC,IAAO,MAMrCa,EAAO0sB,SAAW,SAAUqT,EAAK39B,EAASlD,GACzC,OAAOc,EAAOihC,KAAM,CACnBlB,IAAKA,EAGLphC,KAAM,MACNqgC,SAAU,SACV9zB,OAAO,EACPi1B,OAAO,EACP1jC,QAAQ,EAKR+jC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBrjC,EAAO0D,WAAY2/B,EAAUjhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBiiC,QAAS,SAAU3X,GAClB,IAAIjI,EAyBJ,OAvBKvnB,KAAM,KACLqB,EAAYmuB,KAChBA,EAAOA,EAAK/uB,KAAMT,KAAM,KAIzBunB,EAAOxkB,EAAQysB,EAAMxvB,KAAM,GAAIiN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDvF,KAAM,GAAI2C,YACd4kB,EAAK6I,aAAcpwB,KAAM,IAG1BunB,EAAKpjB,IAAK,WACT,IAAIC,EAAOpE,KAEX,MAAQoE,EAAKgjC,kBACZhjC,EAAOA,EAAKgjC,kBAGb,OAAOhjC,IACJ8rB,OAAQlwB,OAGNA,MAGRqnC,UAAW,SAAU7X,GACpB,OAAKnuB,EAAYmuB,GACTxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOqnC,UAAW7X,EAAK/uB,KAAMT,KAAMkC,MAItClC,KAAKiE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQ/C,MAClB+a,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASosB,QAAS3X,GAGlBhV,EAAK0V,OAAQV,MAKhBjI,KAAM,SAAUiI,GACf,IAAI8X,EAAiBjmC,EAAYmuB,GAEjC,OAAOxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOmnC,QAASG,EAAiB9X,EAAK/uB,KAAMT,KAAMkC,GAAMstB,MAIlE+X,OAAQ,SAAUvkC,GAIjB,OAHAhD,KAAKkU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQ/C,MAAOuwB,YAAavwB,KAAKuM,cAE3BvM,QAKT+C,EAAO6O,KAAKhI,QAAQ2vB,OAAS,SAAUn1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ49B,QAASpjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ49B,QAAU,SAAUpjC,GACvC,SAAWA,EAAKyuB,aAAezuB,EAAKqjC,cAAgBrjC,EAAKwxB,iBAAiBvyB,SAM3EN,EAAO2/B,aAAagF,IAAM,WACzB,IACC,OAAO,IAAI3nC,EAAO4nC,eACjB,MAAQn7B,MAGX,IAAIo7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAehlC,EAAO2/B,aAAagF,MAEpCtmC,EAAQ4mC,OAASD,IAAkB,oBAAqBA,GACxD3mC,EAAQ4iC,KAAO+D,KAAiBA,GAEhChlC,EAAOghC,cAAe,SAAU5+B,GAC/B,IAAIjB,EAAU+jC,EAGd,GAAK7mC,EAAQ4mC,MAAQD,KAAiB5iC,EAAQsgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS9K,GACxB,IAAI74B,EACHwlC,EAAMviC,EAAQuiC,MAWf,GATAA,EAAIQ,KACH/iC,EAAQzD,KACRyD,EAAQ29B,IACR39B,EAAQ+9B,MACR/9B,EAAQgjC,SACRhjC,EAAQmR,UAIJnR,EAAQijC,UACZ,IAAMlmC,KAAKiD,EAAQijC,UAClBV,EAAKxlC,GAAMiD,EAAQijC,UAAWlmC,GAmBhC,IAAMA,KAdDiD,EAAQigC,UAAYsC,EAAIvC,kBAC5BuC,EAAIvC,iBAAkBhgC,EAAQigC,UAQzBjgC,EAAQsgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV6B,EAAIxC,iBAAkBhjC,EAAG2jC,EAAS3jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAW+jC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAT/mC,EACJgmC,EAAIpC,QACgB,UAAT5jC,EAKgB,iBAAfgmC,EAAIrC,OACftK,EAAU,EAAG,SAEbA,EAGC2M,EAAIrC,OACJqC,EAAInC,YAINxK,EACC6M,GAAkBF,EAAIrC,SAAYqC,EAAIrC,OACtCqC,EAAInC,WAK+B,UAAjCmC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAItB,UACd,CAAE9jC,KAAMolC,EAAIiB,cACbjB,EAAIzC,4BAQTyC,EAAIW,OAASnkC,IACb+jC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYtkC,EAAU,cAKnC2B,IAAhB6hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAIzmB,YAMRlhB,EAAO8f,WAAY,WACb3b,GACJ+jC,OAQL/jC,EAAWA,EAAU,SAErB,IAGCwjC,EAAI1B,KAAM7gC,EAAQwgC,YAAcxgC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKT84B,MAAO,WACDphC,GACJA,QAWLnB,EAAO+gC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAE/lB,SAAS3Y,QAAS,KAKtBW,EAAO6gC,UAAW,CACjBR,QAAS,CACRhhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETmhC,WAAY,CACX2D,cAAe,SAAU5kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAO+gC,cAAe,SAAU,SAAUhD,QACxBj7B,IAAZi7B,EAAE7yB,QACN6yB,EAAE7yB,OAAQ,GAEN6yB,EAAE2E,cACN3E,EAAEp/B,KAAO,SAKXqB,EAAOghC,cAAe,SAAU,SAAUjD,GAIxC,IAAI1+B,EAAQ8B,EADb,GAAK48B,EAAE2E,aAAe3E,EAAE+H,YAEvB,MAAO,CACN7C,KAAM,SAAUhpB,EAAG+d,GAClB34B,EAASW,EAAQ,YACf+O,KAAMgvB,EAAE+H,aAAe,IACvBpmB,KAAM,CAAEqmB,QAAShI,EAAEiI,cAAepnC,IAAKm/B,EAAEgC,MACzCza,GAAI,aAAcnkB,EAAW,SAAU8kC,GACvC5mC,EAAOub,SACPzZ,EAAW,KACN8kC,GACJjO,EAAuB,UAAbiO,EAAItnC,KAAmB,IAAM,IAAKsnC,EAAItnC,QAKnD9B,EAAS6C,KAAKC,YAAaN,EAAQ,KAEpCkjC,MAAO,WACDphC,GACJA,QAUL,IAqGKshB,GArGDyjB,GAAe,GAClBC,GAAS,oBAGVnmC,EAAO6gC,UAAW,CACjBuF,MAAO,WACPC,cAAe,WACd,IAAIllC,EAAW+kC,GAAa5/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADAnH,KAAMkE,IAAa,EACZA,KAKTnB,EAAO+gC,cAAe,aAAc,SAAUhD,EAAGuI,EAAkBnH,GAElE,IAAIoH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ3I,EAAEqI,QAAqBD,GAAO17B,KAAMszB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAEte,MAE6C,KADnDse,EAAEqC,aAAe,IACjBtiC,QAAS,sCACXqoC,GAAO17B,KAAMszB,EAAEte,OAAU,QAI5B,GAAKinB,GAAiC,UAArB3I,EAAEkB,UAAW,GA8D7B,OA3DAsH,EAAexI,EAAEsI,cAAgB/nC,EAAYy/B,EAAEsI,eAC9CtI,EAAEsI,gBACFtI,EAAEsI,cAGEK,EACJ3I,EAAG2I,GAAa3I,EAAG2I,GAAWxjC,QAASijC,GAAQ,KAAOI,IAC/B,IAAZxI,EAAEqI,QACbrI,EAAEgC,MAAS3C,GAAO3yB,KAAMszB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEqI,MAAQ,IAAMG,GAIjExI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMiG,GACLzmC,EAAOoD,MAAOmjC,EAAe,mBAEvBE,EAAmB,IAI3B1I,EAAEkB,UAAW,GAAM,OAGnBuH,EAAcxpC,EAAQupC,GACtBvpC,EAAQupC,GAAiB,WACxBE,EAAoBnlC,WAIrB69B,EAAM/jB,OAAQ,gBAGQtY,IAAhB0jC,EACJxmC,EAAQhD,GAASq+B,WAAYkL,GAI7BvpC,EAAQupC,GAAiBC,EAIrBzI,EAAGwI,KAGPxI,EAAEsI,cAAgBC,EAAiBD,cAGnCH,GAAaroC,KAAM0oC,IAIfE,GAAqBnoC,EAAYkoC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc1jC,IAI5B,WAYTzE,EAAQsoC,qBACHlkB,GAAO5lB,EAAS+pC,eAAeD,mBAAoB,IAAKlkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS2mC,GAC3C,MAAqB,iBAATpnB,EACJ,IAEgB,kBAAZvf,IACX2mC,EAAc3mC,EACdA,GAAU,GAKLA,IAIA7B,EAAQsoC,qBAMZ9yB,GALA3T,EAAUrD,EAAS+pC,eAAeD,mBAAoB,KAKvCrnC,cAAe,SACzBkT,KAAO3V,EAASsV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUrD,GAKZwnB,GAAWwiB,GAAe,IAD1BC,EAASxvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAewnC,EAAQ,MAGzCA,EAAS1iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI8lC,EAAOt9B,cAlChC,IAAIqK,EAAMizB,EAAQziB,GAyCnBrkB,EAAOG,GAAGwoB,KAAO,SAAUoX,EAAKgH,EAAQ5lC,GACvC,IAAIlB,EAAUtB,EAAM0kC,EACnB5rB,EAAOxa,KACP0oB,EAAMoa,EAAIjiC,QAAS,KAsDpB,OApDY,EAAP6nB,IACJ1lB,EAAWi7B,GAAkB6E,EAAIxiC,MAAOooB,IACxCoa,EAAMA,EAAIxiC,MAAO,EAAGooB,IAIhBrnB,EAAYyoC,IAGhB5lC,EAAW4lC,EACXA,OAASjkC,GAGEikC,GAA4B,iBAAXA,IAC5BpoC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOihC,KAAM,CACZlB,IAAKA,EAKLphC,KAAMA,GAAQ,MACdqgC,SAAU,OACVvf,KAAMsnB,IACHlhC,KAAM,SAAU+/B,GAGnBvC,EAAW/hC,UAEXmW,EAAKgV,KAAMxsB,EAIVD,EAAQ,SAAUmtB,OAAQntB,EAAO2X,UAAWiuB,IAAiBp4B,KAAMvN,GAGnE2lC,KAKExqB,OAAQja,GAAY,SAAUg+B,EAAOmD,GACxC7qB,EAAKvW,KAAM,WACVC,EAASvD,MAAOX,KAAMomC,GAAY,CAAElE,EAAMyG,aAActD,EAAQnD,QAK5DliC,MAMR+C,EAAO6O,KAAKhI,QAAQmgC,SAAW,SAAU3lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOw5B,OAAQ,SAAUr5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOinC,OAAS,CACfC,UAAW,SAAU7lC,EAAMe,EAASjD,GACnC,IAAIgoC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD5X,EAAW5vB,EAAOyhB,IAAKpgB,EAAM,YAC7BomC,EAAUznC,EAAQqB,GAClB2nB,EAAQ,GAGS,WAAb4G,IACJvuB,EAAKkgB,MAAMqO,SAAW,YAGvB2X,EAAYE,EAAQR,SACpBI,EAAYrnC,EAAOyhB,IAAKpgB,EAAM,OAC9BmmC,EAAaxnC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbuuB,GAAwC,UAAbA,KACA,GAA9CyX,EAAYG,GAAa1pC,QAAS,SAMpCwpC,GADAH,EAAcM,EAAQ7X,YACD7iB,IACrBq6B,EAAUD,EAAYzS,OAGtB4S,EAASrX,WAAYoX,IAAe,EACpCD,EAAUnX,WAAYuX,IAAgB,GAGlClpC,EAAY8D,KAGhBA,EAAUA,EAAQ1E,KAAM2D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIolC,KAGjC,MAAfnlC,EAAQ2K,MACZic,EAAMjc,IAAQ3K,EAAQ2K,IAAMw6B,EAAUx6B,IAAQu6B,GAE1B,MAAhBllC,EAAQsyB,OACZ1L,EAAM0L,KAAStyB,EAAQsyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWhlC,EACfA,EAAQslC,MAAMhqC,KAAM2D,EAAM2nB,IAGA,iBAAdA,EAAMjc,MACjBic,EAAMjc,KAAO,MAEa,iBAAfic,EAAM0L,OACjB1L,EAAM0L,MAAQ,MAEf+S,EAAQhmB,IAAKuH,MAKhBhpB,EAAOG,GAAGgC,OAAQ,CAGjB8kC,OAAQ,SAAU7kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNnF,KACAA,KAAKiE,KAAM,SAAU/B,GACpBa,EAAOinC,OAAOC,UAAWjqC,KAAMmF,EAASjD,KAI3C,IAAIwoC,EAAMC,EACTvmC,EAAOpE,KAAM,GAEd,OAAMoE,EAQAA,EAAKwxB,iBAAiBvyB,QAK5BqnC,EAAOtmC,EAAKmzB,wBACZoT,EAAMvmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK46B,EAAK56B,IAAM66B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAE/6B,IAAK,EAAG2nB,KAAM,QATxB,GAuBD9E,SAAU,WACT,GAAM3yB,KAAM,GAAZ,CAIA,IAAI8qC,EAAcd,EAAQ/nC,EACzBmC,EAAOpE,KAAM,GACb+qC,EAAe,CAAEj7B,IAAK,EAAG2nB,KAAM,GAGhC,GAAwC,UAAnC10B,EAAOyhB,IAAKpgB,EAAM,YAGtB4lC,EAAS5lC,EAAKmzB,4BAER,CACNyS,EAAShqC,KAAKgqC,SAId/nC,EAAMmC,EAAK6I,cACX69B,EAAe1mC,EAAK0mC,cAAgB7oC,EAAIyN,gBACxC,MAAQo7B,IACLA,IAAiB7oC,EAAIujB,MAAQslB,IAAiB7oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKsmB,EAAc,YAE1BA,EAAeA,EAAanoC,WAExBmoC,GAAgBA,IAAiB1mC,GAAkC,IAA1B0mC,EAAavpC,YAG1DwpC,EAAehoC,EAAQ+nC,GAAed,UACzBl6B,KAAO/M,EAAOyhB,IAAKsmB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ10B,EAAOyhB,IAAKsmB,EAAc,mBAAmB,IAKpE,MAAO,CACNh7B,IAAKk6B,EAAOl6B,IAAMi7B,EAAaj7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEqzB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO10B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E0mC,aAAc,WACb,OAAO9qC,KAAKmE,IAAK,WAChB,IAAI2mC,EAAe9qC,KAAK8qC,aAExB,MAAQA,GAA2D,WAA3C/nC,EAAOyhB,IAAKsmB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBp7B,QAM1B3M,EAAOkB,KAAM,CAAE00B,WAAY,cAAeD,UAAW,eAAiB,SAAUhc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQnhB,KAAM,SAAUoE,EAAMsY,EAAQva,GAG5C,IAAIwoC,EAOJ,GANKnpC,EAAU4C,GACdumC,EAAMvmC,EACuB,IAAlBA,EAAK7C,WAChBopC,EAAMvmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOwoC,EAAMA,EAAKloB,GAASre,EAAMsY,GAG7BiuB,EACJA,EAAIK,SACFl7B,EAAY66B,EAAIE,YAAV1oC,EACP2N,EAAM3N,EAAMwoC,EAAIC,aAIjBxmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOgzB,SAAUtT,GAASoP,GAAczwB,EAAQiyB,cAC/C,SAAUjvB,EAAMmtB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQltB,EAAMqe,GAGlBsO,GAAUvjB,KAAM+jB,GACtBxuB,EAAQqB,GAAOuuB,WAAYlQ,GAAS,KACpC8O,MAQLxuB,EAAOkB,KAAM,CAAEgnC,OAAQ,SAAUC,MAAO,SAAW,SAAU9lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CAAE0zB,QAAS,QAAUvyB,EAAM2W,QAASra,EAAMypC,GAAI,QAAU/lC,GACpE,SAAUgmC,EAAcC,GAGxBtoC,EAAOG,GAAImoC,GAAa,SAAU3T,EAAQxwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAY+nC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVxwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCinC,EAASxqC,QAAS,SACxBuD,EAAM,QAAUgB,GAChBhB,EAAKxE,SAAS8P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK7C,UACTU,EAAMmC,EAAKsL,gBAIJ3J,KAAKgvB,IACX3wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM4zB,GAGxBvyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOouB,IAChC5zB,EAAM0f,EAAYsW,OAAS7xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOlD,KAAKqoB,GAAI3mB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB41B,KAAM,SAAUxS,EAAO9F,EAAMtf,GAC5B,OAAOlD,KAAKqoB,GAAIC,EAAO,KAAM9F,EAAMtf,IAEpCooC,OAAQ,SAAUhjB,EAAOplB,GACxB,OAAOlD,KAAK0oB,IAAKJ,EAAO,KAAMplB,IAG/BqoC,SAAU,SAAUvoC,EAAUslB,EAAO9F,EAAMtf,GAC1C,OAAOlD,KAAKqoB,GAAIC,EAAOtlB,EAAUwf,EAAMtf,IAExCsoC,WAAY,SAAUxoC,EAAUslB,EAAOplB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBrD,KAAK0oB,IAAK1lB,EAAU,MACpBhD,KAAK0oB,IAAKJ,EAAOtlB,GAAY,KAAME,IAGrCuoC,MAAO,SAAUC,EAAQC,GACxB,OAAO3rC,KAAKmuB,WAAYud,GAAStd,WAAYud,GAASD,MAIxD3oC,EAAOkB,KAAM,wLAEgDqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBrD,KAAKqoB,GAAIjjB,EAAM,KAAMod,EAAMtf,GAC3BlD,KAAKmpB,QAAS/jB,MASlB,IAAI2E,GAAQ,qCAMZhH,EAAO6oC,MAAQ,SAAU1oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMq3B,EAUf,GARwB,iBAAZ3oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKArP,EAAY6B,GAalB,OARAqR,EAAOjU,EAAMG,KAAM4D,UAAW,IAC9BunC,EAAQ,WACP,OAAO1oC,EAAGvC,MAAOsC,GAAWjD,KAAMuU,EAAK7T,OAAQJ,EAAMG,KAAM4D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElCykC,GAGR7oC,EAAO8oC,UAAY,SAAUC,GACvBA,EACJ/oC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOgpC,UAAY/oB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO1B,WAAaA,EACpB0B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOqpB,IAAM3jB,KAAK2jB,IAElBrpB,EAAOipC,UAAY,SAAU1qC,GAK5B,IAAII,EAAOqB,EAAOrB,KAAMJ,GACxB,OAAkB,WAATI,GAA8B,WAATA,KAK5BuqC,MAAO3qC,EAAM0xB,WAAY1xB,KAG5ByB,EAAOmpC,KAAO,SAAU5pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXoiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOppC,IAOT,IAGCspC,GAAUtsC,EAAOgD,OAGjBupC,GAAKvsC,EAAOwsC,EAwBb,OAtBAxpC,EAAOypC,WAAa,SAAU/mC,GAS7B,OARK1F,EAAOwsC,IAAMxpC,IACjBhD,EAAOwsC,EAAID,IAGP7mC,GAAQ1F,EAAOgD,SAAWA,IAC9BhD,EAAOgD,OAASspC,IAGVtpC,GAMiB,oBAAb9C,IACXF,EAAOgD,OAAShD,EAAOwsC,EAAIxpC,GAMrBA","file":"jquery-3.5.1.min.js"} \ No newline at end of file diff --git a/static/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png b/static/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png new file mode 100644 index 000000000..d9a97b435 Binary files /dev/null and b/static/en/sp/spr/steps_files/figure-html/deseq2_deg_counts-1.png differ diff --git a/static/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png b/static/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png new file mode 100644 index 000000000..ba1e36690 Binary files /dev/null and b/static/en/sp/spr/steps_files/figure-html/edger_deg_counts-1.png differ diff --git a/static/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png b/static/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png new file mode 100644 index 000000000..c168cc72f Binary files /dev/null and b/static/en/sp/spr/steps_files/figure-html/sample_tree_rlog-1.png differ diff --git a/static/en/sp/spr/steps_files/figure-html/vennplot-1.png b/static/en/sp/spr/steps_files/figure-html/vennplot-1.png new file mode 100644 index 000000000..25813bec3 Binary files /dev/null and b/static/en/sp/spr/steps_files/figure-html/vennplot-1.png differ diff --git a/static/rmarkdown-libs/datatables-binding/datatables.js b/static/rmarkdown-libs/datatables-binding/datatables.js index e4148252a..fc04fd225 100644 --- a/static/rmarkdown-libs/datatables-binding/datatables.js +++ b/static/rmarkdown-libs/datatables-binding/datatables.js @@ -469,10 +469,10 @@ HTMLWidgets.widget({ 'background-color': '#fff', 'border': '1px #ddd solid', 'border-radius': '4px', - 'padding': '20px 20px 10px 20px' + 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' }); var $spans = $x0.children('span').css({ - 'margin-top': '10px', + 'margin-top': data.vertical ? '0' : '10px', 'white-space': 'nowrap' }); var $span1 = $spans.first(), $span2 = $spans.last(); @@ -499,9 +499,9 @@ HTMLWidgets.widget({ // first, make sure the slider div leaves at least 20px between // the two (slider value) span's $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); - // then, if the input is really wide, make the slider the same - // width as the input - if ($x0.outerWidth() < $input.outerWidth()) { + // then, if the input is really wide or slider is vertical, + // make the slider the same width as the input + if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { $x0.outerWidth($input.outerWidth()); } // make sure the slider div does not reach beyond the right margin @@ -566,6 +566,10 @@ HTMLWidgets.widget({ }; var opts = type === 'date' ? { step: 60 * 60 * 1000 } : type === 'integer' ? { step: 1 } : {}; + + opts.orientation = data.vertical ? 'vertical': 'horizontal'; + opts.direction = data.vertical ? 'rtl': 'ltr'; + filter = $x.noUiSlider($.extend({ start: [r1, r2], range: {min: r1, max: r2}, @@ -749,39 +753,44 @@ HTMLWidgets.widget({ throw 'The editable parameter must be "cell", "row", "column", or "all"'; } var disableCols = data.editable.disable ? data.editable.disable.columns : null; + var numericCols = data.editable.numeric; + var areaCols = data.editable.area; for (var i = 0; i < target.length; i++) { (function(cell, current) { var $cell = $(cell), html = $cell.html(); - var _cell = table.cell(cell), value = _cell.data(); - var $input = $(''), changed = false; + var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; + var $input; + if (inArray(index, numericCols)) { + $input = $(''); + } else if (inArray(index, areaCols)) { + $input = $(''); + } else { + $input = $(''); + } if (!immediate) { $cell.data('input', $input).data('html', html); $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); } $input.val(value); - if (inArray(_cell.index().column, disableCols)) { + if (inArray(index, disableCols)) { $input.attr('readonly', '').css('filter', 'invert(25%)'); } $cell.empty().append($input); if (cell === current) $input.focus(); $input.css('width', '100%'); - if (immediate) $input.on('change', function() { - changed = true; + if (immediate) $input.on('blur', function(e) { var valueNew = $input.val(); if (valueNew != value) { _cell.data(valueNew); if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: "event"}); + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); } // for server-side processing, users have to call replaceData() to update the table if (!server) table.draw(false); } else { $cell.html(html); } - $input.remove(); - }).on('blur', function() { - if (!changed) $input.trigger('change'); }).on('keyup', function(e) { // hit Escape to cancel editing if (e.keyCode === 27) $input.trigger('blur'); diff --git a/static/rmarkdown-libs/htmlwidgets/htmlwidgets.js b/static/rmarkdown-libs/htmlwidgets/htmlwidgets.js index 3d2276248..da8b23678 100644 --- a/static/rmarkdown-libs/htmlwidgets/htmlwidgets.js +++ b/static/rmarkdown-libs/htmlwidgets/htmlwidgets.js @@ -251,7 +251,7 @@ try { result = eval("(" + code + ")"); } catch(error) { - if (!error instanceof SyntaxError) { + if (!(error instanceof SyntaxError)) { throw error; } try { diff --git a/static/rmarkdown-libs/jquery/jquery.js b/static/rmarkdown-libs/jquery/jquery-3.6.0.js similarity index 98% rename from static/rmarkdown-libs/jquery/jquery.js rename to static/rmarkdown-libs/jquery/jquery-3.6.0.js index 50937333b..fc6c299b7 100644 --- a/static/rmarkdown-libs/jquery/jquery.js +++ b/static/rmarkdown-libs/jquery/jquery-3.6.0.js @@ -1,15 +1,15 @@ /*! - * jQuery JavaScript Library v3.5.1 + * jQuery JavaScript Library v3.6.0 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * - * Copyright JS Foundation and other contributors + * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2020-05-04T22:49Z + * Date: 2021-03-02T17:08Z */ ( function( global, factory ) { @@ -76,12 +76,16 @@ var support = {}; var isFunction = function isFunction( obj ) { - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; var isWindow = function isWindow( obj ) { @@ -147,7 +151,7 @@ function toType( obj ) { var - version = "3.5.1", + version = "3.6.0", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -401,7 +405,7 @@ jQuery.extend( { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? - [ arr ] : arr + [ arr ] : arr ); } else { push.call( ret, arr ); @@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) { // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); function isArrayLike( obj ) { @@ -518,14 +522,14 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.5 + * Sizzle CSS Selector Engine v2.3.6 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * - * Date: 2020-03-14 + * Date: 2021-02-16 */ ( function( window ) { var i, @@ -1108,8 +1112,8 @@ support = Sizzle.support = {}; * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes @@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); -}; +} var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); @@ -3997,8 +4001,8 @@ jQuery.extend( { resolveContexts = Array( i ), resolveValues = slice.call( arguments ), - // the master Deferred - master = jQuery.Deferred(), + // the primary Deferred + primary = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { @@ -4006,30 +4010,30 @@ jQuery.extend( { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); + primary.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || + if ( primary.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - return master.then(); + return primary.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); } - return master.promise(); + return primary.promise(); } } ); @@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } @@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { } -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; @@ -5387,8 +5388,8 @@ jQuery.event = { event = jQuery.event.fix( nativeEvent ), handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event @@ -5512,12 +5513,12 @@ jQuery.event = { get: isFunction( hook ) ? function() { if ( this.originalEvent ) { - return hook( this.originalEvent ); + return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { - return this.originalEvent[ name ]; + return this.originalEvent[ name ]; } }, @@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - return result.value; + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate @@ -5821,34 +5828,7 @@ jQuery.each( { targetTouches: true, toElement: true, touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } + which: true }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { @@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + delegateType: delegateType }; } ); @@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { @@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); - table.style.cssText = "position:absolute;left:-11111px"; + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. tr.style.height = "1px"; trChild.style.height = "9px"; + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; documentElement.removeChild( table ); } @@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) { // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); } }, @@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) - ) + "px"; + ) + "px"; } } ); @@ -7223,7 +7228,7 @@ Tween.propHooks = { if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || + jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { @@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) { anim.done( function() { - /* eslint-enable no-loop-func */ + /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { @@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) { tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, @@ -7761,7 +7766,8 @@ jQuery.fn.extend( { anim.stop( true ); } }; - doAnimation.finish = doAnimation; + + doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : @@ -8401,8 +8407,8 @@ jQuery.fn.extend( { if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" + "" : + dataPriv.get( this, "__className__" ) || "" ); } } @@ -8417,7 +8423,7 @@ jQuery.fn.extend( { while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; + return true; } } @@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, { special.bindType || type; // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); @@ -8856,7 +8860,7 @@ var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { - var xml; + var xml, parserErrorElem; if ( !data || typeof data !== "string" ) { return null; } @@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) { // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } + } catch ( e ) {} - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); } return xml; }; @@ -8971,16 +8980,14 @@ jQuery.fn.extend( { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { + } ).filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { + } ).map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { @@ -9033,7 +9040,8 @@ var // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; + +originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { @@ -9414,8 +9422,8 @@ jQuery.extend( { // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, + jQuery( callbackContext ) : + jQuery.event, // Deferreds deferred = jQuery.Deferred(), @@ -9727,8 +9735,10 @@ jQuery.extend( { response = ajaxHandleResponses( s, jqXHR, responses ); } - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { s.converters[ "text script" ] = function() {}; } @@ -10466,12 +10476,6 @@ jQuery.offset = { options.using.call( elem, props ); } else { - if ( typeof props.top === "number" ) { - props.top += "px"; - } - if ( typeof props.left === "number" ) { - props.left += "px"; - } curElem.css( props ); } } @@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) { // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { + jQuery.each( { + padding: "inner" + name, + content: type, + "": "outer" + name + }, function( defaultExtra, funcName ) { // Margin is only for outerHeight, outerWidth jQuery.fn[ funcName ] = function( margin, value ) { @@ -10726,7 +10733,8 @@ jQuery.fn.extend( { } } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + +jQuery.each( + ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( _i, name ) { @@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + this.on( name, null, data, fn ) : this.trigger( name ); }; - } ); + } +); diff --git a/static/rmarkdown-libs/jquery/jquery-3.6.0.min.js b/static/rmarkdown-libs/jquery/jquery-3.6.0.min.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/static/rmarkdown-libs/jquery/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/static/rmarkdown-libs/jquery/jquery-AUTHORS.txt b/static/rmarkdown-libs/jquery/jquery-AUTHORS.txt deleted file mode 100644 index 06df1a533..000000000 --- a/static/rmarkdown-libs/jquery/jquery-AUTHORS.txt +++ /dev/null @@ -1,357 +0,0 @@ -Authors ordered by first contribution. - -John Resig -Gilles van den Hoven -Michael Geary -Stefan Petre -Yehuda Katz -Corey Jewett -Klaus Hartl -Franck Marcia -Jörn Zaefferer -Paul Bakaus -Brandon Aaron -Mike Alsup -Dave Methvin -Ed Engelhardt -Sean Catchpole -Paul Mclanahan -David Serduke -Richard D. Worth -Scott González -Ariel Flesler -Cheah Chu Yeow -Andrew Chalkley -Fabio Buffoni -Stefan Bauckmeier  -Jon Evans -TJ Holowaychuk -Riccardo De Agostini -Michael Bensoussan -Louis-Rémi Babé -Robert Katić -Damian Janowski -Anton Kovalyov -Dušan B. Jovanovic -Earle Castledine -Rich Dougherty -Kim Dalsgaard -Andrea Giammarchi -Fabian Jakobs -Mark Gibson -Karl Swedberg -Justin Meyer -Ben Alman -James Padolsey -David Petersen -Batiste Bieler -Jake Archibald -Alexander Farkas -Filipe Fortes -Rick Waldron -Neeraj Singh -Paul Irish -Iraê Carvalho -Matt Curry -Michael Monteleone -Noah Sloan -Tom Viner -J. Ryan Stinnett -Douglas Neiner -Adam J. Sontag -Heungsub Lee -Dave Reed -Carl Fürstenberg -Jacob Wright -Ralph Whitbeck -unknown -temp01 -Colin Snover -Jared Grippe -Ryan W Tenney -Alex Sexton -Pinhook -Ron Otten -Jephte Clain -Anton Matzneller -Dan Heberden -Henri Wiechers -Russell Holbrook -Julian Aubourg -Gianni Alessandro Chiappetta -Scott Jehl -James Burke -Jonas Pfenniger -Xavi Ramirez -Sylvester Keil -Brandon Sterne -Mathias Bynens -Lee Carpenter -Timmy Willison <4timmywil@gmail.com> -Corey Frang -Digitalxero -David Murdoch -Josh Varner -Charles McNulty -Jordan Boesch -Jess Thrysoee -Michael Murray -Alexis Abril -Rob Morgan -John Firebaugh -Sam Bisbee -Gilmore Davidson -Brian Brennan -Xavier Montillet -Daniel Pihlstrom -Sahab Yazdani -avaly -Scott Hughes -Mike Sherov -Greg Hazel -Schalk Neethling -Denis Knauf -Timo Tijhof -Steen Nielsen -Anton Ryzhov -Shi Chuan -Matt Mueller -Berker Peksag -Toby Brain -Justin -Daniel Herman -Oleg Gaidarenko -Rock Hymas -Richard Gibson -Rafaël Blais Masson -cmc3cn <59194618@qq.com> -Joe Presbrey -Sindre Sorhus -Arne de Bree -Vladislav Zarakovsky -Andrew E Monat -Oskari -Joao Henrique de Andrade Bruni -tsinha -Dominik D. Geyer -Matt Farmer -Trey Hunner -Jason Moon -Jeffery To -Kris Borchers -Vladimir Zhuravlev -Jacob Thornton -Chad Killingsworth -Vitya Muhachev -Nowres Rafid -David Benjamin -Alan Plum -Uri Gilad -Chris Faulkner -Marcel Greter -Elijah Manor -Daniel Chatfield -Daniel Gálvez -Nikita Govorov -Wesley Walser -Mike Pennisi -Matthias Jäggli -Devin Cooper -Markus Staab -Dave Riddle -Callum Macrae -Jonathan Sampson -Benjamin Truyman -Jay Merrifield -James Huston -Sai Lung Wong -Erick Ruiz de Chávez -David Bonner -Allen J Schmidt Jr -Akintayo Akinwunmi -MORGAN -Ismail Khair -Carl Danley -Mike Petrovich -Greg Lavallee -Tom H Fuertes -Roland Eckl -Yiming He -David Fox -Bennett Sorbo -Paul Ramos -Rod Vagg -Sebastian Burkhard -Zachary Adam Kaplan -Adam Coulombe -nanto_vi -nanto -Danil Somsikov -Ryunosuke SATO -Diego Tres -Jean Boussier -Andrew Plummer -Mark Raddatz -Pascal Borreli -Isaac Z. Schlueter -Karl Sieburg -Nguyen Phuc Lam -Dmitry Gusev -Steven Benner -Li Xudong -Michał Gołębiowski-Owczarek -Renato Oliveira dos Santos -Frederic Junod -Tom H Fuertes -Mitch Foley -ros3cin -Kyle Robinson Young -John Paul -Jason Bedard -Chris Talkington -Eddie Monge -Terry Jones -Jason Merino -Dan Burzo -Jeremy Dunck -Chris Price -Guy Bedford -njhamann -Goare Mao -Amey Sakhadeo -Mike Sidorov -Anthony Ryan -Lihan Li -George Kats -Dongseok Paeng -Ronny Springer -Ilya Kantor -Marian Sollmann -Chris Antaki -David Hong -Jakob Stoeck -Christopher Jones -Forbes Lindesay -S. Andrew Sheppard -Leonardo Balter -Rodrigo Rosenfeld Rosas -Daniel Husar -Philip Jägenstedt -John Hoven -Roman Reiß -Benjy Cui -Christian Kosmowski -David Corbacho -Liang Peng -TJ VanToll -Aurelio De Rosa -Senya Pugach -Dan Hart -Nazar Mokrynskyi -Benjamin Tan -Amit Merchant -Jason Bedard -Veaceslav Grimalschi -Richard McDaniel -Arthur Verschaeve -Shivaji Varma -Ben Toews -Bin Xin -Neftaly Hernandez -T.J. Crowder -Nicolas HENRY -Frederic Hemberger -Victor Homyakov -Aditya Raghavan -Anne-Gaelle Colom -Leonardo Braga -George Mauer -Stephen Edgar -Thomas Tortorini -Jörn Wagner -Jon Hester -Colin Frick -Winston Howes -Alexander O'Mara -Chris Rebert -Bastian Buchholz -Mu Haibao -Calvin Metcalf -Arthur Stolyar -Gabriel Schulhof -Gilad Peleg -Julian Alexander Murillo -Kevin Kirsche -Martin Naumann -Yongwoo Jeon -John-David Dalton -Marek Lewandowski -Bruno Pérel -Daniel Nill -Reed Loden -Sean Henderson -Gary Ye -Richard Kraaijenhagen -Connor Atherton -Christian Grete -Tom von Clef -Liza Ramo -Joelle Fleurantin -Steve Mao -Jon Dufresne -Jae Sung Park -Josh Soref -Saptak Sengupta -Henry Wong -Jun Sun -Martijn W. van der Lee -Devin Wilson -Damian Senn -Zack Hall -Vitaliy Terziev -Todor Prikumov -Bernhard M. Wiedemann -Jha Naman -Alexander Lisianoi -William Robinet -Joe Trumbull -Alexander K -Ralin Chimev -Felipe Sateler -Christophe Tafani-Dereeper -Manoj Kumar -David Broder-Rodgers -Alex Louden -Alex Padilla -karan-96 -南漂一卒 -Erik Lax -Boom Lee -Andreas Solleder -Pierre Spring -Shashanka Nataraj -CDAGaming -Matan Kotler-Berkowitz <205matan@gmail.com> -Jordan Beland -Henry Zhu -Nilton Cesar -basil.belokon -Andrey Meshkov -tmybr11 -Luis Emilio Velasco Sanchez -Ed S -Bert Zhang -Sébastien Règne -wartmanm <3869625+wartmanm@users.noreply.github.com> -Siddharth Dungarwal -abnud1 -Andrei Fangli -Marja Hölttä -buddh4 -Hoang -Wonseop Kim -Pat O'Callaghan -JuanMa Ruiz -Ahmed.S.ElAfifi -Sean Robinson -Christian Oliff diff --git a/static/rmarkdown-libs/jquery/jquery.min.js b/static/rmarkdown-libs/jquery/jquery.min.js deleted file mode 100644 index b0614034a..000000000 --- a/static/rmarkdown-libs/jquery/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.5.1.min.js"} \ No newline at end of file