#!/usr/bin/perl
=begin -------------------------------------------------------------------------
Generates pipe-delimited txt file on Roche Gallium trial cases for Quintiles.
Record must be authorised to be included in data feed.
=cut ---------------------------------------------------------------------------
use strict;
use warnings;
my $JUST_TESTING = 1; # dump data to file
use lib '/home/raj/perl5/lib/perl5';
use FindBin qw($Bin); # warn $Bin;
use lib "$Bin/../../../lib";
use IO::All;
use Data::Dumper;
use LIMS::Local::ScriptHelpers;
my $tools = LIMS::Local::ScriptHelpers->new();
$tools->test_only($JUST_TESTING);
################################################################################
# my $duration = 7; # over past number of days - retrieving all data
my @recipients = qw(hmds.lth@nhs.net); # send to departmental addr for manual entries
my $filename = sprintf 'BO21223_%s.dat', $tools->time_now->ymd;
my $subject = $filename;
################################################################################
# get tools from LIMS::Local::ScriptHelpers:
my $sql_lib = $tools->sql_lib();
my $config = $tools->config();
my $dbix = $tools->dbix();
# Quintiles test codes => HMDS test_name map:
my %SDL = (
cd3 => 'SDL2110',
cd5 => 'SDL2099',
cd10 => 'SDL2100',
cd20 => 'SDL2101',
cd23 => 'SDL2102',
bcl1 => 'SDL2104', # = Cyclin D1
bcl2 => 'SDL2103',
bcl6 => 'SDL2108',
irf4 => 'SDL2106',
ki67 => 'SDL2109',
fox_p1 => 'SDL2107',
'bcl-2' => 'SDL2115', # FISH
'bcl-6' => 'SDL2116', # FISH
);
my $requests = do {
my $sql = $sql_lib->retr('gallium_trial_data_quintiles'); # warn $sql;
$dbix->query($sql);
};
my @rows;
while ( my $vars = $requests->hash ) { # warn Dumper $vars;
no warnings 'uninitialized'; # loads of 'em
# common fields for all rows:
my @common = (
'Leeds', # referring lab
$vars->{hmds_ref}, # HMDS number
$vars->{accession_number}, # equivalent to QLABS accession number
$vars->{patient_id}, # subject ID
$vars->{dob},
'TISSUE FOR PATH REVIEW',
);
{ # SDL2087: [First Time Reviewer / Adjudicator]
my $result = $vars->{clinical_details} =~ /referred from Kiel/i
? 'Adjudicator' : 'First Time Reviewer';
push @rows, join '|', @common, ( 'SDL2087', $result, undef );
}
{ # SDL2088: [Anatomical localisation of biopsy]
# SDL2090: [Follicular lymphoma grade: 1, 2, 3a, 3b]
# SDL2093: [Pattern of involvement: interstitial, diffuse, etc]
my $comment = $vars->{comment};
# can't extract anatomical site or pattern of involvment yet:
push @rows, join '|', @common, ( 'SDL2088', 'CANCELLED', 'see morphology comment' );
push @rows, join '|', @common, ( 'SDL2093', 'CANCELLED', 'see morphology comment' );
# extract FL grade (1|I|2|II|3|III) - only if FL:
if ( $vars->{diagnosis} =~ /^Follicular lymphoma/ ) { # can't use ICDO3 (DLBCL with FL)
# use case-sensitive regex to capture "grade I" but not "grade is":
my ($grade) = $comment =~ /\b([Gg]rade\s[\d|I+]\w?)\b/; warn Dumper $grade;
if ( my $n = $grade =~ tr/I// ) { # convert Roman to Arabic digits:
$grade =~ s/(I+)/$n/; # $n = count of I's
} warn Dumper $grade;
push @rows, join '|', @common, ( 'SDL2090', lc $grade, undef );
}
}
{ # SDL2089: [Sample quality: Good/Average/Poor]
my $result = $vars->{specimen_quality};
$result =~ s/adequate/good/; # only using adequate & poor
push @rows, join '|', @common, ( 'SDL2089', ucfirst $result, undef );
}
{ # SDL2091: Morphology comment [free text]
my $comment = $vars->{comment};
$comment =~ s/[\n\r]/ /g; # remove new-lines
push @rows, join '|', @common, ( 'SDL2091', $comment, undef );
}
{ # SDL2092: Lymphoma involvement [%]
push @rows, join '|', @common, ( 'SDL2092', 100, undef ); # temp assessment
}
{ # SDL2099 - SDL2110 marker results [+, -, +/-, Not Evaluable]
TEST:
while ( my ($marker, $test_code) = each %SDL ) {
my $result = $vars->{$marker} || next TEST; # 'CANCELLED';
# TODO: might need to examine specimen type for suitability -> comment:
my $comment = $vars->{$marker} ? undef : 'Test not performed';
push @rows, join '|', @common, ( $test_code, $result, $comment );
}
# CD79a / SDL2105 not done:
# push @rows, join '|', @common, ( 'SDL2105', 'CANCELLED', 'Test not performed' );
}
{ # SDL2111: IgH-ASO-PCR [Done / Not Done]
push @rows, join '|', @common, ( 'SDL2111', 'Not Done', undef );
# SDL2112: IgH-ASO-PCR Result [not evaluable, monoclonal, oligoclonal, polyclonal]
# SDL2113: IgH-ASO-PCR Base-pair length [only if monoclonal; numeric]
# SDL2114: IgH-ASO-PCR Comment [free text]
# SDL2115: BCL2 break-apart [Positive, Negative, Not Evaluable]
# SDL2116: BCL6 break-apart [Positive, Negative, Not Evaluable]
# SDL2117: t(14;18) fusion assay [Positive, Negative, Not Evaluable]
# SDL2123: Kappa light chain [+, -, +/-, Not Evaluable]
# SDL2134: Lambda light chain [+, -, +/-, Not Evaluable]
}
{ # SDL2118: FISH comment [free text]
push @rows, join '|', @common, ( 'SDL2118', $vars->{fish_summary}, undef );
}
{ # SDL2094: Final diagnosis
push @rows, join '|', @common, ( 'SDL2094', $vars->{diagnosis}, undef );
}
{ # SDL2095: Discrepancy with local diagnosis [Yes, No]
# SDL2096: Urgent report required [Yes, No]
# SDL2097: Urgent block return required [Yes, No]
1;
}
{ # SDL2098: Insufficient material, retest required [Yes, No]
my $result = $vars->{diagnosis} eq 'Inadequate sample' ? 'Yes' : 'No';
push @rows, join '|', @common, ( 'SDL2098', $result, undef );
}
{ # SDL2125: ICDO3 code
push @rows, join '|', @common, ( 'SDL2094', $vars->{icdo3}, undef );
}
}
exit if ! @rows;
{ # pipe-delimited file:
no warnings 'uninitialized'; # empty fields in @$_:
my $data = join "\n", @rows;
$data > io($filename) if $JUST_TESTING;
my %mail = (
attachment => $data,
filename => $filename, # BO21223_yyyymmdd.dat
subject => $subject,
config => $config,
);
# $tools->send_mail(\%mail, \@recipients);
}
=begin fields:
SDL2086: HMDS
SDL2087: [First Time Reviewer / Adjudicator]
SDL2088: [Anatomical localisation of biopsy: see list]
SDL2089: [Sample quality: Good/Average/Poor]
SDL2090: [Follicular lymphoma grade: 1, 2, 3a, 3b]
SDL2091: Morphology comment [free text]
SDL2092: Lymphoma involvement [%]
SDL2093: Pattern of involvement [interstitial, diffuse, nodular, intrasinusoidal]
SDL2099 - SDL2110 - test results [+, -, +/-, Not Evaluable]
SDL2111: IgH-ASO-PCR [Done / Not Done]
SDL2112: IgH-ASO-PCR Result [not evaluable, monoclonal, oligoclonal, polyclonal]
SDL2113: IgH-ASO-PCR Base-pair length [only if monoclonal; numeric]
SDL2114: IgH-ASO-PCR Comment [free text]
SDL2115: BCL2 break-apart [Positive, Negative, Not Evaluable]
SDL2116: BCL6 break-apart [Positive, Negative, Not Evaluable]
SDL2117: t(14;18) fusion assay [Positive, Negative, Not Evaluable]
SDL2118: FISH comment [free text]
SDL2094: Final diagnosis
SDL2095: Discrepancy with local diagnosis [Yes, No]
SDL2096: Urgent report required [Yes, No]
SDL2097: Urgent block return required [Yes, No]
SDL2098: Insufficient material, retest required [Yes, No]
SDL2125: ICDO3 code
SDL2123: Kappa light chain [+, -, +/-, Not Evaluable]
SDL2134: Lambda light chain [+, -, +/-, Not Evaluable]
9-field data file:
1: HMDS
2: HMDS_ref [optional]
3: accession number ie pc.unit_number
4: Patient ID [optional]
5: DoB [optional]
6: Visit description [optional]
7: QLAB test code ie SDLxxxx
8: Test result [or CANCELLED + comment in next field]
9: Comment [only for cancelled results]
=cut