package LIMS::Model::HMRN::Data;
use Moose::Role;
requires 'patient_id';
use Data::Dumper;
# ------------------------------------------------------------------------------
# all diagnoses with ICDO3 designation for this patient (NB includes /1, /3, /6):
sub all_icdo3_diagnoses {
my $self = shift;
my $patient_id = $self->patient_id;
my @tables = qw( patients diagnoses );
my $relationships = $self->get_relationships(\@tables);
my %args = (
query => [
patient_id => $patient_id,
'request_report.diagnosis.icdo3' => { ne => undef }, # icdo3 col not null
],
require_objects => $relationships,
);
my $data = LIMS::DB::Request::Manager->get_requests(%args);
return $data;
}
# ------------------------------------------------------------------------------
sub event_dates {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = q!select t2.description, t1.date from hmrn.patient_event t1
join hmrn.events t2 on t1.event_id = t2.id where patient_id = ?!;
my $events = $dbix->query($sql, $patient_id)->hashes; # warn Dumper $events;
for (@$events) {
my $event = $_->{description};
my $date = $self->inflate_mysql_date_to_datetime($_->{date});
$data->{event_dates}{$event} = $date;
}
}
# ------------------------------------------------------------------------------
sub mdt_dates {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = q!select id, date from hmrn.patient_mdt_dates where
patient_id = ? order by date!;
my $dates = $dbix->query($sql, $patient_id);
while ( my $vals = $dates->hash ) { # inflate 'date' val to DT object:
$self->inflate_mysql_dates_to_datetime($vals, ['date']);
push @{ $data->{mdt_dates} }, $vals;
}
}
# ------------------------------------------------------------------------------
sub antecedent_events {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
{ # antecedent_events:
my $sql = q!select event_id from hmrn.patient_antecedent where patient_id = ?!;
my $event_id = $dbix->query($sql, $patient_id)->list;
$data->{antecedent}{event_id} = $event_id;
}
{ # previous radio- & chemo-therapies:
my $sql = q!select therapy from hmrn.patient_prior_therapies where patient_id = ?!;
my $tx = $dbix->query($sql, $patient_id)->flat; # warn Dumper $tx;
my %data = map { $_ => 1 } @$tx; # warn Dumper \%data;
$data->{antecedent}{prior_tx} = \%data; # part of antecedent/prior tx set
}
}
# ------------------------------------------------------------------------------
sub treatment {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = $self->sql_lib->retr('hmrn_patient_treatment_data');
my $tx = $dbix->query($sql, $patient_id);
while ( my $vals = $tx->hash ) { # warn Dumper $vals; # dates to datetime:
$self->inflate_mysql_dates_to_datetime($vals, [ qw(start_date end_date) ]);
push @{ $data->{treatments} }, $vals; # add to treaments array
}
}
# ------------------------------------------------------------------------------
sub data_params {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = $self->sql_lib->retr('hmrn_all_patient_params');
my $query = $dbix->query($sql, $patient_id);
while ( my $vals = $query->hash ) {
my $param_name = $vals->{param_name};
my $category = $vals->{category};
$data->{params}{$category}{$param_name} = $vals->{result};
}
}
# ------------------------------------------------------------------------------
# which dataset(s) do we have - skip 'promiscuous' params & autoincrement category counter:
sub dataset_type {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = $self->sql_lib->retr('hmrn_non_unique_params');
my @non_unique_params = $dbix->query($sql)->flat;
my $param_data = $data->{params};
CATEGORY: # for each category (precursor, myeloid, etc):
while ( my($category, $ref) = each %$param_data ) {
PARAM: # for each data param (albumin, Hb, etc):
while ( my ($param, $result) = each %$ref ) {
# skip any params shared by >1 category:
next PARAM if grep $param eq $_, @non_unique_params;
# increment category_has_data count for category:
$data->{category_has_data}{$category}++;
}
} # warn Dumper \$data;
}
# ------------------------------------------------------------------------------
sub imaging_data {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
{ # imaging events:
my $query = $dbix->select('hmrn.patient_imaging_event',
[ qw(id scan_type dataset stage date) ],
{ patient_id => $patient_id } );
while ( my ($id, $scan_type, $dataset, $stage, $date) = $query->list ) {
my %h = (
event_id => $id,
stage => $stage,
date => $date,
);
$self->inflate_mysql_dates_to_datetime(\%h, ['date']);
$data->{imaging}{$scan_type}{$dataset}{$_} = $h{$_} for keys %h;
}
}
{ # imaging sites:
my $sql = $self->sql_lib->retr('hmrn_patient_imaging');
my $query = $dbix->query($sql, $patient_id);
while ( my ($scan_type, $dataset, $option_id) = $query->list ) {
$data->{imaging}{$scan_type}{$dataset}{site_opts}{$option_id}++;
}
}
{ # other (free-text) details:
my $sql = q!select scan_type, dataset, details from
hmrn.patient_imaging_other io join hmrn.patient_imaging_event ie on
io.imaging_event_id = ie.id where ie.patient_id = ?!;
my $query = $dbix->query($sql, $patient_id);
while ( my ($scan_type, $dataset, $detail) = $query->list ) {
$data->{imaging}{$scan_type}{$dataset}{other} = $detail;
}
}
{ # SUV & deauville data - only exists for pet scan:
my $sql = q!select scan_type, dataset, param, result from
hmrn.patient_pet_score ps join hmrn.patient_imaging_event ie on
ps.imaging_event_id = ie.id where ie.patient_id = ?!;
my $query = $dbix->query($sql, $patient_id);
while ( my ($scan_type, $dataset, $param, $result) = $query->list ) {
$data->{imaging}{$scan_type}{$dataset}{$param} = $result;
}
}
}
# ------------------------------------------------------------------------------
sub comments {
my $self = shift;
my $data = shift;
my $patient_id = $self->patient_id;
my $dbix = $self->lims_dbix;
my $sql = 'select * from hmrn.patient_comments where patient_id = ?';
my $comment = $dbix->query($sql, $patient_id)->hash;
$self->inflate_mysql_timestamp_to_datetime($comment, ['timestamp']);
$data->{params}{comment} = $comment;
}
# ------------------------------------------------------------------------------
# calculated indices (IPI, FLIPI, HIPI, etc):
sub calculated_indices {
my $self = shift;
my $data = shift; # warn Dumper $data;
my $patient_id = $self->patient_id;
# use initial CT scan data for staging:
if ( my $initial_scan = $data->{imaging}->{ct}->{1} ) { # warn Dumper $initial_scan;
my %args = (
patient_id => $patient_id,
params_data => $data->{params},
initial_scan => $initial_scan,
option_maps => $data->{maps},
); # warn Dumper $data->{params};
# all calculations handled by Model::HMRN::PrognosticIndicator:
my $indices = $self->prognostic_indicators(\%args);
$data->{params}{indices} = $indices; # warn Dumper $indices;
}
}
1;