- Treatment-only PCA and correlation plots: When control samples (IgG) are present, CARLISLE now generates a second set of genome-wide Pearson correlation heatmap and PCA plots (
treatments_only.{dupstatus}.*) that exclude all control replicates. The existing all-sample plots are unchanged. This prevents the large IgG background signal from dominating PC2 and makes treatment-to-treatment differences visible. (#241) - New helper script
_get_pooled_scale.py: Computes pooled control scaling factors using named column access fromalignment_stats.tsv, replacing fragile positional awk column references increate_pooled_control_bedgraph. (#230) - Control-free analysis mode: Support for running peak calling analysis without control samples for MACS2, SEACR, and GoPeaks. Enabled via
run_without_controls: true; in this mode SEACR usesquality_thresholdsvalues as numeric thresholds. (#224, #225, #226) - Documentation versioning: Added mike plugin for version-specific documentation selector with dropdown menu on ReadTheDocs. Automatically injects version selector into all documentation pages.
- Singularity cache configuration: Explicit
SIFCACHEenvironment variable support throughout wrapper script and Snakemake configuration for flexible container storage location management.
- User guide: complete
peaktypereference: Added a table of all six validpeaktypevalues (macs2_narrow,macs2_broad,seacr_stringent,seacr_relaxed,gopeaks_narrow,gopeaks_broad) with descriptions and caller-selection guidance. Clarified that any combination may be listed comma-separated in a single run. - User guide:
run_contrastsparameter documented: Added a dedicated subsection explaining whatrun_contrasts: true/falsecontrols and when differential analysis can be skipped. - User guide:
norm_method: libraryas a valid starting point: Added explicit guidance that spike-in normalization is optional. Users without spike-in DNA can setnorm_method: "library"from the start without any spike-in config blocks. - User guide: sample manifest format and column descriptions: Added TSV format note, paired-end-only warning, and a full column-by-column description table covering
sampleName,replicateNumber,isControl,controlName,controlReplicateNumber,path_to_R1,path_to_R2. Added explicit note thatcontrolNamemust be an exact string match to asampleName. - User guide: control-free manifest example: Added a sample manifest table showing what a control-free (
run_without_controls: true) manifest looks like, since the text previously only described it without showing it. - User guide: multiple contrasts example: Added a multi-row example to the contrast manifest section showing that multiple A-vs-B comparisons can coexist in one
contrasts.tsvfile. - User guide: workflow now includes required edit step: The standard run workflow in
run.mdwas missing the critical step of editingconfig/config.yaml,config/samples.tsv, andconfig/contrasts.tsvafterinit. This step is now explicit, with a table of what to edit in each file. - User guide: dryrun expected output documented: Added an example of what a passing dry run looks like (job stats table) and what
MissingInputException/WorkflowErrorlines indicate, so users can distinguish success from failure. - User guide:
resetvsunlockclearly differentiated:resetis now labeled⚠️ Destructive (deletes all results) andunlockis labeled safe/non-destructive, preventing users from accidentally runningresetwhen they only needunlock. - User guide: job monitoring section added: New section in
run.mdexplaining how to monitor a running job withsqueue -u $USER, watch the Snakemake log, and what email notifications to expect (sent to$USER@nih.gov). - User guide:
deeptools/output directory documented: Added a section inoutput.mddescribing both output sets —all.{dupstatus}.*(all samples) andtreatments_only.{dupstatus}.*(controls excluded) — with explanations of each file, whentreatments_onlyis generated, and why two PCA plots are produced. Addeddeeptools/to the example directory tree. (#241) - User guide: fixed stale version in
--helpexample: Replaced hardcodedv2.7.6path references in thegetting-started.md--helpoutput block with version-neutralX.Y.Zplaceholders, consistent with the--versionblock above it. mkdocs.yml: suppress per-page edit button: Restorededit_uri: ""to suppress the per-page "Edit on GitHub" button in the rendered documentation site. An empty string is the MkDocs convention for disabling this link.
- Pooled control bedgraph: reversed scaling factor columns:
create_pooled_control_bedgraphused$NF(col 11,dedup_nreads_spikein) for LIBRARY and$(NF-1)(col 10,dedup_nreads_genome) for SPIKEIN — exactly swapped. Fixed with named column access via_get_pooled_scale.py. (#230) - Pooled control bedgraph: SPIKEIN used pre-filter read counts: Corrected to
no_dedup_nreads_spikein(fragment-length + mapq filtered, not deduplicated) to match the individual-replicatebam2bgrule. (#230) - Pooled control bedgraph: averaged instead of summed read counts: The merged pooled BAM contains reads from all replicates; its total depth equals the sum of individual counts, not their average. Fixed aggregation. (#230)
- Pooled control bedgraph: spurious dupstatus filter: Old awk filtered
$2 == "{dupstatus}"on a non-existent column, silently dropping all rows.alignment_stats.tsvhas one row per replicate. Filter removed. (#230) - Pooled control outputs stale on norm_method change: Fragment and bedgraph output paths for pooled controls contained no reference to the normalization method, causing Snakemake to silently skip regeneration when
norm_methodchanged in an existing results directory. SEACR received a control bedgraph from the previous normalization run with no warning. Fixed by embeddingNORM_METHODin filenames forcreate_pooled_control_fragments,create_pooled_control_bedgraph, and all downstream consumers (macs2_narrow,macs2_broad,seacr_stringent,seacr_relaxed). GoPeaks rules are unaffected as they consume merged BAM directly. (#232) - Unified bigwig generation via
bamCoverage --scaleFactor: ReplacedbedGraphToBigWiginbam2bgand removed the separatedeeptools_bwrule (which used RPGC normalization). Both browser-track bigwigs and deeptools heatmap/profile inputs now come from a singlebamCoverage --scaleFactorcall, ensuring heatmaps/profiles reflect the same spike-in/library normalization as genome browser tracks.deeptools_prepanddeeptools_matupdated to referencebigwig/instead ofdeeptools/temp/. (#231) - deeptools_prep control-free handling: Fixed rule to use
TREATMENT_WITHOUTCONTROL_LISTin control-free mode instead of emptyTREATMENT_CONTROL_LIST, preventing MissingOutputException. Properly excludes 'nocontrol' sentinel from bigwig file lists. - Differential analysis with nocontrol pairs: Fixed
_control_has_replicate()function in diff.smk to properly handle control-free sentinel values, ensuring control-free pairs are included in individual mode analysis. - Singularity module availability on login node: Fixed runslurm() to load Singularity module before dryrun execution, preventing WorkflowError when submitting to cluster scheduler.
- Singularity prefix configuration consistency: Added explicit
--singularity-prefixto all Snakemake invocations to respect SIFCACHE environment variable settings across all execution modes. - Enhanced error messaging: Improved error messages for file validation and control sample checks in init.smk for clearer troubleshooting.
- Version and module diagnostics: Added print_versions() function to display Snakemake and Singularity versions and added module loading diagnostics to SBATCH scripts for better troubleshooting of cluster execution issues.
- ROSE container: truncated prep script in v1:
Dockerfile.roseused an incorrectCOPYsource path (_prep_rose_input.pyat build-context root) instead ofworkflow/scripts/_prep_rose_input.py, resulting in an empty/truncated file being baked into the image. At runtime this caused aSyntaxError: EOL while scanning string literalin/opt/ROSE/_prep_rose_input.py, failing all ROSE jobs. Fixed in containerccbr_rose:v2. - Peak count outputs overwritten between control/no-control runs:
all.peaks.txtandPeak_counts.xlsxhad fixed names, so running withrun_without_controls: trueafter afalserun (or vice versa) in the same results directory would silently overwrite the previous aggregated counts. Output filenames now encode the run mode:all.peaks.with_control.txt/all.peaks.without_control.txtandPeak_counts.with_control.xlsx/Peak_counts.without_control.xlsx._plot_peak_counts.Rupdated to accept the xlsx path as an optional 3rd argument. - ROSE control BAM passed for nocontrol sentinel: In control-free mode (
run_without_controls: true), theroserule incorrectly constructed--control-bam nocontrol.dedup.bamfor therun-prep-rosecall, causing an immediate failure ([ERROR] control does not exist). Added an explicit check for thenocontrolsentinel so ROSE runs without-cin control-free mode. - ROSE plot text renders as empty boxes (tofu glyphs): All text in
rose_input_Plot_points.png(axis labels, tick marks, title, legend) rendered as empty boxes inccbr_rose:v1andccbr_rose:v2because the container had no font packages installed. Addedfontconfigandfonts-dejavu-coretoDockerfile.roseand rebuilt the font cache at image build time so matplotlib can find DejaVu glyphs at runtime. Also fixed the font-cache rebuild call to useFontManager()(compatible with Python 2.7 /matplotlib<3) rather than_rebuild()which only exists inmatplotlib≥3. Fixed inccbr_rose:v3. (#237) - Spaces removed from all pipeline output filenames: Output filenames containing spaces (e.g.
Peak counts.xlsx) caused argument-splitting failures when passed through Singularity shell layers. All output filenames now use underscores instead of spaces (Peak_counts.with_control.xlsx,Peak_counts.without_control.xlsx). - Snakemake report generation failed after successful run: The post-run
snakemake --reportinvocation in bothrunlocalandrunslurmpassed--singularity-prefixwithout--use-singularity, causing Snakemake 7 to immediately error withError: --use_singularity must be set if --singularity-prefix is set. The report was never generated and the error appeared in the SLURM output even on otherwise successful runs. Fixed by adding--use-singularityto both report-only calls.
- Scheduler-safe Snakemake defaults: Replaced hardcoded
-j 500with safer defaults (-j 100,--max-jobs-per-second 1,--max-status-checks-per-second 0.1) for cluster-friendly submission and status polling behavior. (@kopardev)
- ROSE containerization: Containerized the ROSE workflow, added a dedicated prep script, and simplified dependencies by removing annotation-folder/refseq coupling for supported genomes (
hg19,hg38,mm10). (#215, @kopardev) - GO enrichment workflow split: Separated GO enrichment table generation from dotplot generation to improve rerun behavior and failure isolation. (#215, @kopardev)
- ROSE output streamlining: Reduced ROSE outputs to only required deliverables and adjusted cluster resource requests accordingly. (#215, @kopardev)
- GO enrichment execution hardening: Improved GO enrichment and dotplot logging and scheduling defaults for cluster execution. (#210, #211, #212, #213, #215, @kopardev)
- GO enrichment robustness: Handle empty BED/TSV inputs without hard failure and improve fallback checks in dotplot generation. (#212, #215, @kopardev)
- Dotplot label handling: Fix duplicate wrapped enrichment labels in GO dotplot output. (#215, @kopardev)
- ROSE empty-input handling: Prevent hard failures when ROSE prep receives empty peak inputs. (#215, @kopardev)
- HOMER annotation outputs with control modes: Fix
rule allexpectations to include thecontrol_modesubdirectory for HOMER annotation plots and combined q-value tables, preventing MissingInputException during dryruns. (#209, @kopardev)
- Pooled control mode support: Complete pipeline implementation for pooled control analysis across MACS2, SEACR, GoPeaks, ROSE, HOMER, and differential analysis workflows. Enables comparison of replicate-specific vs merged high-depth controls. (#206, @kopardev)
- ROSE dual control mode: ROSE enhancer analysis now runs separately for both individual and pooled control modes, generating separate super-enhancer calls for each approach. (#206, @kopardev)
- Reference file compression: All reference BED files (blacklists, TSS, gene annotations, cCREs) now stored as
.bed.gzwith automatic decompression during analysis, significantly reducing storage requirements. (#206, @kopardev) - cCRE annotations: Added comprehensive candidate cis-Regulatory Element (cCRE) annotations from ENCODE SCREEN database for all supported genomes (hg38, hg19, mm10, hs1) (#206, @kopardev), including:
- Promoter-like signatures (PLS)
- Proximal enhancer-like signatures (pELS)
- Distal enhancer-like signatures (dELS)
- Chromatin accessibility regions (CA-CTCF, CA-H3K4me3, CA-TF)
- Motif enrichment for DEG peaks: Added HOMER motif discovery and AME motif enrichment analysis specifically for differentially enriched peaks (both AUC-based and fragments-based, for up-regulated peaks in each group). (#206, @kopardev)
- Enhanced differential analysis outputs: Added 3-column BED files for up-regulated peaks in each group (
up_group1.bed,up_group2.bed) for downstream enrichment analyses. (#206, @kopardev) - HOCOMOCO v14 CORE motifs: Added complete HOCOMOCO v14 CORE motif database in both HOMER and MEME formats for comprehensive motif enrichment analysis. (#206, @kopardev)
- Increased resource allocations: Enhanced memory and thread allocation for computationally intensive rules (#206, @kopardev):
- ROSE: 96GB memory, 16 threads
- DESeq2: 96GB memory
- GO enrichment: 32GB memory, 8 threads
- deepTools tasks: Increased memory allocations
- Enhanced GO enrichment: Improved GO enrichment workflow with contrast file support and parallel processing options for better performance. (#206, @kopardev)
- deepTools optimization: Added temporary directory handling and expanded bedtype support for improved coverage analysis. (#206, @kopardev)
- Improved logging and reruns: Better handling of rerun scenarios and enhanced logging throughout the pipeline. (#206, @kopardev)
- ROSE environment isolation: Fixed Python library conflicts between Snakemake and ROSE environments by explicitly managing
PYTHONPATHand unsetting conda variables. (#206, @kopardev) - ROSE chromosome filtering: Properly filter NC_ chromosomes (alternative scaffolds, unplaced contigs) from both treatment and control BAM files before enhancer stitching to prevent analysis failures. (#206, @kopardev)
- BED file decompression: Implemented consistent decompression handling for all compressed BED files across init, alignment, and annotation rules. (#206, @kopardev)
- Fix how singularity bind paths are set. (#187, @kelly-sovacool)
- Fix the DESeq rule when using the hs1 T2T genome. (#187, @kelly-sovacool, @wong-nw)
- Fix incorrect jobby version (needs v0.4). (#194, @kelly-sovacool)
- Fix jobby usage to output stdout/stderr to log file. (#196, @kopardev)
- Fix numpy error. (#198, @kelly-sovacool)
- Fix logic error with scaling factor calcutions. (#195, @kopardev)
- Run MACS2 with control by default. (#195, @kopardev)
- Make sure
submit_slurm.sbatchis not overwritten. (#195, @kopardev) - Handle case when sample names are subsets of each other. (#195, @kopardev)
- Remove deprecated 'ccr' partition. (#176, @kopardev)
- Now depends on ccbr_tools v0.4 for updated jobby & spooker utilities. (#168, @kelly-sovacool)
- Fix driver script: do not try to load the shared conda environment. (#166, @kelly-sovacool)
- Now depends on ccbr_tools v0.4 for updated jobby & spooker utilities. (#168, @kelly-sovacool)
- Minor documentation update to use readthedocs theme. (#162, @kelly-sovacool)
- Fix deprecation warning during initialization. (#163, @kelly-sovacool)
- Documentation improvements. (#154, @kelly-sovacool)
- If jobby & spooker are not available, try adding them to the path on workflow completion. (#155, @kelly-sovacool)
- Fix bug that flipped library normalization scaling factor (#157, @epehrsson)
- Load the module for snakemake v7, but do not specify the minor and patch versions. (#149, @kelly-sovacool)
- Bug fixes for DESeq (#127, @epehrsson)
- Removes single-sample group check for DESeq.
- Increases memory for DESeq.
- Ensures control replicate number is an integer.
- Fixes FDR cutoff misassigned to log2FC cutoff.
- Fixes
no_dedupvariable names in library normalization scripts.
- Fig bug that added nonexistent directories to the singularity bind paths. (#135, @kelly-sovacool)
- Containerize rules that require R (
deseq,go_enrichment, andspikein_assessment) to fix installation issues with common R library path. (#129, @kelly-sovacool)- The
Rlib_dirandRpkg_configconfig options have been removed as they are no longer needed.
- The
- New visualizations: (#132, @epehrsson)
- New rules
cov_correlation,homer_enrich,combine_homer,count_peaks - Add peak caller to MACS2 peak xls filename
- New rules
- New parameters in the config file to make certain rules optional: (#133, @kelly-sovacool)
- GO enrichment is controlled by
run_go_enrichment(default:false) - ROSE is controlled by
run_rose(default:false)
- GO enrichment is controlled by
- New
--singcacheargument to provide a singularity cache dir location. The singularity cache dir is automatically set inside/data/$USER/or$WORKDIR/if--singcacheis not provided. (#143, @kelly-sovacool)
- The singularity version is no longer specified, per request of the biowulf admins. (#139, @kelly-sovacool)
- Minor documentation updates. (#146, @kelly-sovacool)
- Refactors R packages to a common source location (#118, @slsevilla)
- Adds a --force flag to allow for re-initialization of a workdir (#97, @slsevilla)
- Fixes error with testrun in DESEQ2 (#113, @slsevilla)
- Decreases the number of samples being run with testrun, essentially running tinytest as default and removing tinytest as an option (#115, @slsevilla)
- Reads version from VERSION file instead of github repo link (#96, #112, @slsevilla)
- Added a CHANGELOG (#116, @slsevilla)
- Fix: RNA report bug, caused by hard-coding of PC1-3, when only PC1-2 were generated (#104, @slsevilla)
- Minor documentation improvements. (#100, @kelly-sovacool)
- Fix: allow printing the version or help message even if singularity is not in the path. (#110, @kelly-sovacool)
- Add GitHub Action to add issues/PRs to personal project boards by @kelly-sovacool in #95
- Create install script by @kelly-sovacool in #93
- feat: use summits bed for homer input; save temporary files; fix deseq2 bug by @slsevilla in #108
- docs: adding citation and DOI to pipeline by @slsevilla in #107
- Test a dryrun with GitHub Actions by @kelly-sovacool in #94
- Feature- Merged Yue's fork, adding DEEPTOOLS by @slsevilla in #85
- Feature- Added tracking features from SPOOK by @slsevilla in #88
- Feature - Dev test run completed by @slsevilla in #89
- Bug - Fixed bugs related to Biowulf transition
- enhancement
- update gopeaks resources
- change SEACR to run "norm" without spikein controls, "non" with spikein controls
- update docs for changes; provide extra troubleshooting guidance
- fix GoEnrich bug for failed plots
- fix error when contrasts set to "N"
- adjust goenrich resources to be more efficient
- Add a MAPQ filter to samtools (rule align)
- Add GoPeaks MultiQC module
- Allow for library normalization to occur during first pass
- Add --broad-cutoff to MACS2 broad peak calling for MACS2
- Create a spike in QC report
- Reorganize file structure to help with qthreshold folder
- Update variable names of all peak caller
- Merge rules with input/output/wildcard congruency
- Convert the "spiked" variable to "norm_method
- Add name of control used to MACS2 peaks
- Running extra control:sample comparisons that are not needed
- improved resource allocation
- test data originally included 1475 jobs, this version includes 1087 jobs (reduction of 25%) despite including additional features
- moved ~12% of all jobs to local deployment (within SLURM submission)
- merge increases to resources; update workflow img, contributions
- patch for gz bigbed bug
- add broad-cutoff to macs2 broad peaks param settings
- add non.stringent and non.relaxed to annotation options
- merge DESEQ and DESEQ2 rules together
- identify some files as temp
- contains patch for DESEQ error with non hs1 reference samples