From 2f859d44cdd5857c87ae1d5cea5afe5626f4848c Mon Sep 17 00:00:00 2001 From: Marina Gourtovaia Date: Fri, 30 Aug 2019 16:23:46 +0100 Subject: [PATCH 1/3] script to move NovaSeq runs for a particular study on completion of analysis straight to archival --- MANIFEST | 1 + bin/npg_mqc_skipper | 249 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100755 bin/npg_mqc_skipper diff --git a/MANIFEST b/MANIFEST index 9e994a467..b1582d40d 100644 --- a/MANIFEST +++ b/MANIFEST @@ -7,6 +7,7 @@ bin/reformat_fluidigm_snp26_results_irods.pl bin/qc bin/qc_db_delete_autoqc bin/mqc_outcome_reporter +bin/npg_mqc_skipper bin/npg_qc_autoqc_data.pl bin/npg_qc_illumina_analysis_loader bin/npg_qc_tag_sniff.pl diff --git a/bin/npg_mqc_skipper b/bin/npg_mqc_skipper new file mode 100755 index 000000000..9de631de2 --- /dev/null +++ b/bin/npg_mqc_skipper @@ -0,0 +1,249 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use FindBin qw($Bin); +use lib ( -d "$Bin/../lib/perl5" ? "$Bin/../lib/perl5" : "$Bin/../lib" ); +use Getopt::Long; +use Pod::Usage; +use Log::Log4perl qw(:levels); +use DBI; +use Readonly; +use Try::Tiny; +use Carp; + +use npg_tracking::Schema; +use WTSI::DNAP::Warehouse::Schema; + +our $VERSION = '0'; + +Readonly::Scalar my $EXCLUDE_STUDY_NAME => 'Illumina Controls'; +Readonly::Scalar my $NUM_DISTINCT_STUDIES => 1; +Readonly::Scalar my $RUN_STATUS_FROM => 'qc review pending'; +Readonly::Scalar my $RUN_STATUS_TO => 'archival pending'; +Readonly::Scalar my $INSTRUMENT_MODEL => 'NovaSeq'; + +my $dry_run = 1; +my $study_name; + +GetOptions('dry_run|dry-run!' => \$dry_run, + 'study_name=s' => \$study_name, + 'help' => sub { + pod2usage(-verbose => 2, + -exitval => 0) + }); + +my $layout = '%d %-5p %c - %m%n'; +Log::Log4perl->easy_init({layout => $layout, + level => $INFO, + utf8 => 1}); + +my $logger = Log::Log4perl->get_logger(); + +if (not $study_name) { + $logger->fatal('Study name should be given, use --study_name option'); + exit 1; +} + +my $tracking_schema = npg_tracking::Schema->connect(); +my @rows = $tracking_schema->resultset('Run')->search( + {'run_statuses.iscurrent' => 1, + 'run_status_dict.description' => $RUN_STATUS_FROM, + 'instrument_format.model' => $INSTRUMENT_MODEL}, + {prefetch => [{'run_statuses' => 'run_status_dict'}, 'instrument_format']} + )->all(); +if (!@rows) { + $logger->info("No $INSTRUMENT_MODEL runs with status $RUN_STATUS_FROM"); + exit 0; +} + +my @run_ids = map { $_->id_run } @rows; +my $placeholders = join q[,], map { q[?] } @run_ids; + +my $dbh = WTSI::DNAP::Warehouse::Schema->connect->storage->dbh; +my $query = + q[select p.id_run, count(distinct s.id_study_lims) as study_count ] . + q[from iseq_product_metrics p ] . + q[join iseq_flowcell f on p.id_iseq_flowcell_tmp=f.id_iseq_flowcell_tmp ] . + q[join study s on s.id_study_tmp=f.id_study_tmp ] . + qq[where s.name = ? and s.name != ? and p.id_run in (${placeholders}) ] . + q[group by p.id_run having study_count = ?]; +my $sth = $dbh->prepare($query) or croak "Failed to prepare statement: $DBI::errstr"; +# Run time database errors are thrown by the execute method, no need to +# do anything special. +$sth->execute($study_name, $EXCLUDE_STUDY_NAME, @run_ids, $NUM_DISTINCT_STUDIES); + +@run_ids = (); +while (my @data = $sth->fetchrow_array()) { + push @run_ids, $data[0]; +} + +if (@run_ids) { + $logger->info(join qq[\n\t], q[], + qq[Study '$study_name'], + qq[runs to move from '$RUN_STATUS_FROM' to '$RUN_STATUS_TO':], + join q[, ], @run_ids); +} else { + $logger->info("No runs to move for study '$study_name'"); + exit 0; +} + +if ($dry_run) { + $logger->info('DRY RUN mode, not changing run statuses'); + exit 0; +} + +my $rs = $tracking_schema->resultset('Run')->search({id_run => \@run_ids}); +while (my $row = $rs->next()) { + + my $id_run= $row->id_run; + + my $transaction = sub { + # It's been some time since we received the listing of + # potentially eligible runs, let's double check the + # current status of the run. + my $cs = $row->current_run_status_description; + if ($cs eq $RUN_STATUS_FROM) { + $row->update_run_status($RUN_STATUS_TO); + $cs = $RUN_STATUS_TO; + } + return $cs; + }; + + my $new_status; + my $error; + try { + $new_status = $tracking_schema->txn_do($transaction); + } catch { + $error = $_; + }; + + if ($error) { + my $m = "Failed to update status of run ${id_run}: $error"; + if ($error =~ /Rollback failed/smx) { + $logger->fatal($m); + exit 1; + } else { + $logger->error($m); + } + } else { + my $m = "Status of run $id_run has been changed to '$new_status'"; + if ($new_status eq $RUN_STATUS_TO) { + # We take the credit for changing the status, at least + # the new status is what we wanted to change to. + $logger->info($m); + } else { + # Somebody else has changed the status, and it's now not + # what we wanted it to be. No further action. + $logger->warn($m . ' outside of this script'); + } + } +} + +exit 0; + +__END__ + +=head1 NAME + +npg_mqc_skipper + +=head1 USAGE + +=head1 REQUIRED ARGUMENTS + + Study name as --study_name + +=head1 OPTIONS + +=over + +=item --study_name + +=item --dry_run or --dry-run and --no-dry_run and --no-dry-run + +=back + +=head1 EXIT STATUS + +0 if run is deletable, 1 otherwise + +=head1 CONFIGURATION + +=head1 SYNOPSIS + +npg_mqc_skipper --study_name 'SOME STUDY' # runs in dry run mode +npg_mqc_skipper --study_name 'SOME STUDY' --no-dry_run + +=head1 DESCRIPTION + +In dry run mode this script identifies and reports runs having +'qc review pending' status where all samples apart from controls +belong to the study given as the --study_name argument. + +In non-dry run mode the status of this runs is changed to +'archival pending', ie the manual QC stage of the run life cycle +is skipped. + +=head1 SUBROUTINES/METHODS + +=head1 DIAGNOSTICS + +=head1 CONFIGURATION AND ENVIRONMENT + +=head1 DEPENDENCIES + +=over + +=item strict + +=item warnings + +=item lib + +=item FindBin + +=item Carp + +=item Log::Log4perl + +=item Getopt::Long + +=item Pod::Usage + +=item DBI + +=item Readonly + +=item Try::Tiny + +=item npg_tracking::Schema + +=item WTSI::DNAP::Warehouse::Schema + +=back + +=head1 INCOMPATIBILITIES + +=head1 BUGS AND LIMITATIONS + +=head1 AUTHOR + +Marina Gourtovaia + +=head1 LICENSE AND COPYRIGHT + +Copyright (C) 2019 Genome Research Limited + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . From 22ef6dd5209e8251ef18cc9687cf47829408d35b Mon Sep 17 00:00:00 2001 From: Carol Scott Date: Wed, 11 Sep 2019 17:07:01 +0100 Subject: [PATCH 2/3] change default file type to cram for bam_flagstats --- Changes | 2 ++ lib/npg_qc/autoqc/checks/bam_flagstats.pm | 2 +- t/60-autoqc-checks-bam_flagstats.t | 22 +++++++++---------- t/data/autoqc/bam_flagstats/16960_1_0.tar.gz | Bin 3751 -> 3824 bytes 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Changes b/Changes index ac64b7e91..5ebf5c240 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ LIST OF CHANGES FOR NPG-QC PACKAGE + - change default file type to cram for bam_flagstats + release 67.1.0 - if DO_NOT_USE reference selected don't run VerifyBamID but provide explanatory comment in json output file diff --git a/lib/npg_qc/autoqc/checks/bam_flagstats.pm b/lib/npg_qc/autoqc/checks/bam_flagstats.pm index 9b0222e11..e4dca4f4c 100644 --- a/lib/npg_qc/autoqc/checks/bam_flagstats.pm +++ b/lib/npg_qc/autoqc/checks/bam_flagstats.pm @@ -38,7 +38,7 @@ Readonly::Scalar my $TARGET_STATS_PATTERN => 'target'; Readonly::Scalar my $TARGET_AUTOSOME_STATS_PATTERN => 'target_autosome'; Readonly::Scalar my $TARGET_STATS_DEFAULT_DEPTH => 15; Readonly::Scalar my $STATS_FILTER => '[[:alnum:]]+[\_[:lower:]]*?'; -Readonly::Scalar our $EXT => q[bam]; +Readonly::Scalar our $EXT => q[cram]; has '+subset' => ( isa => 'Str', ); diff --git a/t/60-autoqc-checks-bam_flagstats.t b/t/60-autoqc-checks-bam_flagstats.t index 7746f51ba..ee09ed55d 100644 --- a/t/60-autoqc-checks-bam_flagstats.t +++ b/t/60-autoqc-checks-bam_flagstats.t @@ -43,8 +43,8 @@ subtest 'high-level parsing' => sub { my $dups = "$data_dir/4783_5_metrics_optical.txt"; my $fstat = "$data_dir/4783_5.flagstat"; - my $bam = "$data_dir/4783_5.bam"; - open my $fh, '>', $bam or die "Failed to open $bam: $!\n"; + my $cram = "$data_dir/4783_5.cram"; + open my $fh, '>', $cram or die "Failed to open $cram: $!\n"; close $fh; my $c = npg_qc::autoqc::checks::bam_flagstats->new( @@ -89,8 +89,8 @@ subtest 'high-level parsing, no markdup metrics' => sub { plan tests => 10; my $fstat = "$data_dir/24135_1#1.flagstat"; - my $bam = "$data_dir/24135_1#1.bam"; - open my $fh, '>', $bam or die "Failed to open $bam: $!\n"; + my $cram = "$data_dir/24135_1#1.cram"; + open my $fh, '>', $cram or die "Failed to open $cram: $!\n"; close $fh; my $c = npg_qc::autoqc::checks::bam_flagstats->new( @@ -151,17 +151,17 @@ subtest 'finding files, calculating metrics' => sub { id_run => 16960, position => 1, tag_index => 0, - input_files => [$fproot . '.bam'], + input_files => [$fproot . '.cram'], related_results => [], ); my $r2 = npg_qc::autoqc::checks::bam_flagstats->new( - input_files => [$fproot . '.bam'], + input_files => [$fproot . '.cram'], rpt_list => '16960:1:0', related_results => [], ); my $r3 = npg_qc::autoqc::checks::bam_flagstats->new( - input_files => [$fproot . '.bam'], + input_files => [$fproot . '.cram'], rpt_list => '16960:1:0;16960:2:0', related_results => [], ); @@ -197,10 +197,10 @@ subtest 'finding files, calculating metrics' => sub { id_run => 16960, position => 1, tag_index => 0, - input_files => [$fproot . '.bam'], + input_files => [$fproot . '.cram'], ); - my $bam_md5 = join q[.], $r->_sequence_file, 'md5'; - throws_ok {$r->execute} qr{Can't open '$bam_md5'}, + my $cram_md5 = join q[.], $r->_sequence_file, 'md5'; + throws_ok {$r->execute} qr{Can't open '$cram_md5'}, 'error calling execute() on related objects'; }; @@ -210,7 +210,7 @@ subtest 'finding phix subset files' => sub { my $fproot = $archive_16960 . '/16960_1#0_phix'; my $r = npg_qc::autoqc::checks::bam_flagstats->new( - input_files => [$fproot . '.bam'], + input_files => [$fproot . '.cram'], related_results => [], rpt_list => '16960:1:0', subset => 'phix', diff --git a/t/data/autoqc/bam_flagstats/16960_1_0.tar.gz b/t/data/autoqc/bam_flagstats/16960_1_0.tar.gz index 9cf9272559e3e9d47deb5826891a6c3c789e6521..1a344490584973b8c4c41c7a45e3c34d2e4c56bc 100644 GIT binary patch literal 3824 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 R<99^t315sILkI)Ie*oFmdD8#@ literal 3751 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 coHq)$ From 61154db7c0063cf2ff720095c7f22701ce7aaa03 Mon Sep 17 00:00:00 2001 From: jmtcsngr Date: Fri, 20 Sep 2019 16:57:07 +0100 Subject: [PATCH 3/3] update Changes --- Changes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changes b/Changes index 5ebf5c240..0ad4febc6 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ LIST OF CHANGES FOR NPG-QC PACKAGE +release 67.2.0 + - script to move NovaSeq runs for a particular study - change default file type to cram for bam_flagstats release 67.1.0