biopipen 0.24.1__tar.gz → 0.24.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of biopipen might be problematic. Click here for more details.

Files changed (229) hide show
  1. {biopipen-0.24.1 → biopipen-0.24.2}/PKG-INFO +1 -1
  2. biopipen-0.24.2/biopipen/__init__.py +1 -0
  3. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/cellranger.py +31 -0
  4. biopipen-0.24.2/biopipen/ns/cellranger_pipeline.py +95 -0
  5. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cellranger/CellRangerCount.svelte +5 -2
  6. biopipen-0.24.2/biopipen/reports/cellranger/CellRangerSummary.svelte +16 -0
  7. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cellranger/CellRangerVdj.svelte +5 -2
  8. biopipen-0.24.2/biopipen/scripts/cellranger/CellRangerSummary.R +189 -0
  9. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellsDistribution.R +4 -5
  10. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/MarkersFinder.R +2 -3
  11. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/MetaMarkers.R +3 -4
  12. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/RadarPlots.R +2 -3
  13. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ScFGSEA.R +2 -3
  14. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats-hists.R +1 -1
  15. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats.R +0 -1
  16. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratPreparing.R +13 -10
  17. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/TopExpressingGenes.R +2 -3
  18. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna_metabolic_landscape/MetabolicFeatures.R +2 -3
  19. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.R +1 -2
  20. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.R +1 -2
  21. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/CDR3AAPhyschem.R +0 -1
  22. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/CloneResidency.R +5 -6
  23. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-diversity.R +2 -2
  24. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-kmer.R +1 -1
  25. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-spectratyping.R +2 -2
  26. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-vjjunc.R +1 -1
  27. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch.R +0 -1
  28. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TCRClusterStats.R +4 -5
  29. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/gsea.R +7 -2
  30. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/misc.R +11 -8
  31. {biopipen-0.24.1 → biopipen-0.24.2}/pyproject.toml +2 -1
  32. {biopipen-0.24.1 → biopipen-0.24.2}/setup.py +2 -1
  33. biopipen-0.24.1/biopipen/__init__.py +0 -1
  34. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/__init__.py +0 -0
  35. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/config.py +0 -0
  36. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/config.toml +0 -0
  37. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/defaults.py +0 -0
  38. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/filters.py +0 -0
  39. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/proc.py +0 -0
  40. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/core/testing.py +0 -0
  41. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/__init__.py +0 -0
  42. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/bam.py +0 -0
  43. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/bcftools.py +0 -0
  44. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/bed.py +0 -0
  45. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/cnv.py +0 -0
  46. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/cnvkit.py +0 -0
  47. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/cnvkit_pipeline.py +0 -0
  48. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/delim.py +0 -0
  49. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/gene.py +0 -0
  50. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/gsea.py +0 -0
  51. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/misc.py +0 -0
  52. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/plot.py +0 -0
  53. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/rnaseq.py +0 -0
  54. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/scrna.py +0 -0
  55. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/scrna_metabolic_landscape.py +0 -0
  56. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/tcgamaf.py +0 -0
  57. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/tcr.py +0 -0
  58. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/vcf.py +0 -0
  59. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/ns/web.py +0 -0
  60. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/bam/CNAClinic.svelte +0 -0
  61. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/bam/CNVpytor.svelte +0 -0
  62. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/bam/ControlFREEC.svelte +0 -0
  63. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnv/AneuploidyScore.svelte +0 -0
  64. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnv/AneuploidyScoreSummary.svelte +0 -0
  65. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnv/TMADScoreSummary.svelte +0 -0
  66. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnvkit/CNVkitDiagram.svelte +0 -0
  67. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnvkit/CNVkitHeatmap.svelte +0 -0
  68. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/cnvkit/CNVkitScatter.svelte +0 -0
  69. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/delim/SampleInfo.svelte +0 -0
  70. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/gsea/FGSEA.svelte +0 -0
  71. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/gsea/GSEA.svelte +0 -0
  72. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/CellsDistribution.svelte +0 -0
  73. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/DimPlots.svelte +0 -0
  74. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/MarkersFinder.svelte +0 -0
  75. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/MetaMarkers.svelte +0 -0
  76. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/RadarPlots.svelte +0 -0
  77. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/ScFGSEA.svelte +0 -0
  78. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/SeuratClusterStats.svelte +0 -0
  79. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/SeuratMap2Ref.svelte +0 -0
  80. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/SeuratPreparing.svelte +0 -0
  81. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna/TopExpressingGenes.svelte +0 -0
  82. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna_metabolic_landscape/MetabolicFeatures.svelte +0 -0
  83. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.svelte +0 -0
  84. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna_metabolic_landscape/MetabolicPathwayActivity.svelte +0 -0
  85. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.svelte +0 -0
  86. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/CDR3AAPhyschem.svelte +0 -0
  87. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/CloneResidency.svelte +0 -0
  88. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/Immunarch.svelte +0 -0
  89. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/SampleDiversity.svelte +0 -0
  90. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/TCRClusterStats.svelte +0 -0
  91. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/TESSA.svelte +0 -0
  92. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/tcr/VJUsage.svelte +0 -0
  93. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/utils/gsea.liq +0 -0
  94. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/utils/misc.liq +0 -0
  95. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/vcf/TruvariBenchSummary.svelte +0 -0
  96. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/reports/vcf/TruvariConsistency.svelte +0 -0
  97. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bam/BamMerge.py +0 -0
  98. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bam/BamSplitChroms.py +0 -0
  99. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bam/CNAClinic.R +0 -0
  100. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bam/CNVpytor.py +0 -0
  101. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bam/ControlFREEC.py +0 -0
  102. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bcftools/BcftoolsAnnotate.py +0 -0
  103. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bcftools/BcftoolsFilter.py +0 -0
  104. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bcftools/BcftoolsSort.py +0 -0
  105. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bed/Bed2Vcf.py +0 -0
  106. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bed/BedConsensus.py +0 -0
  107. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bed/BedLiftOver.sh +0 -0
  108. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/bed/BedtoolsMerge.py +0 -0
  109. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cellranger/CellRangerCount.py +0 -0
  110. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cellranger/CellRangerVdj.py +0 -0
  111. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnv/AneuploidyScore.R +0 -0
  112. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnv/AneuploidyScoreSummary.R +0 -0
  113. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnv/TMADScore.R +0 -0
  114. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnv/TMADScoreSummary.R +0 -0
  115. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitAccess.py +0 -0
  116. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitAutobin.py +0 -0
  117. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitBatch.py +0 -0
  118. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitCall.py +0 -0
  119. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitCoverage.py +0 -0
  120. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitDiagram.py +0 -0
  121. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitFix.py +0 -0
  122. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitGuessBaits.py +0 -0
  123. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitHeatmap.py +0 -0
  124. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitReference.py +0 -0
  125. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitScatter.py +0 -0
  126. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/CNVkitSegment.py +0 -0
  127. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/cnvkit/guess_baits.py +0 -0
  128. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/delim/RowsBinder.R +0 -0
  129. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/delim/SampleInfo.R +0 -0
  130. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/gene/GeneNameConversion.py +0 -0
  131. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/gsea/Enrichr.R +0 -0
  132. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/gsea/FGSEA.R +0 -0
  133. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/gsea/GSEA.R +0 -0
  134. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/gsea/PreRank.R +0 -0
  135. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/misc/Config2File.py +0 -0
  136. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/misc/Str2File.py +0 -0
  137. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/plot/Heatmap.R +0 -0
  138. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/plot/VennDiagram.R +0 -0
  139. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/rnaseq/UnitConversion.R +0 -0
  140. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellTypeAnnotation-direct.R +0 -0
  141. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellTypeAnnotation-hitype.R +0 -0
  142. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellTypeAnnotation-sccatch.R +0 -0
  143. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellTypeAnnotation-sctype.R +0 -0
  144. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/CellTypeAnnotation.R +0 -0
  145. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/DimPlots.R +0 -0
  146. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ExprImpution-alra.R +0 -0
  147. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ExprImpution-rmagic.R +0 -0
  148. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ExprImpution-scimpute.R +0 -0
  149. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ExprImpution.R +0 -0
  150. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/ModuleScoreCalculator.R +0 -0
  151. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SCImpute.R +0 -0
  152. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats-dimplots.R +0 -0
  153. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats-features.R +0 -0
  154. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats-ngenes.R +0 -0
  155. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClusterStats-stats.R +0 -0
  156. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratClustering.R +0 -0
  157. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratFilter.R +0 -0
  158. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratLoading.R +0 -0
  159. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratMap2Ref.R +0 -0
  160. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratMetadataMutater.R +0 -0
  161. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratSplit.R +0 -0
  162. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratSubClustering.R +0 -0
  163. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratSubset.R +0 -0
  164. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/SeuratTo10X.R +0 -0
  165. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/Write10X.R +0 -0
  166. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna/sctype.R +0 -0
  167. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayActivity.R +0 -0
  168. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcgamaf/Maf2Vcf.py +0 -0
  169. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcgamaf/MafAddChr.py +0 -0
  170. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcgamaf/maf2vcf.pl +0 -0
  171. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Attach2Seurat.R +0 -0
  172. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/CloneSizeQQPlot.R +0 -0
  173. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/GIANA/GIANA.py +0 -0
  174. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/GIANA/GIANA4.py +0 -0
  175. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/GIANA/Imgt_Human_TRBV.fasta +0 -0
  176. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/GIANA/query.py +0 -0
  177. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-basic.R +0 -0
  178. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-clonality.R +0 -0
  179. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-geneusage.R +0 -0
  180. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-overlap.R +0 -0
  181. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch-tracking.R +0 -0
  182. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/Immunarch2VDJtools.R +0 -0
  183. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/ImmunarchFilter.R +0 -0
  184. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/ImmunarchLoading.R +0 -0
  185. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/ImmunarchSplitIdents.R +0 -0
  186. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/SampleDiversity.R +0 -0
  187. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TCRClustering.R +0 -0
  188. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA.R +0 -0
  189. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/Atchley_factors.csv +0 -0
  190. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/BriseisEncoder.py +0 -0
  191. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/MCMC_control.R +0 -0
  192. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/TrainedEncoder.h5 +0 -0
  193. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/fixed_b.csv +0 -0
  194. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/initialization.R +0 -0
  195. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/post_analysis.R +0 -0
  196. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/real_data.R +0 -0
  197. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/update.R +0 -0
  198. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/TESSA_source/utility.R +0 -0
  199. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/VJUsage.R +0 -0
  200. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/immunarch-patched.R +0 -0
  201. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/tcr/vdjtools-patch.sh +0 -0
  202. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/TruvariBench.sh +0 -0
  203. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/TruvariBenchSummary.R +0 -0
  204. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/TruvariConsistency.R +0 -0
  205. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/Vcf2Bed.py +0 -0
  206. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfAnno.py +0 -0
  207. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfDownSample.sh +0 -0
  208. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfFilter.py +0 -0
  209. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfFix.py +0 -0
  210. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfFix_utils.py +0 -0
  211. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfIndex.py +0 -0
  212. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfIntersect.py +0 -0
  213. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfLiftOver.sh +0 -0
  214. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/vcf/VcfSplitSamples.py +0 -0
  215. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/web/Download.py +0 -0
  216. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/scripts/web/DownloadList.py +0 -0
  217. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/__init__.py +0 -0
  218. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/caching.R +0 -0
  219. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/common_docstrs.py +0 -0
  220. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/gene.R +0 -0
  221. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/gene.py +0 -0
  222. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/io.R +0 -0
  223. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/misc.py +0 -0
  224. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/mutate_helpers.R +0 -0
  225. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/plot.R +0 -0
  226. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/reference.py +0 -0
  227. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/rnaseq.R +0 -0
  228. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/single_cell.R +0 -0
  229. {biopipen-0.24.1 → biopipen-0.24.2}/biopipen/utils/vcf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: biopipen
3
- Version: 0.24.1
3
+ Version: 0.24.2
4
4
  Summary: Bioinformatics processes/pipelines that can be run from `pipen run`
5
5
  License: MIT
6
6
  Author: pwwang
@@ -0,0 +1 @@
1
+ __version__ = "0.24.2"
@@ -50,6 +50,7 @@ class CellRangerCount(Proc):
50
50
  script = "file://../scripts/cellranger/CellRangerCount.py"
51
51
  plugin_opts = {
52
52
  "report": "file://../reports/cellranger/CellRangerCount.svelte",
53
+ "report_paging": 5,
53
54
  }
54
55
 
55
56
 
@@ -98,4 +99,34 @@ class CellRangerVdj(Proc):
98
99
  script = "file://../scripts/cellranger/CellRangerVdj.py"
99
100
  plugin_opts = {
100
101
  "report": "file://../reports/cellranger/CellRangerVdj.svelte",
102
+ "report_paging": 5,
103
+ }
104
+
105
+
106
+ class CellRangerSummary(Proc):
107
+ """Summarize cellranger metrics
108
+
109
+ Input:
110
+ indirs: The directories containing cellranger results
111
+ from `CellRangerCount`/`CellRangerVdj`.
112
+
113
+ Output:
114
+ outdir: The output directory
115
+
116
+ Envs:
117
+ group (type=auto): The group of the samples for boxplots.
118
+ If `None`, don't do boxplots.
119
+ It can be a dict of group names and sample names, e.g.
120
+ `{"group1": ["sample1", "sample2"], "group2": ["sample3"]}`
121
+ or a file containing the group information, with the first column
122
+ being the sample names and the second column being the group names.
123
+ The file should be tab-delimited with no header.
124
+ """
125
+ input = "indirs:dirs"
126
+ output = "outdir:dir:{{in.indirs | first | stem | append: '-etc.summary'}}"
127
+ lang = config.lang.rscript
128
+ script = "file://../scripts/cellranger/CellRangerSummary.R"
129
+ envs = {"group": None}
130
+ plugin_opts = {
131
+ "report": "file://../reports/cellranger/CellRangerSummary.svelte",
101
132
  }
@@ -0,0 +1,95 @@
1
+ """The cellranger pipelines
2
+
3
+ Primarily cellranger process plus summary for summarizing the metrics for
4
+ multiple samples.
5
+ """
6
+ from __future__ import annotations
7
+ from typing import TYPE_CHECKING
8
+
9
+ from diot import Diot
10
+ from pipen_args.procgroup import ProcGroup
11
+
12
+ if TYPE_CHECKING:
13
+ from pipen import Proc
14
+
15
+
16
+ class CellRangerCountPipeline(ProcGroup):
17
+ """The cellranger count pipeline
18
+
19
+ Run cellranger count for multiple samples and summarize the metrics.
20
+ """
21
+ DEFAULTS = Diot(input=None)
22
+
23
+ def post_init(self):
24
+ """Check if the input is a list of fastq files"""
25
+ if (
26
+ not isinstance(self.opts.input, (list, tuple))
27
+ or len(self.opts.input) == 0
28
+ or not isinstance(self.opts.input[0], (list, tuple))
29
+ ):
30
+ raise TypeError(
31
+ "The input of `CellRangerCountPipeline` should be a list of lists of "
32
+ "fastq files."
33
+ )
34
+
35
+ @ProcGroup.add_proc
36
+ def p_cellranger_count(self) -> Proc:
37
+ """Build CellRangerCount process"""
38
+ from .cellranger import CellRangerCount as _CellRangerCount
39
+
40
+ class CellRangerCount(_CellRangerCount):
41
+ input_data = self.opts.input
42
+
43
+ return CellRangerCount
44
+
45
+ @ProcGroup.add_proc
46
+ def p_cellranger_count_summary(self) -> Proc:
47
+ """Build CellRangerCountSummary process"""
48
+ from .cellranger import CellRangerSummary
49
+
50
+ class CellRangerCountSummary(CellRangerSummary):
51
+ requires = self.p_cellranger_count
52
+ input_data = lambda ch: [list(ch.iloc[:, 0])]
53
+
54
+ return CellRangerCountSummary
55
+
56
+
57
+ class CellRangerVdjPipeline(ProcGroup):
58
+ """The cellranger vdj pipeline
59
+
60
+ Run cellranger vdj for multiple samples and summarize the metrics.
61
+ """
62
+ DEFAULTS = Diot(input=None)
63
+
64
+ def post_init(self):
65
+ """Check if the input is a list of fastq files"""
66
+ if (
67
+ not isinstance(self.opts.input, (list, tuple))
68
+ or len(self.opts.input) == 0
69
+ or not isinstance(self.opts.input[0], (list, tuple))
70
+ ):
71
+ raise TypeError(
72
+ "The input of `CellRangerVdjPipeline` should be a list of lists of "
73
+ "fastq files."
74
+ )
75
+
76
+ @ProcGroup.add_proc
77
+ def p_cellranger_vdj(self) -> Proc:
78
+ """Build CellRangerVdj process"""
79
+ from .cellranger import CellRangerVdj as _CellRangerVdj
80
+
81
+ class CellRangerVdj(_CellRangerVdj):
82
+ input_data = self.opts.input
83
+
84
+ return CellRangerVdj
85
+
86
+ @ProcGroup.add_proc
87
+ def p_cellranger_vdj_summary(self) -> Proc:
88
+ """Build CellRangerVdjSummary process"""
89
+ from .cellranger import CellRangerSummary
90
+
91
+ class CellRangerVdjSummary(CellRangerSummary):
92
+ requires = self.p_cellranger_vdj
93
+ input_data = lambda ch: [list(ch.iloc[:, 0])]
94
+
95
+ return CellRangerVdjSummary
@@ -1,11 +1,14 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
+ <script>
3
+ import { Iframe } from "$libs";
4
+ </script>
2
5
 
3
6
  {%- macro report_job(job, h=1) -%}
4
- <iframe
7
+ <Iframe
5
8
  src="{{job.out.outdir}}/outs/web_summary.html"
6
9
  width="100%"
7
10
  frameborder="0"
8
- style="min-height: 60vh"></iframe>
11
+ style="min-height: 60vh" />
9
12
  {%- endmacro -%}
10
13
 
11
14
  {%- macro head_job(job) -%}
@@ -0,0 +1,16 @@
1
+ {% from "utils/misc.liq" import report_jobs -%}
2
+
3
+ <script>
4
+ import { Image, DataTable, Descr } from "$libs";
5
+ </script>
6
+
7
+ {%- macro report_job(job, h=1) -%}
8
+ {{ job | render_job: h=h }}
9
+ {%- endmacro -%}
10
+
11
+
12
+ {%- macro head_job(job) -%}
13
+ <h1>{{job.out.outdir | stem | escape}}</h1>
14
+ {%- endmacro -%}
15
+
16
+ {{ report_jobs(jobs, head_job, report_job) }}
@@ -1,11 +1,14 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
+ <script>
3
+ import { Iframe } from "$libs";
4
+ </script>
2
5
 
3
6
  {%- macro report_job(job, h=1) -%}
4
- <iframe
7
+ <Iframe
5
8
  src="{{job.out.outdir}}/outs/web_summary.html"
6
9
  width="100%"
7
10
  frameborder="0"
8
- style="min-height: 60vh"></iframe>
11
+ style="min-height: 60vh" />
9
12
  {%- endmacro -%}
10
13
 
11
14
  {%- macro head_job(job) -%}
@@ -0,0 +1,189 @@
1
+ source("{{biopipen_dir}}/utils/misc.R")
2
+ library(rlang)
3
+ library(dplyr)
4
+ library(ggplot2)
5
+ library(ggprism)
6
+
7
+ theme_set(theme_prism())
8
+
9
+ indirs <- {{in.indirs | r}}
10
+ outdir <- {{out.outdir | r}}
11
+ joboutdir <- {{job.outdir | r}}
12
+ group <- {{envs.group | r}}
13
+
14
+ if (is.character(group)) {
15
+ group <- read.csv(group, header = FALSE, row.names = NULL)
16
+ colnames(group) <- c("Sample", "Group")
17
+ } else if (is.list(group)) {
18
+ group <- do_call(
19
+ rbind,
20
+ lapply(names(group), function(n) data.frame(Sample = group[[n]], Group = n))
21
+ )
22
+ } else if (!is.null(group)) {
23
+ stop(paste0("Invalid group: ", paste0(group, collapse = ", ")))
24
+ }
25
+
26
+ cellranger_type <- NULL
27
+ log_info("Reading and merging metrics for each sample ...")
28
+ metrics <- NULL
29
+ for (indir in indirs) {
30
+ sample <- basename(indir)
31
+ log_debug("- Reading metrics for sample: ", sample)
32
+ metric <- read.csv(
33
+ file.path(indir, "outs", "metrics_summary.csv"),
34
+ header = TRUE, row.names = NULL, check.names = FALSE)
35
+ metric$Sample <- sample
36
+ sample_cellranger_type <- ifelse(
37
+ file.exists(file.path(indir, "outs", "clonotypes.csv")),
38
+ "vdj",
39
+ "count" # support more types in the future
40
+ )
41
+ cellranger_type <- cellranger_type %||% sample_cellranger_type
42
+ if (cellranger_type != sample_cellranger_type) {
43
+ stop("Multiple types of CellRanger output detected. Should be either count or vdj.")
44
+ }
45
+ if (!is.null(metrics)) {
46
+ missing_cols <- setdiff(colnames(metrics), colnames(metric))
47
+ if (length(missing_cols) > 0) {
48
+ log_warn('- Missing columns: {paste0(missing_cols, collapse = ", ")} in sample: {sample}')
49
+ metric[missing_cols] <- NA
50
+ }
51
+ missing_cols <- setdiff(colnames(metric), colnames(metrics))
52
+ if (length(missing_cols) > 0) {
53
+ log_warn('- Missing columns: {paste0(missing_cols, collapse = ", ")} in samples before {sample}')
54
+ metrics[missing_cols] <- NA
55
+ }
56
+ }
57
+ metrics <- rbind(metrics, metric)
58
+ }
59
+
60
+ if (is.null(metrics)) {
61
+ stop("No samples found, check the input directories.")
62
+ }
63
+
64
+ percent_columns <- sapply(colnames(metrics), function(x) {
65
+ is.character(metrics[[x]]) && grepl("%", metrics[[x]][1]) && x != "Sample"
66
+ })
67
+ percent_columns <- colnames(metrics)[percent_columns]
68
+ # Remove %
69
+ metrics <- metrics %>%
70
+ mutate(across(all_of(percent_columns), ~as.numeric(gsub("%", "", .x)))) %>%
71
+ rename_with(.fn = function(x) { paste0(x, " (%)") }, .cols = percent_columns) %>%
72
+ mutate(across(-Sample, ~as.numeric(gsub(",", "", .x))))
73
+
74
+ # Save metrics
75
+ write.table(
76
+ metrics,
77
+ file.path(outdir, "metrics.txt"),
78
+ sep = "\t",
79
+ quote = FALSE,
80
+ row.names = FALSE
81
+ )
82
+
83
+ add_report(
84
+ list(kind = "descr", content = "Metrics for all samples"),
85
+ list(kind = "table", src = file.path(outdir, "metrics.txt")),
86
+ h1 = "Metrics of all samples"
87
+ )
88
+
89
+ if (cellranger_type == "vdj") {
90
+ METRIC_DESCR = list(
91
+ `Estimated Number of Cells` = "The number of barcodes estimated to correspond to GEMs containing cells. See VDJ Cell Calling Algorithm.",
92
+ `Mean Read Pairs per Cell` = "Number of input read pairs divided by the estimated number of cells.",
93
+ `Number of Cells With Productive V-J Spanning Pair` = "Number of cell barcodes for which at least one productive sequence was found for each of TRA and TRB (or heavy and light chains, for Ig).",
94
+ `Number of Read Pairs` = "Total number of read pairs that were assigned to this library in demultiplexing.",
95
+ `Valid Barcodes` = "Fraction of reads with barcodes that match the whitelist after barcode correction.",
96
+ `Q30 Bases in Barcode` = "Fraction of cell barcode bases with Q-score greater than or equal to 30.",
97
+ `Q30 Bases in RNA Read 1` = "Fraction of read 1 bases with Q-score greater than or equal to 30. (Likewise for read 2.)",
98
+ `Q30 Bases in Sample Index` = "Fraction of sample index bases with Q-score greater than or equal to 30.",
99
+ `Q30 Bases in UMI` = "Fraction of UMI bases with Q-score ≥ 30.",
100
+ `Reads Mapped to Any V(D)J Gene` = "Fraction of reads that partially or wholly map to a V(D)J gene segment.",
101
+ `Reads Mapped to TRA` = "Fraction of reads that map partially or wholly to a TRA gene segment.",
102
+ `Mean Used Read Pairs per Cell` = "Mean number of read pairs used in assembly per cell barcode. These reads must have a cell barcode, map to a V(D)J gene, and have a UMI with sufficient read support, counted after subsampling.",
103
+ `Fraction Reads in Cells` = "Number of reads with cell barcodes divided by the number of reads with valid barcodes.",
104
+ `Median TRA UMIs per Cell` = "Median number of UMIs assigned to a TRA contig per cell.",
105
+ `Paired Clonotype Diversity` = "Effective diversity of the paired clonotypes, computed as the Inverse Simpson Index of the clonotype frequencies. A value of 1 indicates a minimally diverse sample - only one distinct clonotype was detected. A value equal to the estimated number of cells indicates a maximally diverse sample.",
106
+ `Cells With TRA Contig` = "Fraction of cell barcodes with at least one TRA contig annotated as a full or partial V(D)J gene.",
107
+ `Cells With CDR3-annotated TRA Contig` = "Fraction of cell barcodes with at least one TRA contig where a CDR3 was detected.",
108
+ `Cells With V-J Spanning Contig` = "Fraction of cell barcodes with at least one full-length contig.",
109
+ `Cells With V-J Spanning TRA Contig` = "Fraction of cell barcodes with at least one full-length TRA contig.",
110
+ `Cells With Productive TRA Contig` = "Fraction of cell barcodes with at least one full-length TRA contig that is productive.",
111
+ `Cells With Productive V-J Spanning Pair` = "Fraction of cell barcodes with at least one contig for each chain of the receptor pair that is productive."
112
+ )
113
+ } else {
114
+ METRIC_DESCR = list(
115
+ `Estimated Number of Cells` = "The number of barcodes associated with cell-containing partitions, estimated from the barcode UMI count distribution.",
116
+ `Mean Reads per Cell` = "The total number of reads divided by the estimated number of cells.",
117
+ `Median Genes per Cell` = "Median number of read pairs sequenced from the cells assigned to this sample. In case of multiplexing, only cell-associated barcodes assigned exactly one CMO can be assigned to a sample.",
118
+ `Number of Reads` = "Total number of sequencing reads.",
119
+ `Valid Barcodes` = "Fraction of reads with cell-barcodes that match the whitelist.",
120
+ `Sequencing Saturation` = 'Fraction of reads originating from an already-observed UMI. This is a function of library complexity and sequencing depth. More specifically, this is a ratio where: the denominator is the number of confidently-mapped reads with a valid cell-barcode and valid UMI, and the numerator is the subset of those reads that had a non-unique combination of (cell-barcode, UMI, gene). This metric was called "cDNA PCR Duplication" in versions of Cell Ranger prior to 1.2.',
121
+ `Q30 Bases in Barcode` = "Fraction of bases with Q-score at least 30 in the cell barcode sequences. This is the i7 index (I1) read for the Single Cell 3' v1 chemistry and the R1 read for the Single Cell 3' v2 chemistry.",
122
+ `Q30 Bases in RNA` = "Fraction of bases with Q-score at least 30 in the RNA read sequences. This is Illumina R1 for the Single Cell 3' v1 chemistry and Illumina R2 for the Single Cell 3' v2 chemistry.",
123
+ `Q30 Bases in UMI` = "Fraction of bases with Q-score at least 30 in the UMI sequences. This is the R2 read for the Single Cell 3' v1 chemistry and the R1 read for the Single Cell 3' v2 chemistry.",
124
+ `Reads Mapped to Genome` = "Fraction of reads that mapped to the genome.",
125
+ `Reads Mapped Confidently to Genome` = "Fraction of reads that mapped uniquely to the genome. If a read mapped to exonic loci from a single gene and also to non-exonic loci, it is considered uniquely mapped to one of the exonic loci.",
126
+ `Reads Mapped Confidently to Intergenic Regions` = "Fraction of reads that mapped to the intergenic regions of the genome with a high mapping quality score as reported by the aligner.",
127
+ `Reads Mapped Confidently to Intronic Regions` = "Fraction of reads that mapped to the intronic regions of the genome with a high mapping quality score as reported by the aligner.",
128
+ `Reads Mapped Confidently to Exonic Regions` = "Fraction of reads that mapped to the exonic regions of the genome with a high mapping quality score as reported by the aligner.",
129
+ `Reads Mapped Confidently to Transcriptome` = "Fraction of reads that mapped to a unique gene in the transcriptome with a high mapping quality score as reported by the aligner. The read must be consistent with annotated splice junctions when include-introns=false. These reads are considered for UMI counting.",
130
+ `Reads Confidently Mapped Antisense` = "Fraction of reads confidently mapped to the transcriptome, but on the opposite strand of their annotated gene. A read is counted as antisense if it has any alignments that are consistent with an exon of a transcript but antisense to it, and has no sense alignments.",
131
+ `Total Genes Detected Median UMI Counts per Cell` = "The number of genes with at least one UMI count in any cell."
132
+ )
133
+ }
134
+ log_info("Plotting metrics ...")
135
+ for (metric in colnames(metrics)) {
136
+ if (metric == "Sample") { next }
137
+ metric_name <- sub(" \\(%\\)$", "", metric)
138
+ log_info("- {metric_name}")
139
+
140
+ add_report(
141
+ list(
142
+ kind = "descr",
143
+ content = METRIC_DESCR[[metric_name]] %||% paste0("Metric: ", metric)
144
+ ),
145
+ h1 = metric
146
+ )
147
+
148
+ # barplot
149
+ p <- ggplot(metrics, aes(x = Sample, y = !!sym(metric))) +
150
+ geom_bar(stat = "identity", fill = "steelblue") +
151
+ labs(x = "Sample", y = metric) +
152
+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
153
+
154
+ figfile <- file.path(outdir, paste0(slugify(metric), ".barplot.png"))
155
+ png(figfile, height = 600, res = 100, width = nrow(metrics) * 30 + 200)
156
+ print(p)
157
+ dev.off()
158
+
159
+ add_report(
160
+ list(src = figfile, name = "By Sample"),
161
+ ui = "table_of_images",
162
+ h1 = metric
163
+ )
164
+
165
+ if (is.null(group)) { next }
166
+ # boxplot, if group is provided
167
+ # group: Sample, Group
168
+ pdata <- group %>%
169
+ left_join(metrics, by = "Sample") %>%
170
+ mutate(Group = factor(Group, levels = unique(Group)))
171
+
172
+ p <- ggplot(pdata, aes(x = Group, y = !!sym(metric))) +
173
+ geom_boxplot(fill = "steelblue") +
174
+ labs(x = "Group", y = metric) +
175
+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
176
+
177
+ figfile <- file.path(outdir, paste0(slugify(metric), ".boxplot.png"))
178
+ png(figfile, height = 600, res = 100, width = length(unique(pdata$Group)) * 30 + 200)
179
+ print(p)
180
+ dev.off()
181
+
182
+ add_report(
183
+ list(src = figfile, name = "By Group"),
184
+ ui = "table_of_images",
185
+ h1 = metric
186
+ )
187
+ }
188
+
189
+ save_report(joboutdir)
@@ -8,7 +8,6 @@ library(dplyr)
8
8
  library(ggplot2)
9
9
  library(ggVennDiagram)
10
10
  library(UpSetR)
11
- library(slugify)
12
11
  library(circlize)
13
12
  library(ComplexHeatmap)
14
13
 
@@ -127,8 +126,8 @@ casename_info <- function(casename, create = FALSE) {
127
126
  casename = casename,
128
127
  section = sec_case_names[1],
129
128
  case = cname,
130
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
131
- case_slug = slugify(cname, tolower = FALSE)
129
+ section_slug = slugify(sec_case_names[1]),
130
+ case_slug = slugify(cname)
132
131
  )
133
132
  out$sec_dir <- file.path(outdir, out$section_slug)
134
133
  if (create) {
@@ -139,7 +138,7 @@ casename_info <- function(casename, create = FALSE) {
139
138
 
140
139
  plot_heatmap <- function(group, meta, case, info, cluster_order_val) {
141
140
  log_info(paste("- Running heatmap for case:", info$casename, "group:", group))
142
- hmfile <- file.path(info$sec_dir, paste0(info$case_slug, ".", slugify(group, tolower = FALSE), ".heatmap.png"))
141
+ hmfile <- file.path(info$sec_dir, paste0(info$case_slug, ".", slugify(group), ".heatmap.png"))
143
142
 
144
143
  # A matrix: 10 × 8 of type int
145
144
  # g3 g6 g0 g1 g7 g5 g4 g8
@@ -435,7 +434,7 @@ do_overlap <- function(section) {
435
434
  stop(paste0("Not enough cases for overlap for section: ", section))
436
435
  }
437
436
 
438
- sec_dir <- file.path(outdir, slugify(section, tolower = FALSE))
437
+ sec_dir <- file.path(outdir, slugify(section))
439
438
  venn_plot <- file.path(sec_dir, "venn.png")
440
439
  venn_p <- ggVennDiagram(overlap_cases, label_percent_digit = 1) +
441
440
  scale_fill_distiller(palette = "Reds", direction = 1) +
@@ -14,7 +14,6 @@ library(future)
14
14
  library(tidyseurat)
15
15
  library(ggVennDiagram)
16
16
  library(UpSetR)
17
- library(slugify)
18
17
 
19
18
  log_info("Setting up EnrichR ...")
20
19
  setEnrichrSite("Enrichr")
@@ -205,8 +204,8 @@ casename_info <- function(casename, create = FALSE) {
205
204
  casename = casename,
206
205
  section = sec_case_names[1],
207
206
  case = cname,
208
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
209
- case_slug = slugify(cname, tolower = FALSE)
207
+ section_slug = slugify(sec_case_names[1]),
208
+ case_slug = slugify(cname)
210
209
  )
211
210
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
212
211
  if (create) {
@@ -12,7 +12,6 @@ library(ggplot2)
12
12
  library(ggprism)
13
13
  library(parallel)
14
14
  library(tidyseurat)
15
- library(slugify)
16
15
 
17
16
  setEnrichrSite("Enrichr")
18
17
 
@@ -133,8 +132,8 @@ casename_info <- function(casename, create = FALSE) {
133
132
  casename = casename,
134
133
  section = sec_case_names[1],
135
134
  case = cname,
136
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
137
- case_slug = slugify(cname, tolower = FALSE)
135
+ section_slug = slugify(sec_case_names[1]),
136
+ case_slug = slugify(cname)
138
137
  )
139
138
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
140
139
  if (create) {
@@ -283,7 +282,7 @@ do_case <- function(casename) {
283
282
  # Plot the top 10 genes in each group with violin plots
284
283
  geneplots <- list()
285
284
  for (gene in markers$gene) {
286
- outfile <- file.path(plotdir, paste0(slugify(gene, tolower = FALSE), ".png"))
285
+ outfile <- file.path(plotdir, paste0(slugify(gene), ".png"))
287
286
  p <- ggplot(df, aes_string(x="GROUP", y=bQuote(gene), fill="GROUP")) +
288
287
  geom_violin(alpha = .8) +
289
288
  geom_boxplot(width=0.1, fill="white") +
@@ -7,7 +7,6 @@ library(tidyr)
7
7
  library(tibble)
8
8
  library(ggplot2)
9
9
  library(ggradar)
10
- library(slugify)
11
10
  library(ggprism)
12
11
 
13
12
  # input/output
@@ -143,8 +142,8 @@ casename_info <- function(casename, create = FALSE) {
143
142
  casename = casename,
144
143
  section = sec_case_names[1],
145
144
  case = cname,
146
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
147
- case_slug = slugify(cname, tolower = FALSE)
145
+ section_slug = slugify(sec_case_names[1]),
146
+ case_slug = slugify(cname)
148
147
  )
149
148
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
150
149
  if (create) {
@@ -4,7 +4,6 @@ source("{{biopipen_dir}}/utils/mutate_helpers.R")
4
4
  library(rlang)
5
5
  library(Seurat)
6
6
  library(tidyseurat)
7
- library(slugify)
8
7
 
9
8
  srtfile <- {{in.srtobj | r}} # nolint
10
9
  outdir <- {{out.outdir | r}} # nolint
@@ -122,8 +121,8 @@ casename_info <- function(casename, create = FALSE) {
122
121
  casename = casename,
123
122
  section = sec_case_names[1],
124
123
  case = cname,
125
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
126
- case_slug = slugify(cname, tolower = FALSE)
124
+ section_slug = slugify(sec_case_names[1]),
125
+ case_slug = slugify(cname)
127
126
  )
128
127
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
129
128
  if (create) {
@@ -64,7 +64,7 @@ if (is.null(hists) || length(hists) == 0) {
64
64
  hists[[name]] <- list_update(hists_defaults, hists[[name]])
65
65
  case <- hists[[name]]
66
66
 
67
- odir <- file.path(outdir, "hists", slugify(name, tolower = FALSE))
67
+ odir <- file.path(outdir, "hists", slugify(name))
68
68
  dir.create(odir, recursive=TRUE, showWarnings=FALSE)
69
69
 
70
70
  h1 <- name
@@ -1,7 +1,6 @@
1
1
  source("{{biopipen_dir}}/utils/misc.R")
2
2
  source("{{biopipen_dir}}/utils/mutate_helpers.R")
3
3
  source("{{biopipen_dir}}/utils/plot.R")
4
- library(slugify)
5
4
  library(Seurat)
6
5
  library(rlang)
7
6
  library(dplyr)
@@ -5,7 +5,6 @@ library(future)
5
5
  library(bracer)
6
6
  library(ggplot2)
7
7
  library(tidyseurat)
8
- library(slugify)
9
8
 
10
9
  metafile = {{in.metafile | quote}}
11
10
  rdsfile = {{out.rdsfile | quote}}
@@ -17,13 +16,17 @@ options(future.globals.maxSize = 80000 * 1024^2)
17
16
  options(Seurat.object.assay.version = "v5")
18
17
  plan(strategy = "multicore", workers = envs$ncores)
19
18
 
19
+ .stringify_list <- function(x) {
20
+ paste(sapply(names(x), function(n) paste(n, x[[n]], sep = " = ") ), collapse = "; ")
21
+ }
22
+
20
23
  add_report(
21
24
  list(
22
25
  kind = "descr",
23
26
  name = "Filters applied",
24
27
  content = paste0(
25
28
  "<p>Cell filters: ", html_escape(envs$cell_qc), "</p>",
26
- "<p>Gene filters: ", html_escape(envs$gene_qc), "</p>"
29
+ "<p>Gene filters: ", html_escape(.stringify_list(envs$gene_qc)), "</p>"
27
30
  )
28
31
  ),
29
32
  h1 = "Filters and QC"
@@ -177,7 +180,7 @@ for (feat in feats) {
177
180
  position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9)
178
181
  ) + scale_color_manual(values = c("#181818", pal_biopipen()(1)), breaks = c(TRUE, FALSE))
179
182
 
180
- vlnplot = file.path(plotsdir, paste0(slugify(feat, tolower = FALSE), ".vln.png"))
183
+ vlnplot = file.path(plotsdir, paste0(slugify(feat), ".vln.png"))
181
184
  png(
182
185
  vlnplot,
183
186
  width = 800 + length(samples) * 15, height = 600, res = 100
@@ -221,7 +224,7 @@ for (feat in setdiff(feats, "nCount_RNA")) {
221
224
  NoLegend() +
222
225
  scale_color_manual(values = c("#181818", pal_biopipen()(1)), breaks = c(TRUE, FALSE))
223
226
 
224
- scatfile = file.path(plotsdir, paste0(slugify(feat, tolower = FALSE), "-nCount_RNA.scatter.png"))
227
+ scatfile = file.path(plotsdir, paste0(slugify(feat), "-nCount_RNA.scatter.png"))
225
228
  png(scatfile, width = 800, height = 600, res = 100)
226
229
  print(scat_p)
227
230
  dev.off()
@@ -302,7 +305,7 @@ if (envs$use_sct) {
302
305
  log_info("- Running SCTransform ...")
303
306
  SCTransformArgs <- envs$SCTransform
304
307
  # log to stdout but don't populate it to running log
305
- print(" SCTransform: {.formatArgs(SCTransformArgs)}")
308
+ print(paste0(" SCTransform: ", .formatArgs(SCTransformArgs)))
306
309
  log_debug(" SCTransform: {.formatArgs(SCTransformArgs)}")
307
310
  SCTransformArgs$object <- sobj
308
311
  sobj <- do_call(SCTransform, SCTransformArgs)
@@ -310,21 +313,21 @@ if (envs$use_sct) {
310
313
  } else {
311
314
  log_info("- Running NormalizeData ...")
312
315
  NormalizeDataArgs <- envs$NormalizeData
313
- print(" NormalizeData: {.formatArgs(NormalizeDataArgs)}")
316
+ print(paste0(" NormalizeData: ", .formatArgs(NormalizeDataArgs)))
314
317
  log_debug(" NormalizeData: {.formatArgs(NormalizeDataArgs)}")
315
318
  NormalizeDataArgs$object <- sobj
316
319
  sobj <- do_call(NormalizeData, NormalizeDataArgs)
317
320
 
318
321
  log_info("- Running FindVariableFeatures ...")
319
322
  FindVariableFeaturesArgs <- envs$FindVariableFeatures
320
- print(" FindVariableFeatures: {.formatArgs(FindVariableFeaturesArgs)}")
323
+ print(paste0(" FindVariableFeatures: ", .formatArgs(FindVariableFeaturesArgs)))
321
324
  log_debug(" FindVariableFeatures: {.formatArgs(FindVariableFeaturesArgs)}")
322
325
  FindVariableFeaturesArgs$object <- sobj
323
326
  sobj <- do_call(FindVariableFeatures, FindVariableFeaturesArgs)
324
327
 
325
328
  log_info("- Running ScaleData ...")
326
329
  ScaleDataArgs <- envs$ScaleData
327
- print(" ScaleData: {.formatArgs(ScaleDataArgs)}")
330
+ print(paste0(" ScaleData: ", .formatArgs(ScaleDataArgs)))
328
331
  log_debug(" ScaleData: {.formatArgs(ScaleDataArgs)}")
329
332
  ScaleDataArgs$object <- sobj
330
333
  sobj <- do_call(ScaleData, ScaleDataArgs)
@@ -333,7 +336,7 @@ if (envs$use_sct) {
333
336
  log_info("- Running RunPCA ...")
334
337
  RunPCAArgs <- envs$RunPCA
335
338
  RunPCAArgs$npcs <- if (is.null(RunPCAArgs$npcs)) { 50 } else { min(RunPCAArgs$npcs, ncol(sobj) - 1) }
336
- print(" RunPCA: {.formatArgs(RunPCAArgs)}")
339
+ print(paste0(" RunPCA: ", .formatArgs(RunPCAArgs)))
337
340
  log_debug(" RunPCA: {.formatArgs(RunPCAArgs)}")
338
341
  RunPCAArgs$object <- sobj
339
342
  sobj <- do_call(RunPCA, RunPCAArgs)
@@ -367,7 +370,7 @@ if (!envs$no_integration) {
367
370
  if (is.null(IntegrateLayersArgs$new.reduction)) {
368
371
  IntegrateLayersArgs$new.reduction <- new_reductions[[method]]
369
372
  }
370
- print(" IntegrateLayers: {.formatArgs(IntegrateLayersArgs)}")
373
+ print(paste0(" IntegrateLayers: ", .formatArgs(IntegrateLayersArgs)))
371
374
  log_debug(" IntegrateLayers: {.formatArgs(IntegrateLayersArgs)}")
372
375
  IntegrateLayersArgs$object <- sobj
373
376
  sobj <- do_call(IntegrateLayers, IntegrateLayersArgs)
@@ -5,7 +5,6 @@ library(tibble)
5
5
  library(enrichR)
6
6
  library(rlang)
7
7
  library(dplyr)
8
- library(slugify)
9
8
  library(ggprism)
10
9
 
11
10
  setEnrichrSite("Enrichr")
@@ -134,8 +133,8 @@ casename_info <- function(casename, create = FALSE) {
134
133
  casename = casename,
135
134
  section = sec_case_names[1],
136
135
  case = cname,
137
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
138
- case_slug = slugify(cname, tolower = FALSE)
136
+ section_slug = slugify(sec_case_names[1]),
137
+ case_slug = slugify(cname)
139
138
  )
140
139
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
141
140
  if (create) {